[adios] 01/04: upstream 1.9.0

Alastair McKinstry mckinstry at moszumanska.debian.org
Tue Aug 18 15:58:33 UTC 2015


This is an automated email from the git hooks/post-receive script.

mckinstry pushed a commit to branch debian/master
in repository adios.

commit 59359428cdca9eb8994b6acec6623e94c8c0d7a7
Author: Alastair McKinstry <mckinstry at debian.org>
Date:   Fri Aug 14 08:17:47 2015 +0100

    upstream 1.9.0
---
 CMakeLists.txt                                     |    69 +-
 INSTALL                                            |     4 +-
 Makefile.am                                        |     3 +-
 Makefile.in                                        |    11 +-
 NEWS                                               |    22 +
 adios_config.flags.cmake                           |    39 +
 cmake_init                                         |     4 +-
 config.h.cmake                                     |     9 -
 config.h.in                                        |     9 -
 config/ac_dataspaces.m4                            |     6 +-
 config/ac_fastbit.m4                               |     2 +-
 configure                                          |   384 +-
 configure.ac                                       |    52 +-
 examples/C/Makefile.in                             |     3 +
 examples/C/arrays/CMakeLists.txt                   |     1 +
 examples/C/arrays/Makefile.am                      |     2 +-
 examples/C/arrays/Makefile.in                      |     7 +-
 examples/C/attributes/CMakeLists.txt               |     1 +
 examples/C/attributes/Makefile.am                  |     2 +-
 examples/C/attributes/Makefile.in                  |     7 +-
 examples/C/attributes/attributes_read.c            |    37 +-
 examples/C/flexpath_arrays/Makefile.in             |     3 +
 .../global_range_select/CMakeLists.txt             |     1 +
 .../global_range_select/Makefile.am                |     2 +-
 .../global_range_select/Makefile.in                |     7 +-
 .../flexpath_arrays/process_select/CMakeLists.txt  |     1 +
 .../C/flexpath_arrays/process_select/Makefile.am   |     2 +-
 .../C/flexpath_arrays/process_select/Makefile.in   |     7 +-
 examples/C/global-array-time/CMakeLists.txt        |     1 +
 examples/C/global-array-time/Makefile.am           |     2 +-
 examples/C/global-array-time/Makefile.in           |     7 +-
 examples/C/global-array/CMakeLists.txt             |     1 +
 examples/C/global-array/Makefile.am                |     2 +-
 examples/C/global-array/Makefile.in                |     7 +-
 examples/C/global-array/adios_global.xml           |     2 +-
 examples/C/global-array/no_xml_write_byid.c        |    24 +-
 examples/C/icee_arrays/Makefile.in                 |     3 +
 examples/C/icee_arrays/array/CMakeLists.txt        |     1 +
 examples/C/icee_arrays/array/Makefile.am           |     2 +-
 examples/C/icee_arrays/array/Makefile.in           |     7 +-
 examples/C/manual/CMakeLists.txt                   |     1 +
 examples/C/manual/Makefile.am                      |     2 +-
 examples/C/manual/Makefile.in                      |     7 +-
 examples/C/query/CMakeLists.txt                    |     1 +
 examples/C/query/Makefile.am                       |     2 +-
 examples/C/query/Makefile.in                       |     7 +-
 examples/C/read_all/CMakeLists.txt                 |     1 +
 examples/C/read_all/Makefile.am                    |     2 +-
 examples/C/read_all/Makefile.in                    |     7 +-
 examples/C/scalars/CMakeLists.txt                  |     1 +
 examples/C/scalars/Makefile.am                     |     2 +-
 examples/C/scalars/Makefile.in                     |     7 +-
 examples/C/schema/CMakeLists.txt                   |     1 +
 examples/C/schema/Makefile.am                      |     2 +-
 examples/C/schema/Makefile.in                      |     7 +-
 examples/C/stat/CMakeLists.txt                     |     1 +
 examples/C/stat/Makefile.am                        |     2 +-
 examples/C/stat/Makefile.in                        |     7 +-
 examples/C/transforms/CMakeLists.txt               |     1 +
 examples/C/transforms/Makefile.am                  |     2 +-
 examples/C/transforms/Makefile.in                  |     8 +-
 examples/Fortran/Makefile.in                       |     3 +
 examples/Fortran/arrays/CMakeLists.txt             |     2 +-
 examples/Fortran/arrays/Makefile.am                |     2 +-
 examples/Fortran/arrays/Makefile.in                |     6 +-
 examples/Fortran/global-array-time/CMakeLists.txt  |     2 +-
 examples/Fortran/global-array-time/Makefile.am     |     2 +-
 examples/Fortran/global-array-time/Makefile.in     |     6 +-
 examples/Fortran/global-array/CMakeLists.txt       |     2 +-
 examples/Fortran/global-array/Makefile.am          |     2 +-
 examples/Fortran/global-array/Makefile.in          |     6 +-
 .../Fortran/global-array/no_xml_write_byid.F90     |    21 +
 examples/Fortran/scalars/CMakeLists.txt            |     2 +-
 examples/Fortran/scalars/Makefile.am               |     2 +-
 examples/Fortran/scalars/Makefile.in               |     6 +-
 examples/Fortran/schema/CMakeLists.txt             |     2 +-
 examples/Fortran/schema/Makefile.am                |     2 +-
 examples/Fortran/schema/Makefile.in                |     6 +-
 examples/Makefile.in                               |     3 +
 examples/coupling/coupling_reader_2D.F90           |     4 +-
 examples/coupling/coupling_writer_2D.F90           |     4 +-
 examples/staging/stage_write/genarray_stream.F90   |     4 +-
 .../stage_write_varyingsize/decompose_block.o      |   Bin 0 -> 9968 bytes
 .../stage_write_varyingsize/genarray_varying       |   Bin 0 -> 5254828 bytes
 .../stage_write_varyingsize/genarray_varying.F90   |     4 +-
 .../stage_write_varyingsize/genarray_varying.o     |   Bin 0 -> 92096 bytes
 .../genarray_varying_comm.mod                      |   122 +
 .../staging/stage_write_varyingsize/stage_write    |   Bin 0 -> 4501675 bytes
 .../staging/stage_write_varyingsize/stage_write.o  |   Bin 0 -> 55448 bytes
 examples/staging/stage_write_varyingsize/utils.o   |   Bin 0 -> 23680 bytes
 runconf                                            |    68 +-
 src/CMakeLists.txt                                 |     5 +-
 src/Makefile.am                                    |    38 +-
 src/Makefile.in                                    |  1207 +-
 src/core/adios.c                                   |    19 +-
 src/core/adios_bp_v1.c                             |   248 +-
 src/core/adios_bp_v1.h                             |    17 +-
 src/core/adios_internals.c                         |   520 +-
 src/core/adios_internals.h                         |    33 +-
 src/core/adios_internals_mxml.c                    |   165 +-
 src/core/adios_logger.h                            |     8 +
 src/core/adios_read.c                              |    10 +
 src/core/adios_read_hooks.c                        |    15 +-
 src/core/adios_transport_hooks.c                   |    17 +-
 src/core/adios_transport_hooks.h                   |     4 +-
 src/core/adiosf.c                                  |   110 +-
 src/core/adiosf_defs_mod.f90                       |     2 +
 src/core/adiosf_write_mod.f90                      |   290 +-
 src/core/bp_types.h                                |    13 +-
 src/core/bp_utils.c                                |   238 +-
 src/core/bp_utils.h                                |     7 +-
 src/core/common_adios.c                            |   213 +-
 src/core/common_adios.h                            |     5 +-
 src/core/common_read.c                             |   214 +-
 src/core/common_read.h                             |     3 +
 src/core/transforms/adios_transforms_common.c      |     4 +-
 src/core/transforms/adios_transforms_write.c       |    21 +-
 src/core/util.c                                    |    38 +
 src/core/util.h                                    |     6 +
 src/public/adios.h                                 |    16 +-
 src/public/adios_link.h                            |    28 +
 src/public/adios_read_ext.h                        |    94 +-
 src/public/adios_read_v1.h                         |     1 +
 src/public/adios_read_v2.h                         |    53 +-
 src/public/adios_schema.h                          |    18 +-
 src/public/adios_selection.h                       |    25 +-
 src/public/adios_types.h                           |     4 +
 src/public/adios_version.h                         |    41 +
 src/public/adios_version.h.in                      |    41 +
 src/query/common_query.c                           |    46 +-
 src/query/fastbit_adios.c                          |   295 +-
 src/query/fastbit_adios.h                          |    29 +-
 src/query/query_alac.c                             |    83 +-
 src/query/query_fastbit.c                          |  2234 +-
 src/query/query_utils.c                            |     7 +
 src/query/query_utils.h                            |     3 +-
 src/read/read_bp.c                                 |    84 +-
 src/read/read_bp_staged.c                          |     6 +-
 src/read/read_dataspaces.c                         |     2 +
 src/read/read_dimes.c                              |     2 +
 src/read/read_flexpath.c                           |   642 +-
 src/read/read_icee.c                               |     3 +-
 src/transforms/adios_transform_alacrity_write.c    |     4 +-
 src/transforms/adios_transform_aplod_write.c       |     4 +-
 src/transforms/adios_transform_bzip2_write.c       |     4 +-
 src/transforms/adios_transform_isobar_write.c      |     4 +-
 src/transforms/adios_transform_szip_write.c        |     4 +-
 src/transforms/adios_transform_template_write.c    |     4 +-
 src/transforms/adios_transform_zlib_write.c        |     4 +-
 src/write/adios_dataspaces.c                       |    10 +-
 src/write/adios_datatap.c                          |     2 +-
 src/write/adios_dimes.c                            |    10 +-
 src/write/adios_flexpath.c                         |   345 +-
 src/write/adios_icee.c                             |     4 +-
 src/write/adios_mpi.c                              |    40 +-
 src/write/adios_mpi_amr.c                          |   458 +-
 src/write/adios_mpi_bgq.c                          |   155 +-
 src/write/adios_mpi_lustre.c                       |    61 +-
 src/write/adios_nc4.c                              |    26 +-
 src/write/adios_nssi.c                             |     2 +-
 src/write/adios_phdf5.c                            |    26 +-
 src/write/adios_posix.c                            |   110 +-
 src/write/adios_posix1.c                           |    27 +-
 src/write/adios_var_merge.c                        |    34 +-
 tests/C/CMakeLists.txt                             |     1 +
 tests/C/Makefile.am                                |     2 +-
 tests/C/Makefile.in                                |     7 +-
 tests/C/fgr_tests/CMakeLists.txt                   |     1 +
 tests/C/fgr_tests/Makefile.am                      |     2 +-
 tests/C/fgr_tests/Makefile.in                      |     7 +-
 .../C/flexpath_tests/1D_arr_global/CMakeLists.txt  |     1 +
 tests/C/flexpath_tests/1D_arr_global/Makefile.am   |     2 +-
 tests/C/flexpath_tests/1D_arr_global/Makefile.in   |     8 +-
 .../1D_arr_global_noxml/CMakeLists.txt             |     1 +
 .../flexpath_tests/1D_arr_global_noxml/Makefile.am |     2 +-
 .../flexpath_tests/1D_arr_global_noxml/Makefile.in |     8 +-
 tests/C/flexpath_tests/Makefile.in                 |     3 +
 .../global_range_select/CMakeLists.txt             |     1 +
 .../flexpath_tests/global_range_select/Makefile.am |     2 +-
 .../flexpath_tests/global_range_select/Makefile.in |     8 +-
 tests/C/flexpath_tests/maya_append/CMakeLists.txt  |     1 +
 tests/C/flexpath_tests/maya_append/Makefile.am     |     2 +-
 tests/C/flexpath_tests/maya_append/Makefile.in     |     8 +-
 tests/C/flexpath_tests/maya_noxml/CMakeLists.txt   |     1 +
 tests/C/flexpath_tests/maya_noxml/Makefile.am      |     2 +-
 tests/C/flexpath_tests/maya_noxml/Makefile.in      |     8 +-
 tests/C/flexpath_tests/scalar/CMakeLists.txt       |     1 +
 tests/C/flexpath_tests/scalar/Makefile.am          |     2 +-
 tests/C/flexpath_tests/scalar/Makefile.in          |     8 +-
 tests/C/query/Makefile.in                          |     3 +
 tests/C/query/alacrity/CMakeLists.txt              |     1 +
 tests/C/query/alacrity/Makefile.am                 |     2 +-
 tests/C/query/alacrity/Makefile.in                 |     6 +-
 tests/C/query/common/CMakeLists.txt                |     1 +
 tests/C/query/common/Makefile.am                   |     2 +-
 tests/C/query/common/Makefile.in                   |     6 +-
 tests/C/query/fastbit/CMakeLists.txt               |     1 +
 tests/C/query/fastbit/Makefile.am                  |     4 +-
 tests/C/query/fastbit/Makefile.in                  |     8 +-
 tests/C/query/fastbit/fastbit_tests.c              |   262 +-
 tests/Fortran/CMakeLists.txt                       |     2 +-
 tests/Fortran/Makefile.am                          |     2 +-
 tests/Fortran/Makefile.in                          |     6 +-
 tests/Makefile.in                                  |     3 +
 tests/bp_read/CMakeLists.txt                       |     2 +-
 tests/bp_read/Makefile.am                          |     2 +-
 tests/bp_read/Makefile.in                          |     7 +-
 tests/bp_read/bp_read_f.F90                        |     4 +-
 tests/bp_read/bp_read_f_v1.F90                     |     4 +-
 tests/genarray/CMakeLists.txt                      |     2 +-
 tests/genarray/Makefile.am                         |     2 +-
 tests/genarray/Makefile.in                         |     6 +-
 tests/genarray/copyarray.F90                       |     4 +-
 tests/genarray/copyarray2D.F90                     |     4 +-
 tests/genarray/genarray.F90                        |     4 +-
 tests/genarray/genarray2D.F90                      |     4 +-
 tests/suite/Makefile.in                            |     3 +
 tests/suite/programs/CMakeLists.txt                |     1 +
 tests/suite/programs/Makefile.am                   |    10 +-
 tests/suite/programs/Makefile.in                   |   226 +-
 tests/suite/programs/adios_transforms.xml          |     2 +-
 tests/suite/programs/adios_transforms_read_write.c |     3 +-
 tests/suite/programs/big_file.c                    |     8 +-
 tests/suite/programs/blocks.c                      |     4 +-
 tests/suite/programs/build_standard_dataset.c      |     3 +-
 tests/suite/programs/connect_to_space_subset.c     |     2 +-
 tests/suite/programs/examples/Makefile.am          |     1 +
 .../suite/programs/examples}/Makefile.in           |    12 +-
 .../programs/examples/attributes/CMakeLists.txt    |    34 +
 .../suite/programs/examples/attributes/Makefile.am |    27 +
 .../programs/examples}/attributes/Makefile.in      |    88 +-
 .../programs/examples/attributes/attributes_C.xml  |    34 +
 .../examples/attributes/attributes_read_C.c        |    46 +-
 .../examples/attributes/attributes_write_C.c       |    53 +
 .../programs/examples/global_array/CMakeLists.txt  |    64 +
 .../programs/examples/global_array/Makefile.am     |    83 +
 .../programs/examples/global_array}/Makefile.in    |   339 +-
 .../examples/global_array/global_array_C.xml       |     1 -
 .../examples/global_array/global_array_F.xml       |    21 +
 .../global_array_aggregate_by_color_C.c            |    72 +-
 .../examples/global_array/global_array_read_C.c    |    90 +
 .../global_array/global_array_read_byid_noxml_C.c  |   103 +
 .../global_array/global_array_read_noxml_C.c       |   102 +
 .../examples/global_array/global_array_write_C.c   |    52 +
 .../examples/global_array/global_array_write_F.F90 |    50 +
 .../global_array/global_array_write_byid_noxml_C.c |    30 +-
 .../global_array_write_byid_noxml_F.F90            |    23 +-
 .../global_array/global_array_write_noxml_C.c      |    65 +-
 .../global_array/global_array_write_noxml_F.F90    |    74 +-
 .../examples/global_array_time/CMakeLists.txt      |    47 +
 .../examples/global_array_time/Makefile.am         |    52 +
 .../examples/global_array_time}/Makefile.in        |   208 +-
 .../global_array_time/global_array_time_C.xml      |    27 +
 .../global_array_time/global_array_time_F.xml      |    31 +
 .../global_array_time_read_as_file_C.c             |   105 +
 .../global_array_time_read_as_stream_C.c           |   123 +
 .../global_array_time/global_array_time_write_C.c  |    58 +
 .../global_array_time_write_F.F90                  |    70 +
 .../programs/examples/local_array/CMakeLists.txt   |    33 +
 .../programs/examples/local_array/Makefile.am      |    24 +
 .../programs/examples/local_array}/Makefile.in     |    89 +-
 .../examples/local_array/local_array_C.xml         |    16 +
 .../examples/local_array/local_array_read_C.c      |    84 +
 .../examples/local_array/local_array_write_C.c     |    52 +
 .../suite/programs/examples/scalars/CMakeLists.txt |    45 +
 tests/suite/programs/examples/scalars/Makefile.am  |    52 +
 .../suite/programs/examples/scalars}/Makefile.in   |   197 +-
 .../suite/programs/examples/scalars/scalars_C.xml  |    29 +
 .../suite/programs/examples/scalars/scalars_F.xml  |    30 +
 .../programs/examples/scalars/scalars_read_C.c     |   111 +
 .../programs/examples/scalars/scalars_read_F.F90   |   102 +
 .../programs/examples/scalars/scalars_write_C.c    |    82 +
 .../programs/examples/scalars/scalars_write_F.F90  |    62 +
 tests/suite/programs/hashtest.c                    |     4 +-
 tests/suite/programs/many_vars.c                   |    27 +-
 tests/suite/programs/path_test.c                   |     2 +-
 tests/suite/programs/reuse_dim.c                   |     2 +-
 tests/suite/programs/selections.c                  |     2 +-
 tests/suite/programs/set_path.c                    |     2 +-
 tests/suite/programs/set_path_var.c                |     2 +-
 tests/suite/programs/transforms_writeblock_read.c  |     1 +
 tests/suite/programs/two_groups.c                  |     8 +-
 tests/suite/programs/write_alternate.c             |     4 +-
 tests/suite/reference/attributes_bpls.txt          |    16 +-
 tests/suite/reference/attributes_read.txt          |    12 +-
 tests/suite/reference/global_array_bpls.txt        |    22 +-
 tests/suite/reference/global_array_no_xml_bpls.txt |   430 +-
 .../suite/reference/global_array_no_xml_f_bpls.txt |    38 +-
 tests/suite/reference/global_array_time_bpls.txt   |    12 +-
 ...read.txt => global_array_time_read_as_file.txt} |     0
 .../reference/global_array_time_read_as_stream.txt |   153 +
 .../{arrays_bpls.txt => local_array_C_bpls.txt}    |    10 +-
 .../{arrays_read.txt => local_array_C_read.txt}    |     0
 tests/suite/reference/no_xml_write_byid_bpls.txt   |   432 +-
 tests/suite/reference/no_xml_write_byid_f_bpls.txt |    40 +-
 tests/suite/reference/scalars_write_bpls.txt       |    24 +-
 .../suite/reference/transforms_read_write_bpls.txt |    22 +-
 tests/suite/test.sh                                |    13 +-
 tests/suite/tests/01_scalars.sh                    |    36 +-
 tests/suite/tests/02_attributes.sh                 |    29 +-
 tests/suite/tests/03_arrays.sh                     |    40 +-
 tests/suite/tests/04_global_array.sh               |    51 +-
 tests/suite/tests/05_global_array_time.sh          |    77 +-
 tests/suite/tests/07_global_array_no_xml.sh        |    52 +-
 tests/suite/tests/08_amr_write_read.sh             |     4 +
 tests/suite/tests/09_amr_write_read_2vars.sh       |     3 +
 tests/suite/tests/13_write_byid.sh                 |    50 +-
 tests/suite/tests/16_transform_write_read.sh       |     2 +-
 tests/suite/tests/18_aggregation_by_color.sh       |    14 +-
 tests/suite/tests/19_query.sh                      |     2 +-
 toolchain/cray/README.md                           |     2 +
 utils/CMakeLists.txt                               |     2 +
 utils/Makefile.am                                  |     2 +-
 utils/Makefile.in                                  |     8 +-
 utils/adios_lint/CMakeLists.txt                    |     2 +-
 utils/adios_lint/Makefile.am                       |     2 +-
 utils/adios_lint/Makefile.in                       |     6 +-
 utils/bp2ascii/CMakeLists.txt                      |     2 +-
 utils/bp2ascii/Makefile.am                         |     2 +-
 utils/bp2ascii/Makefile.in                         |     6 +-
 utils/bp2ascii/bp2ascii.c                          |     2 +-
 utils/bp2bp/CMakeLists.txt                         |     1 +
 utils/bp2bp/Makefile.am                            |     2 +-
 utils/bp2bp/Makefile.in                            |     7 +-
 utils/bp2h5/CMakeLists.txt                         |     1 +
 utils/bp2h5/Makefile.am                            |     2 +-
 utils/bp2h5/Makefile.in                            |     7 +-
 utils/bp2ncd/CMakeLists.txt                        |     2 +-
 utils/bp2ncd/Makefile.am                           |     2 +-
 utils/bp2ncd/Makefile.in                           |     6 +-
 utils/bp2ncd/bp2ncd.c                              |     8 +-
 utils/bpdiff/CMakeLists.txt                        |     1 +
 utils/bpdiff/Makefile.am                           |     2 +-
 utils/bpdiff/Makefile.in                           |     7 +-
 utils/bpdump/CMakeLists.txt                        |     2 +-
 utils/bpdump/Makefile.am                           |     2 +-
 utils/bpdump/Makefile.in                           |     6 +-
 utils/bpdump/bpdump.c                              |    74 +-
 utils/bpls/CMakeLists.txt                          |     1 +
 utils/bpls/Makefile.am                             |     2 +-
 utils/bpls/Makefile.in                             |     7 +-
 utils/bpls/bpls.c                                  |    70 +-
 utils/bpmeta/CMakeLists.txt                        |     2 +-
 utils/bpmeta/Makefile.am                           |     2 +-
 utils/bpmeta/Makefile.in                           |     6 +-
 utils/bpmeta/bpmeta.c                              |    11 +-
 utils/bprecover/CMakeLists.txt                     |    12 +
 utils/bprecover/Makefile.am                        |    17 +
 utils/{bpmeta => bprecover}/Makefile.in            |    53 +-
 utils/{bpdump/bpdump.c => bprecover/bprecover.c}   |   890 +-
 utils/bpsplit/CMakeLists.txt                       |     2 +-
 utils/bpsplit/Makefile.am                          |     2 +-
 utils/bpsplit/Makefile.in                          |     6 +-
 utils/bpsplit/bpappend.c                           |     4 +-
 utils/bpsplit/bpgettime.c                          |     2 +-
 utils/bpsplit/bpsplit.c                            |     2 +-
 utils/fastbit/CMakeLists.txt                       |     2 +-
 utils/fastbit/Makefile.am                          |     2 +-
 utils/fastbit/Makefile.in                          |     7 +-
 utils/fastbit/adios_index_fastbit.c                |   538 +-
 utils/gpp/Makefile.in                              |     3 +
 utils/list_methods/CMakeLists.txt                  |     2 +-
 utils/list_methods/Makefile.am                     |     2 +-
 utils/list_methods/Makefile.in                     |     6 +-
 utils/skel/Makefile.in                             |     3 +
 utils/skel/etc/Makefile.in                         |     3 +
 utils/skel/src/Makefile.in                         |     3 +
 utils/skeldump/CMakeLists.txt                      |     2 +-
 utils/skeldump/Makefile.am                         |     2 +-
 utils/skeldump/Makefile.in                         |     6 +-
 wrappers/matlab/adiosload.m                        |    33 +
 wrappers/matlab/posix_method.bp                    |   Bin 0 -> 1257 bytes
 .../matlab/posix_method.bp.dir/posix_method.bp.0   |   Bin 0 -> 10373 bytes
 wrappers/matlab/two_groups19.bp                    |     1 +
 wrappers/matlab/xgc.diagnosis.bp                   |     1 +
 wrappers/numpy/MANIFEST.in                         |     2 +
 wrappers/numpy/README                              |    85 +
 wrappers/numpy/adios.cpp                           | 25255 +++++++++++++-----
 wrappers/numpy/adios.pyx                           |  1013 +-
 wrappers/numpy/adios_mpi.cpp                       | 25257 ++++++++++++++-----
 wrappers/numpy/adios_mpi.pyx                       |  1013 +-
 wrappers/numpy/conf/__init__.py                    |     0
 wrappers/numpy/conf/mpiconfig.py                   |   363 +
 wrappers/numpy/conf/mpidistutils.py                |  1534 ++
 wrappers/numpy/conf/mpiregexes.py                  |    75 +
 wrappers/numpy/conf/mpiscanner.py                  |   342 +
 wrappers/numpy/doc/Makefile                        |   192 +
 wrappers/numpy/doc/source/build.rst                |    55 +
 wrappers/numpy/doc/source/conf.py                  |   290 +
 wrappers/numpy/doc/source/index.rst                |    28 +
 wrappers/numpy/doc/source/quick.rst                |   143 +
 wrappers/numpy/doc/source/ref.rst                  |    32 +
 wrappers/numpy/example/staging/README              |     2 +-
 wrappers/numpy/example/staging/adios_read.py       |     2 +-
 wrappers/numpy/example/staging/adios_write.py      |     5 +-
 wrappers/numpy/setup.cfg                           |     2 +
 wrappers/numpy/setup.py                            |    44 +-
 wrappers/numpy/setup_mpi.py                        |   107 +-
 wrappers/numpy/test/common.py                      |    20 +
 .../numpy/test/test_adios_timestep_unittest.py     |   110 +
 wrappers/numpy/test/test_adios_unittest.py         |   110 +
 wrappers/numpy/test/test_adios_write_unittest.py   |    54 +
 wrappers/numpy/test/test_adios_writer_unittest.py  |   124 +
 wrappers/numpy/tests/test_adios.py                 |     7 +-
 .../tests/{test_adios.py => test_adios_matplot.py} |     5 +
 wrappers/numpy/tests/test_adios_mpi.py             |     9 +-
 wrappers/numpy/tests/test_adios_mpi_writer.py      |    51 +
 wrappers/numpy/tests/test_adios_timestep.py        |     2 +-
 wrappers/numpy/tests/test_adios_writer.py          |    43 +
 409 files changed, 55561 insertions(+), 17901 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index cccfb32..ccc42e2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1372,6 +1372,11 @@ set(VERSION_SVNREV 2007)
 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${PROJECT_BINARY_DIR}/config.h)
 ################################ end of generating config.h ###############################
 
+#####################start processing src/public/adios_version.h.in #####################
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/src/public/adios_version.h.in
+               ${CMAKE_CURRENT_BINARY_DIR}/src/public/adios_version.h @ONLY)
+#####################end of processing src/public/adios_version.h #####################
+
 ################################ start of Fortran processing ##############################
 if(BUILD_FORTRAN)
 enable_language(Fortran)
@@ -1394,22 +1399,22 @@ find_library(M_LIBS libm.a)
 # EXTRA flags are used for compiling adios stuff, which need not go into adios_config for user codes
 set(ADIOSLIB_EXTRA_CPPFLAGS "${MACRODEFFLAG}_FILE_OFFSET_BITS=64 ${MACRODEFFLAG}_LARGEFILE_SOURCE ${MACRODEFFLAG}_LARGEFILE64_SOURCE ${MACRODEFFLAG}_GNU_SOURCE")
 #message("${ADIOSLIB_EXTRA_CPPFLAGS}")
-set(ADIOSLIB_LDADD ${M_LIBS} ${MXML_LIBS})
+set(ADIOSLIB_LDADD ${MXML_LIBS})
 set(ADIOSLIB_CFLAGS "")
 set(ADIOSLIB_CPPFLAGS "${MXML_CPPFLAGS}")
 #message("ADIOSLIB_CPPFLAGS is ${ADIOSLIB_CPPFLAGS}")
 set(ADIOSLIB_SEQ_CPPFLAGS "${MACRODEFFLAG}_NOMPI ${MXML_CPPFLAGS}")
 set(ADIOSLIB_SEQ_CFLAGS "")
-set(ADIOSLIB_SEQ_LDADD ${M_LIBS} ${MXML_LIBS})
+set(ADIOSLIB_SEQ_LDADD ${MXML_LIBS})
 set(ADIOSLIB_INT_CPPFLAGS "${MACRODEFFLAG}_NOMPI ${MXML_CPPFLAGS}")
 set(ADIOSLIB_INT_CFLAGS "")
-set(ADIOSLIB_INT_LDADD ${M_LIBS} ${MXML_LIBS})
+set(ADIOSLIB_INT_LDADD ${MXML_LIBS})
 set(ADIOSREADLIB_CPPFLAGS "")
 set(ADIOSREADLIB_CFLAGS "")
-set(ADIOSREADLIB_LDADD ${M_LIBS})
+set(ADIOSREADLIB_LDADD "")
 set(ADIOSREADLIB_SEQ_CPPFLAGS "${MACRODEFFLAG}_NOMPI")
 set(ADIOSREADLIB_SEQ_CFLAGS "")
-set(ADIOSREADLIB_SEQ_LDADD ${M_LIBS})
+set(ADIOSREADLIB_SEQ_LDADD "")
 
 if(NOT NO_DATATAP)
   set(ADIOSLIB_CPPFLAGS "${ADIOSLIB_CPPFLAGS} ${DT_CPPFLAGS}")
@@ -1774,7 +1779,11 @@ if(HAVE_NCSU_TIMER)
   set(ADIOSREADLIB_SEQ_LDADD ${ADIOSREADLIB_SEQ_LDADD} ${TIMER_LIBS})
 endif()
 
-#set(NSSI_SERVER_LIBS "")
+set(ADIOSLIB_LDADD ${ADIOSLIB_LDADD} ${M_LIBS})
+set(ADIOSLIB_SEQ_LDADD ${ADIOSLIB_SEQ_LDADD} ${M_LIBS})
+set(ADIOSLIB_INT_LDADD ${ADIOSLIB_INT_LDADD} ${M_LIBS})
+set(ADIOSREADLIB_LDADD ${ADIOSREADLIB_LDADD} ${M_LIBS})
+set(ADIOSREADLIB_SEQ_LDADD ${ADIOSREADLIB_SEQ_LDADD} ${M_LIBS})
 ############################### srart of top CMakeLists.txt ###############################
 #install(PROGRAMS adios_config DESTINATION ${bindir})
 
@@ -1789,57 +1798,23 @@ endif()
 #add_definitions(-DO_LARGEFILE=0)
 
 add_subdirectory(src)
-#set(ADIOS_LIB ${PROJECT_BINARY_DIR}/src/libadios.a)
-#set(ADIOS_LIB adios)
-#set(ADIOS_INTERNAL_NOMPI_LIB ${PROJECT_BINARY_DIR}/src/libadios_internal_nompi.a)
-#set(ADIOS_INTERNAL_NOMPI_LIB adios_internal_nompi)
-#set(ADIOSREAD_NOMPI_LIB ${PROJECT_BINARY_DIR}/src/libadiosread_nompi.a)
-#set(ADIOSREAD_NOMPI_LIB adiosread_nompi)
-#if(BUILD_FORTRAN)
-#  set(ADIOSREAD_LIB ${PROJECT_BINARY_DIR}/src/libadiosreadf.a)
-#  set(ADIOSREAD_LIB adiosreadf)
-#  set(ADIOSREAD_V1_LIB ${PROJECT_BINARY_DIR}/src/libadiosreadf_v1.a)
-#  set(ADIOSREAD_V1_LIB adiosreadf_v1)
-#else()
-#  set(ADIOSREAD_LIB ${PROJECT_BINARY_DIR}/src/libadiosread.a)
-#  set(ADIOSREAD_LIB adiosread)
-#endif()
 
 get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES)
 message(STATUS "${_LANGUAGES_}")
 
-#message("ADIOSLIB_CPPFLAGS is ${ADIOSLIB_CPPFLAGS}")
-#message("ADIOSLIB_CFLAGS is ${ADIOSLIB_CFLAGS}")
-#message("ADIOSLIB_LDADD is ${ADIOSLIB_LDADD}")
 #####################start processing adios_config.flags.in #####################
 set(ADIOS_DIR "${CMAKE_INSTALL_PREFIX}")
 
-set(ADIOS_INC "-I${ADIOS_DIR}/include ${ADIOSLIB_CPPFLAGS} ${ADIOSLIB_CFLAGS}")
-set(ADIOS_CLIB "-L${ADIOS_DIR}/lib -ladios ${ADIOSLIB_LDADD} ${LIBS}")
-set(ADIOS_FLIB "-L${ADIOS_DIR}/lib -ladiosf ${ADIOSLIB_LDADD} ${LIBS}")
-
-# Flags to build code using ADIOS read API only
-set(ADIOSREAD_INC "-I${ADIOS_DIR}/include ${ADIOSREADLIB_CPPFLAGS} ${ADIOSREADLIB_CFLAGS}")
-set(ADIOSREAD_CLIB "-L${ADIOS_DIR}/lib -ladiosread  ${ADIOSREADLIB_LDADD}")
-set(ADIOSREAD_FLIB "-L${ADIOS_DIR}/lib -ladiosreadf ${ADIOSREADLIB_LDADD}")
-
-# Flags to build code using ADIOS read API only in a sequential code (no MPI)
-set(ADIOSREAD_SEQ_INC "-I${ADIOS_DIR}/include ${ADIOSREADLIB_SEQ_CPPFLAGS} ${ADIOSREADLIB_SEQ_CFLAGS}")
-set(ADIOSREAD_SEQ_CLIB "-L${ADIOS_DIR}/lib -ladiosread_nompi ${ADIOSREADLIB_SEQ_LDADD}")
-set(ADIOSREAD_SEQ_FLIB "-L${ADIOS_DIR}/lib -ladiosreadf_nompi ${ADIOSREADLIB_SEQ_LDADD}")
-
-#Flags to build code using ADIOS write API in a sequential code (no MPI)
-set(ADIOS_SEQ_INC "-I${ADIOS_DIR}/include ${ADIOSLIB_SEQ_CPPFLAGS} ${ADIOSLIB_SEQ_CFLAGS}")
-set(ADIOS_SEQ_CLIB "-L${ADIOS_DIR}/lib -ladios_nompi ${ADIOSLIB_SEQ_LDADD} ${LIBS}")
-
-#The following flags are not used. It is only for internal utilities of ADIOS,using libadios_internal_nompi.a
-set(ADIOS_INT_INC "-I${ADIOS_DIR}/include ${ADIOSLIB_INT_CPPFLAGS} ${ADIOSLIB_INT_CFLAGS}")
-set(ADIOS_INT_CLIB "-L${ADIOS_DIR}/lib -ladios_internal_nompi ${ADIOSLIB_INT_LDADD} ${LIBS}")
+string(REGEX REPLACE ";" " " ADIOSLIB_LDADD_M "${ADIOSLIB_LDADD}")
+string(REGEX REPLACE ";" " " ADIOSREADLIB_LDADD_M "${ADIOSREADLIB_LDADD}")
+string(REGEX REPLACE ";" " " ADIOSREADLIB_SEQ_LDADD_M "${ADIOSREADLIB_SEQ_LDADD}")
+string(REGEX REPLACE ";" " " ADIOSLIB_SEQ_LDADD_M "${ADIOSLIB_SEQ_LDADD}")
+string(REGEX REPLACE ";" " " ADIOSLIB_INT_LDADD_M "${ADIOSLIB_INT_LDADD}")
 
-CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/adios_config.flags.in ${CMAKE_CURRENT_BINARY_DIR}/adios_config.flags)
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/adios_config.flags.cmake ${CMAKE_CURRENT_BINARY_DIR}/adios_config.flags @ONLY)
 #####################end of processing adios_config.flags.in #####################
 #####################start processing adios_config.flags.in #####################
-CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/adios_config.in ${CMAKE_CURRENT_BINARY_DIR}/adios_config)
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/adios_config.in ${CMAKE_CURRENT_BINARY_DIR}/adios_config @ONLY)
 #####################end of processing adios_config.flags.in #####################
 install(FILES ${CMAKE_BINARY_DIR}/adios_config.flags DESTINATION ${sysconfdir})
 install(PROGRAMS ${CMAKE_BINARY_DIR}/adios_config DESTINATION ${bindir})
diff --git a/INSTALL b/INSTALL
index 6df2e34..77592dc 100644
--- a/INSTALL
+++ b/INSTALL
@@ -92,8 +92,8 @@ Quick Installation
    For example, to install ADIOS to /usr/local/adios on a machine where
    mpicc and mpif90 are the compilers:
 
-   $ tar zxf adios-1.8.0.tar.gz
-   $ cd adios-1.8.0
+   $ tar zxf adios-1.9.0.tar.gz
+   $ cd adios-1.9.0
    $ CC=mpicc FC=mpif90 ./configure --prefix=/usr/local/adios 
        --with-mxml=<location of mini-xml installation>
        --with-hdf5=<location of HDF5 installation>
diff --git a/Makefile.am b/Makefile.am
index 04c0734..8d17845 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,6 +5,7 @@ SUBDIRS=src utils tests examples
 EXTRA_DIST = runconf \
              KNOWN_BUGS \
              adios_config.in \
+             adios_config.flags.cmake \
              scripts/create.nssi.config.sh \
              scripts/kill.nssi.staging.sh \
              scripts/start.nssi.staging.sh \
@@ -54,4 +55,4 @@ install-data-hook:
 	$(INSTALL_DATA) adios_config.flags $(DESTDIR)$(sysconfdir)
 	$(INSTALL_DATA) adios_git_status $(DESTDIR)$(sysconfdir)
         
-CLEANFILES = adios_config adios_config.flags
+CLEANFILES = 
diff --git a/Makefile.in b/Makefile.in
index 485d2cb..faf39c7 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -44,6 +44,7 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in $(srcdir)/adios_config.flags.in \
 	$(srcdir)/adios_config.in $(srcdir)/config.h.in \
 	$(top_srcdir)/configure \
+	$(top_srcdir)/src/public/adios_version.h.in \
 	$(top_srcdir)/utils/skel/lib/skel_have_adios_timing.py.in \
 	AUTHORS COPYING ChangeLog INSTALL NEWS TODO config/compile \
 	config/config.guess config/config.sub config/depcomp \
@@ -94,7 +95,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = config.h
 CONFIG_CLEAN_FILES = utils/skel/lib/skel_have_adios_timing.py \
-	adios_config adios_config.flags
+	adios_config adios_config.flags src/public/adios_version.h
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
@@ -371,6 +372,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -433,6 +437,7 @@ SUBDIRS = src utils tests examples
 EXTRA_DIST = runconf \
              KNOWN_BUGS \
              adios_config.in \
+             adios_config.flags.cmake \
              scripts/create.nssi.config.sh \
              scripts/kill.nssi.staging.sh \
              scripts/start.nssi.staging.sh \
@@ -449,7 +454,7 @@ EXTRA_DIST = runconf \
 #             wrappers/matlab/adiosreadc.c 
 bin_SCRIPTS = adios_config $(am__append_1)
 sysconf_DATA = scripts/FindADIOS.cmake
-CLEANFILES = adios_config adios_config.flags
+CLEANFILES = 
 all: config.h
 	$(MAKE) $(AM_MAKEFLAGS) all-recursive
 
@@ -511,6 +516,8 @@ adios_config: $(top_builddir)/config.status $(srcdir)/adios_config.in
 	cd $(top_builddir) && $(SHELL) ./config.status $@
 adios_config.flags: $(top_builddir)/config.status $(srcdir)/adios_config.flags.in
 	cd $(top_builddir) && $(SHELL) ./config.status $@
+src/public/adios_version.h: $(top_builddir)/config.status $(top_srcdir)/src/public/adios_version.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
 install-binSCRIPTS: $(bin_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
diff --git a/NEWS b/NEWS
index 1b82243..3543935 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,25 @@
+1.9.0 Release Jul 2015
+    - Array attributes are supported
+      - e.g axes = {"X","Y","Z"}
+    - adios_define_attribute_byvalue()
+      - to define scalar attributes with program variables instead of string values
+    - Update mode when appending to a file
+      - to add variables to last timestep instead of a new one 
+    - Python/Numpy wrapper improvements:
+      - Numpy-style array notations
+        e.g, var[1:5, 2:10], var[1:5. :], var[:5,...]
+      - Support for ADIOS write APIs
+      - Hint/docstring support
+      - Support for pip install and update
+    - Added adios_version.h to provide release and file format versions
+    - fix: memory leak in POSIX method
+    - fix: adios_write() now accepts const * void data from C++ apps
+    - fix: Cray compiler support
+    - fix: reading of compressed, zero size arrays on some processes
+    - fix: scaling bugs in aggregate method writing > 2GB per process or
+           aggregating data into a file over 4GB
+
+
 1.8.0 Release Dec 2014
     - Query API 
       - extends the read API with queries
diff --git a/adios_config.flags.cmake b/adios_config.flags.cmake
new file mode 100755
index 0000000..37706e1
--- /dev/null
+++ b/adios_config.flags.cmake
@@ -0,0 +1,39 @@
+#
+# Configuration values from configure script
+#
+
+# Install directory
+ADIOS_DIR="@prefix@"
+
+# Flags to build code using ADIOS write API (and read API)
+ADIOS_INC="-I${ADIOS_DIR}/include @ADIOSLIB_CPPFLAGS@ @ADIOSLIB_CFLAGS@"
+ADIOS_CLIB="${ADIOS_DIR}/lib/adios @ADIOSLIB_LDADD_M@ @LDFLAGS@ @LIBS@"
+ADIOS_FLIB="${ADIOS_DIR}/lib/adiosf @ADIOSLIB_LDADD_M@ @LDFLAGS@ @LIBS@"
+ADIOS_V1_FLIB="${ADIOS_DIR}/lib/adiosf_v1 @ADIOSLIB_LDADD_M@ @LIBS@"
+
+# Flags to build code using ADIOS read API only
+ADIOSREAD_INC="-I${ADIOS_DIR}/include @ADIOSREADLIB_CPPFLAGS@ @ADIOSREADLIB_CFLAGS@"
+ADIOSREAD_V1_INC="-I${ADIOS_DIR}/include @MACRODEFFLAG at ADIOS_USE_READ_API_1 @ADIOSREADLIB_CPPFLAGS@ @ADIOSREADLIB_CFLAGS@"
+ADIOSREAD_CLIB="${ADIOS_DIR}/lib/adiosread @ADIOSREADLIB_LDADD_M@"
+ADIOSREAD_FLIB="${ADIOS_DIR}/lib/adiosreadf @ADIOSREADLIB_LDADD_M@"
+ADIOSREAD_V1_FLIB="${ADIOS_DIR}/lib/adiosreadf_v1 @ADIOSREADLIB_LDADD_M@"
+
+# Flags to build code using ADIOS read API only in a sequential code (no MPI)
+ADIOSREAD_SEQ_INC="-I${ADIOS_DIR}/include @ADIOSREADLIB_SEQ_CPPFLAGS@ @ADIOSREADLIB_SEQ_CFLAGS@"
+ADIOSREAD_SEQ_V1_INC="-I${ADIOS_DIR}/include @MACRODEFFLAG at ADIOS_USE_READ_API_1 @ADIOSREADLIB_SEQ_CPPFLAGS@ @ADIOSREADLIB_SEQ_CFLAGS@"
+ADIOSREAD_SEQ_CLIB="${ADIOS_DIR}/lib/adiosread_nompi @ADIOSREADLIB_SEQ_LDADD_M@"
+ADIOSREAD_SEQ_FLIB="${ADIOS_DIR}/lib/adiosreadf_nompi @ADIOSREADLIB_SEQ_LDADD_M@"
+ADIOSREAD_SEQ_V1_FLIB="${ADIOS_DIR}/lib/adiosreadf_nompi_v1 @ADIOSREADLIB_SEQ_LDADD_M@"
+
+#Flags to build code using ADIOS write API in a sequential code (no MPI)
+ADIOS_SEQ_INC="-I${ADIOS_DIR}/include @ADIOSLIB_SEQ_CPPFLAGS@ @ADIOSLIB_SEQ_CFLAGS@"
+ADIOS_SEQ_CLIB="${ADIOS_DIR}/lib/adios_nompi @ADIOSLIB_SEQ_LDADD_M@ @LIBS@"
+ADIOS_SEQ_FLIB="${ADIOS_DIR}/lib/adiosf_nompi @ADIOSLIB_SEQ_LDADD_M@ @LIBS@"
+ADIOS_SEQ_V1_FLIB="${ADIOS_DIR}/lib/adiosf_nompi_v1 @ADIOSLIB_SEQ_LDADD_M@ @LIBS@"
+
+#The following flags are not used. It is only for internal utilities of ADIOS, using libadios_internal_nompi.a
+ADIOS_INT_INC="-I${ADIOS_DIR}/include @ADIOSLIB_INT_CPPFLAGS@ @ADIOSLIB_INT_CFLAGS@"
+ADIOS_INT_CLIB="${ADIOS_DIR}/lib/adios_internal_nompi @ADIOSLIB_INT_LDADD_M@ @LIBS@"
+
+VERSIONSTRING="@VERSION@"
+
diff --git a/cmake_init b/cmake_init
index 4bc51f3..22f4ed0 100755
--- a/cmake_init
+++ b/cmake_init
@@ -601,10 +601,10 @@ elif [ `hostname | cut -c 1-7` == "adiosVM" ]; then
     export CC=mpicc
     export CXX=mpicxx
     export FC=mpif90
-    export INSTALL_PREFIX="/opt/adios/1.8"
+    export INSTALL_PREFIX="/opt/adios/1.9"
     export CPPFLAGS="-DMPICH_IGNORE_CXX_SEEK"
     export CFLAGS="-g -O0 -fPIC -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast"
-    export MXML_DIR=/opt/mxml/2.8
+    export MXML_DIR=/opt/mxml/2.9
     export SEQ_HDF5_DIR=/opt/hdf5-1.8.12
     export SEQ_HDF5_LIBS="-L/opt/hdf5-1.8.12/lib -lhdf5_hl -lhdf5 -lm"
     export PAR_HDF5_DIR=/opt/hdf5-1.8.12-parallel
diff --git a/config.h.cmake b/config.h.cmake
index 7afa509..aa81544 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -321,14 +321,5 @@
 /* Version number of package */
 #cmakedefine VERSION "${VERSION}"
 
-/* Major version number */
-#define VERSION_MAJOR ${VERSION_MAJOR}
-
-/* Micro version number */ 
-#define VERSION_MICRO ${VERSION_MICRO}
-
-/* Minor version number */
-#define VERSION_MINOR ${VERSION_MINOR}
-
 /* svn revision number */
 #cmakedefine VERSION_SVNREV ${VERSION_SVNREV}
diff --git a/config.h.in b/config.h.in
index a5057c9..19ad6ba 100644
--- a/config.h.in
+++ b/config.h.in
@@ -324,12 +324,3 @@
 
 /* Version number of package */
 #undef VERSION
-
-/* Major version number */
-#undef VERSION_MAJOR
-
-/* Micro version number */
-#undef VERSION_MICRO
-
-/* Minor version number */
-#undef VERSION_MINOR
diff --git a/config/ac_dataspaces.m4 b/config/ac_dataspaces.m4
index 0805db4..823e304 100644
--- a/config/ac_dataspaces.m4
+++ b/config/ac_dataspaces.m4
@@ -132,7 +132,11 @@ else
                     [DATASPACES_LIBS="-ldspaces -ldscommon -ldart"],
                     [AM_CONDITIONAL(HAVE_DATASPACES,false)])
         else
-            AM_CONDITIONAL(HAVE_DATASPACES,false)
+            dnl Now TCP is working #AM_CONDITIONAL(HAVE_DATASPACES,false)
+            AC_TRY_COMPILE([#include "dataspaces.h"],
+                    [int err; err = dspaces_init(1,1,0,"");],
+                    [DATASPACES_LIBS="-ldspaces -ldscommon -ldart"],
+                    [AM_CONDITIONAL(HAVE_DATASPACES,false)])
         fi
     fi
 
diff --git a/config/ac_fastbit.m4 b/config/ac_fastbit.m4
index 510b077..c8d9b43 100644
--- a/config/ac_fastbit.m4
+++ b/config/ac_fastbit.m4
@@ -11,7 +11,7 @@ AC_ARG_WITH(
 
 dnl If the lib was specified, verify that it exists and can compile
 if test "x$with_fastbit" != xno; then
-    FASTBIT_CPPFLAGS="-I$with_fastbit/include"
+    FASTBIT_CPPFLAGS="-I$with_fastbit/include/fastbit"
     FASTBIT_LDFLAGS="-L$with_fastbit/lib"
     FASTBIT_LIBS="-lfastbit"
 
diff --git a/configure b/configure
index ceeb4a9..ac27a96 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
 #! /bin/sh
 # From configure.ac Revision.
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for adios 1.8.0.
+# Generated by GNU Autoconf 2.63 for adios 1.9.0.
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
@@ -744,8 +744,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='adios'
 PACKAGE_TARNAME='adios'
-PACKAGE_VERSION='1.8.0'
-PACKAGE_STRING='adios 1.8.0'
+PACKAGE_VERSION='1.9.0'
+PACKAGE_STRING='adios 1.9.0'
 PACKAGE_BUGREPORT=''
 
 ac_unique_file="configure.ac"
@@ -789,6 +789,9 @@ ac_subst_vars='am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
+VERSION_MICRO
+VERSION_MINOR
+VERSION_MAJOR
 ADIOSLIB_EXTRA_CPPFLAGS
 ADIOSREADLIB_SEQ_LDADD
 ADIOSREADLIB_SEQ_LDFLAGS
@@ -1774,7 +1777,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures adios 1.8.0 to adapt to many kinds of systems.
+\`configure' configures adios 1.9.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1844,7 +1847,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of adios 1.8.0:";;
+     short | recursive ) echo "Configuration of adios 1.9.0:";;
    esac
   cat <<\_ACEOF
 
@@ -2030,7 +2033,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-adios configure 1.8.0
+adios configure 1.9.0
 generated by GNU Autoconf 2.63
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -2044,7 +2047,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by adios $as_me 1.8.0, which was
+It was created by adios $as_me 1.9.0, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   $ $0 $@
@@ -2899,7 +2902,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='adios'
- VERSION='1.8.0'
+ VERSION='1.9.0'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -8868,13 +8871,13 @@ if test "${lt_cv_nm_interface+set}" = set; then
 else
   lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:8871: $ac_compile\"" >&5)
+  (eval echo "\"\$as_me:8874: $ac_compile\"" >&5)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:8874: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval echo "\"\$as_me:8877: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:8877: output\"" >&5)
+  (eval echo "\"\$as_me:8880: output\"" >&5)
   cat conftest.out >&5
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
@@ -10079,7 +10082,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 10082 "configure"' > conftest.$ac_ext
+  echo '#line 10085 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -12760,11 +12763,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:12763: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:12766: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:12767: \$? = $ac_status" >&5
+   echo "$as_me:12770: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -13099,11 +13102,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:13102: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:13105: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:13106: \$? = $ac_status" >&5
+   echo "$as_me:13109: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -13204,11 +13207,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:13207: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:13210: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:13211: \$? = $ac_status" >&5
+   echo "$as_me:13214: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -13259,11 +13262,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:13262: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:13265: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:13266: \$? = $ac_status" >&5
+   echo "$as_me:13269: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -16142,7 +16145,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 16145 "configure"
+#line 16148 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -16238,7 +16241,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 16241 "configure"
+#line 16244 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -18274,11 +18277,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:18277: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:18280: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:18281: \$? = $ac_status" >&5
+   echo "$as_me:18284: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -18373,11 +18376,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:18376: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:18379: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:18380: \$? = $ac_status" >&5
+   echo "$as_me:18383: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -18425,11 +18428,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:18428: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:18431: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:18432: \$? = $ac_status" >&5
+   echo "$as_me:18435: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -19977,11 +19980,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:19980: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:19983: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:19984: \$? = $ac_status" >&5
+   echo "$as_me:19987: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -20076,11 +20079,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:20079: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:20082: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:20083: \$? = $ac_status" >&5
+   echo "$as_me:20086: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -20128,11 +20131,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:20131: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:20134: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:20135: \$? = $ac_status" >&5
+   echo "$as_me:20138: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -28807,7 +28810,53 @@ fi
 
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
         else
-             if false; then
+                        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include "dataspaces.h"
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+int err; err = dspaces_init(1,1,0,"");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  DATASPACES_LIBS="-ldspaces -ldscommon -ldart"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	 if false; then
   HAVE_DATASPACES_TRUE=
   HAVE_DATASPACES_FALSE='#'
 else
@@ -28815,6 +28864,9 @@ else
   HAVE_DATASPACES_FALSE=
 fi
 
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
         fi
     fi
 
@@ -30793,11 +30845,11 @@ fi
 
 search_list="$datatap_dir/thin_ib.h $datatap_dir/lib/thin_ib.h $datatap_dir/include/thin_ib.h $search_list /usr/include/thin_ib.h /usr/local/include/thin_ib.h /opt/ibpbio/include/thin_ib.h /opt/misc/include/thin_ib.h /opt/misc/include/$cercs_cv_archive/thin_ib.h"
 tmp_search_results=""
-echo "configure:30796: searching for $search_list " >&5
+echo "configure:30848: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:30800: first found $tmp_search_results " >&5
+	echo "configure:30852: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -30885,11 +30937,11 @@ fi
 
 search_list="$datatap_dir/libibclient.la $datatap_dir/lib/libibclient.la $datatap_dir/include/libibclient.la $search_list /usr/lib/libibclient.la /usr/local/lib/libibclient.la /opt/ibpbio/lib/libibclient.la /opt/misc/lib/libibclient.la /opt/misc/lib/$cercs_cv_archive/libibclient.la"
 tmp_search_results=""
-echo "configure:30888: searching for $search_list " >&5
+echo "configure:30940: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:30892: first found $tmp_search_results " >&5
+	echo "configure:30944: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -30958,11 +31010,11 @@ else
 
 search_list="$PWD/../ibpbio $PWD/../../ibpbio $PWD/../../../ibpbio"
 tmp_search_results=""
-echo "configure:30961: searching for $search_list " >&5
+echo "configure:31013: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:30965: first found $tmp_search_results " >&5
+	echo "configure:31017: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31000,11 +31052,11 @@ else
 
 search_list="$PWD/../ibpbio $PWD/../../ibpbio $PWD/../../../ibpbio"
 tmp_search_results=""
-echo "configure:31003: searching for $search_list " >&5
+echo "configure:31055: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31007: first found $tmp_search_results " >&5
+	echo "configure:31059: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31128,11 +31180,11 @@ fi
 
 search_list="$datatap_dir/ffs.h $datatap_dir/lib/ffs.h $datatap_dir/include/ffs.h $search_list /usr/include/ffs.h /usr/local/include/ffs.h /opt/ffs/include/ffs.h /opt/misc/include/ffs.h /opt/misc/include/$cercs_cv_archive/ffs.h"
 tmp_search_results=""
-echo "configure:31131: searching for $search_list " >&5
+echo "configure:31183: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31135: first found $tmp_search_results " >&5
+	echo "configure:31187: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31220,11 +31272,11 @@ fi
 
 search_list="$datatap_dir/libffs.la $datatap_dir/lib/libffs.la $datatap_dir/include/libffs.la $search_list /usr/lib/libffs.la /usr/local/lib/libffs.la /opt/ffs/lib/libffs.la /opt/misc/lib/libffs.la /opt/misc/lib/$cercs_cv_archive/libffs.la"
 tmp_search_results=""
-echo "configure:31223: searching for $search_list " >&5
+echo "configure:31275: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31227: first found $tmp_search_results " >&5
+	echo "configure:31279: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31293,11 +31345,11 @@ else
 
 search_list="$PWD/../ffs $PWD/../../ffs $PWD/../../../ffs"
 tmp_search_results=""
-echo "configure:31296: searching for $search_list " >&5
+echo "configure:31348: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31300: first found $tmp_search_results " >&5
+	echo "configure:31352: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31335,11 +31387,11 @@ else
 
 search_list="$PWD/../ffs $PWD/../../ffs $PWD/../../../ffs"
 tmp_search_results=""
-echo "configure:31338: searching for $search_list " >&5
+echo "configure:31390: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31342: first found $tmp_search_results " >&5
+	echo "configure:31394: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31463,11 +31515,11 @@ fi
 
 search_list="$datatap_dir/gen_thread.h $datatap_dir/lib/gen_thread.h $datatap_dir/include/gen_thread.h $search_list /usr/include/gen_thread.h /usr/local/include/gen_thread.h /opt/gen_thread/include/gen_thread.h /opt/misc/include/gen_thread.h /opt/misc/include/$cercs_cv_archive/gen_thread.h"
 tmp_search_results=""
-echo "configure:31466: searching for $search_list " >&5
+echo "configure:31518: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31470: first found $tmp_search_results " >&5
+	echo "configure:31522: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31555,11 +31607,11 @@ fi
 
 search_list="$datatap_dir/libgen_thread.la $datatap_dir/lib/libgen_thread.la $datatap_dir/include/libgen_thread.la $search_list /usr/lib/libgen_thread.la /usr/local/lib/libgen_thread.la /opt/gen_thread/lib/libgen_thread.la /opt/misc/lib/libgen_thread.la /opt/misc/lib/$cercs_cv_archive/libgen_thread.la"
 tmp_search_results=""
-echo "configure:31558: searching for $search_list " >&5
+echo "configure:31610: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31562: first found $tmp_search_results " >&5
+	echo "configure:31614: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31628,11 +31680,11 @@ else
 
 search_list="$PWD/../gen_thread $PWD/../../gen_thread $PWD/../../../gen_thread"
 tmp_search_results=""
-echo "configure:31631: searching for $search_list " >&5
+echo "configure:31683: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31635: first found $tmp_search_results " >&5
+	echo "configure:31687: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31670,11 +31722,11 @@ else
 
 search_list="$PWD/../gen_thread $PWD/../../gen_thread $PWD/../../../gen_thread"
 tmp_search_results=""
-echo "configure:31673: searching for $search_list " >&5
+echo "configure:31725: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31677: first found $tmp_search_results " >&5
+	echo "configure:31729: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31821,11 +31873,11 @@ fi
 
 search_list="$datatap_dir/thin_portal.h $datatap_dir/lib/thin_portal.h $datatap_dir/include/thin_portal.h $search_list /usr/include/thin_portal.h /usr/local/include/thin_portal.h /opt/ptlpbio/include/thin_portal.h /opt/misc/include/thin_portal.h /opt/misc/include/$cercs_cv_archive/thin_portal.h"
 tmp_search_results=""
-echo "configure:31824: searching for $search_list " >&5
+echo "configure:31876: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31828: first found $tmp_search_results " >&5
+	echo "configure:31880: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31913,11 +31965,11 @@ fi
 
 search_list="$datatap_dir/libptlclient.a $datatap_dir/lib/libptlclient.a $datatap_dir/include/libptlclient.a $search_list /usr/lib/libptlclient.a /usr/local/lib/libptlclient.a /opt/ptlpbio/lib/libptlclient.a /opt/misc/lib/libptlclient.a /opt/misc/lib/$cercs_cv_archive/libptlclient.a"
 tmp_search_results=""
-echo "configure:31916: searching for $search_list " >&5
+echo "configure:31968: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31920: first found $tmp_search_results " >&5
+	echo "configure:31972: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -31986,11 +32038,11 @@ else
 
 search_list="$PWD/../ptlpbio $PWD/../../ptlpbio $PWD/../../../ptlpbio"
 tmp_search_results=""
-echo "configure:31989: searching for $search_list " >&5
+echo "configure:32041: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:31993: first found $tmp_search_results " >&5
+	echo "configure:32045: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32028,11 +32080,11 @@ else
 
 search_list="$PWD/../ptlpbio $PWD/../../ptlpbio $PWD/../../../ptlpbio"
 tmp_search_results=""
-echo "configure:32031: searching for $search_list " >&5
+echo "configure:32083: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32035: first found $tmp_search_results " >&5
+	echo "configure:32087: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32188,11 +32240,11 @@ fi
 
 search_list="$datatap_dir/thin_ib.h $datatap_dir/lib/thin_ib.h $datatap_dir/include/thin_ib.h $search_list /usr/include/thin_ib.h /usr/local/include/thin_ib.h /opt/ibpbio/include/thin_ib.h /opt/misc/include/thin_ib.h /opt/misc/include/$cercs_cv_archive/thin_ib.h"
 tmp_search_results=""
-echo "configure:32191: searching for $search_list " >&5
+echo "configure:32243: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32195: first found $tmp_search_results " >&5
+	echo "configure:32247: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32280,11 +32332,11 @@ fi
 
 search_list="$datatap_dir/libibclient.la $datatap_dir/lib/libibclient.la $datatap_dir/include/libibclient.la $search_list /usr/lib/libibclient.la /usr/local/lib/libibclient.la /opt/ibpbio/lib/libibclient.la /opt/misc/lib/libibclient.la /opt/misc/lib/$cercs_cv_archive/libibclient.la"
 tmp_search_results=""
-echo "configure:32283: searching for $search_list " >&5
+echo "configure:32335: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32287: first found $tmp_search_results " >&5
+	echo "configure:32339: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32353,11 +32405,11 @@ else
 
 search_list="$PWD/../ibpbio $PWD/../../ibpbio $PWD/../../../ibpbio"
 tmp_search_results=""
-echo "configure:32356: searching for $search_list " >&5
+echo "configure:32408: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32360: first found $tmp_search_results " >&5
+	echo "configure:32412: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32395,11 +32447,11 @@ else
 
 search_list="$PWD/../ibpbio $PWD/../../ibpbio $PWD/../../../ibpbio"
 tmp_search_results=""
-echo "configure:32398: searching for $search_list " >&5
+echo "configure:32450: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32402: first found $tmp_search_results " >&5
+	echo "configure:32454: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32523,11 +32575,11 @@ fi
 
 search_list="$datatap_dir/ffs.h $datatap_dir/lib/ffs.h $datatap_dir/include/ffs.h $search_list /usr/include/ffs.h /usr/local/include/ffs.h /opt/ffs/include/ffs.h /opt/misc/include/ffs.h /opt/misc/include/$cercs_cv_archive/ffs.h"
 tmp_search_results=""
-echo "configure:32526: searching for $search_list " >&5
+echo "configure:32578: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32530: first found $tmp_search_results " >&5
+	echo "configure:32582: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32615,11 +32667,11 @@ fi
 
 search_list="$datatap_dir/libffs.la $datatap_dir/lib/libffs.la $datatap_dir/include/libffs.la $search_list /usr/lib/libffs.la /usr/local/lib/libffs.la /opt/ffs/lib/libffs.la /opt/misc/lib/libffs.la /opt/misc/lib/$cercs_cv_archive/libffs.la"
 tmp_search_results=""
-echo "configure:32618: searching for $search_list " >&5
+echo "configure:32670: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32622: first found $tmp_search_results " >&5
+	echo "configure:32674: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32688,11 +32740,11 @@ else
 
 search_list="$PWD/../ffs $PWD/../../ffs $PWD/../../../ffs"
 tmp_search_results=""
-echo "configure:32691: searching for $search_list " >&5
+echo "configure:32743: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32695: first found $tmp_search_results " >&5
+	echo "configure:32747: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32730,11 +32782,11 @@ else
 
 search_list="$PWD/../ffs $PWD/../../ffs $PWD/../../../ffs"
 tmp_search_results=""
-echo "configure:32733: searching for $search_list " >&5
+echo "configure:32785: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32737: first found $tmp_search_results " >&5
+	echo "configure:32789: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32858,11 +32910,11 @@ fi
 
 search_list="$datatap_dir/gen_thread.h $datatap_dir/lib/gen_thread.h $datatap_dir/include/gen_thread.h $search_list /usr/include/gen_thread.h /usr/local/include/gen_thread.h /opt/gen_thread/include/gen_thread.h /opt/misc/include/gen_thread.h /opt/misc/include/$cercs_cv_archive/gen_thread.h"
 tmp_search_results=""
-echo "configure:32861: searching for $search_list " >&5
+echo "configure:32913: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32865: first found $tmp_search_results " >&5
+	echo "configure:32917: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -32950,11 +33002,11 @@ fi
 
 search_list="$datatap_dir/libgen_thread.la $datatap_dir/lib/libgen_thread.la $datatap_dir/include/libgen_thread.la $search_list /usr/lib/libgen_thread.la /usr/local/lib/libgen_thread.la /opt/gen_thread/lib/libgen_thread.la /opt/misc/lib/libgen_thread.la /opt/misc/lib/$cercs_cv_archive/libgen_thread.la"
 tmp_search_results=""
-echo "configure:32953: searching for $search_list " >&5
+echo "configure:33005: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:32957: first found $tmp_search_results " >&5
+	echo "configure:33009: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33023,11 +33075,11 @@ else
 
 search_list="$PWD/../gen_thread $PWD/../../gen_thread $PWD/../../../gen_thread"
 tmp_search_results=""
-echo "configure:33026: searching for $search_list " >&5
+echo "configure:33078: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33030: first found $tmp_search_results " >&5
+	echo "configure:33082: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33065,11 +33117,11 @@ else
 
 search_list="$PWD/../gen_thread $PWD/../../gen_thread $PWD/../../../gen_thread"
 tmp_search_results=""
-echo "configure:33068: searching for $search_list " >&5
+echo "configure:33120: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33072: first found $tmp_search_results " >&5
+	echo "configure:33124: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33216,11 +33268,11 @@ fi
 
 search_list="$datatap_dir/thin_portal.h $datatap_dir/lib/thin_portal.h $datatap_dir/include/thin_portal.h $search_list /usr/include/thin_portal.h /usr/local/include/thin_portal.h /opt/ptlpbio/include/thin_portal.h /opt/misc/include/thin_portal.h /opt/misc/include/$cercs_cv_archive/thin_portal.h"
 tmp_search_results=""
-echo "configure:33219: searching for $search_list " >&5
+echo "configure:33271: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33223: first found $tmp_search_results " >&5
+	echo "configure:33275: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33308,11 +33360,11 @@ fi
 
 search_list="$datatap_dir/libptlclient.a $datatap_dir/lib/libptlclient.a $datatap_dir/include/libptlclient.a $search_list /usr/lib/libptlclient.a /usr/local/lib/libptlclient.a /opt/ptlpbio/lib/libptlclient.a /opt/misc/lib/libptlclient.a /opt/misc/lib/$cercs_cv_archive/libptlclient.a"
 tmp_search_results=""
-echo "configure:33311: searching for $search_list " >&5
+echo "configure:33363: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33315: first found $tmp_search_results " >&5
+	echo "configure:33367: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33381,11 +33433,11 @@ else
 
 search_list="$PWD/../ptlpbio $PWD/../../ptlpbio $PWD/../../../ptlpbio"
 tmp_search_results=""
-echo "configure:33384: searching for $search_list " >&5
+echo "configure:33436: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33388: first found $tmp_search_results " >&5
+	echo "configure:33440: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33423,11 +33475,11 @@ else
 
 search_list="$PWD/../ptlpbio $PWD/../../ptlpbio $PWD/../../../ptlpbio"
 tmp_search_results=""
-echo "configure:33426: searching for $search_list " >&5
+echo "configure:33478: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33430: first found $tmp_search_results " >&5
+	echo "configure:33482: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33632,11 +33684,11 @@ fi
 
 search_list="$datatap_dir/evpath.h $datatap_dir/lib/evpath.h $datatap_dir/include/evpath.h $search_list /usr/include/evpath.h /usr/local/include/evpath.h /opt/evpath/include/evpath.h /opt/misc/include/evpath.h /opt/misc/include/$cercs_cv_archive/evpath.h"
 tmp_search_results=""
-echo "configure:33635: searching for $search_list " >&5
+echo "configure:33687: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33639: first found $tmp_search_results " >&5
+	echo "configure:33691: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33724,11 +33776,11 @@ fi
 
 search_list="$datatap_dir/libevpath.a $datatap_dir/lib/libevpath.a $datatap_dir/include/libevpath.a $search_list /usr/lib/libevpath.a /usr/local/lib/libevpath.a /opt/evpath/lib/libevpath.a /opt/misc/lib/libevpath.a /opt/misc/lib/$cercs_cv_archive/libevpath.a"
 tmp_search_results=""
-echo "configure:33727: searching for $search_list " >&5
+echo "configure:33779: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33731: first found $tmp_search_results " >&5
+	echo "configure:33783: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33797,11 +33849,11 @@ else
 
 search_list="$PWD/../evpath $PWD/../../evpath $PWD/../../../evpath"
 tmp_search_results=""
-echo "configure:33800: searching for $search_list " >&5
+echo "configure:33852: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33804: first found $tmp_search_results " >&5
+	echo "configure:33856: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33839,11 +33891,11 @@ else
 
 search_list="$PWD/../evpath $PWD/../../evpath $PWD/../../../evpath"
 tmp_search_results=""
-echo "configure:33842: searching for $search_list " >&5
+echo "configure:33894: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33846: first found $tmp_search_results " >&5
+	echo "configure:33898: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -33967,11 +34019,11 @@ fi
 
 search_list="$datatap_dir/ffs.h $datatap_dir/lib/ffs.h $datatap_dir/include/ffs.h $search_list /usr/include/ffs.h /usr/local/include/ffs.h /opt/ffs/include/ffs.h /opt/misc/include/ffs.h /opt/misc/include/$cercs_cv_archive/ffs.h"
 tmp_search_results=""
-echo "configure:33970: searching for $search_list " >&5
+echo "configure:34022: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:33974: first found $tmp_search_results " >&5
+	echo "configure:34026: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34059,11 +34111,11 @@ fi
 
 search_list="$datatap_dir/libffs.a $datatap_dir/lib/libffs.a $datatap_dir/include/libffs.a $search_list /usr/lib/libffs.a /usr/local/lib/libffs.a /opt/ffs/lib/libffs.a /opt/misc/lib/libffs.a /opt/misc/lib/$cercs_cv_archive/libffs.a"
 tmp_search_results=""
-echo "configure:34062: searching for $search_list " >&5
+echo "configure:34114: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34066: first found $tmp_search_results " >&5
+	echo "configure:34118: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34132,11 +34184,11 @@ else
 
 search_list="$PWD/../ffs $PWD/../../ffs $PWD/../../../ffs"
 tmp_search_results=""
-echo "configure:34135: searching for $search_list " >&5
+echo "configure:34187: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34139: first found $tmp_search_results " >&5
+	echo "configure:34191: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34174,11 +34226,11 @@ else
 
 search_list="$PWD/../ffs $PWD/../../ffs $PWD/../../../ffs"
 tmp_search_results=""
-echo "configure:34177: searching for $search_list " >&5
+echo "configure:34229: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34181: first found $tmp_search_results " >&5
+	echo "configure:34233: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34302,11 +34354,11 @@ fi
 
 search_list="$datatap_dir/atl.h $datatap_dir/lib/atl.h $datatap_dir/include/atl.h $search_list /usr/include/atl.h /usr/local/include/atl.h /opt/atl/include/atl.h /opt/misc/include/atl.h /opt/misc/include/$cercs_cv_archive/atl.h"
 tmp_search_results=""
-echo "configure:34305: searching for $search_list " >&5
+echo "configure:34357: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34309: first found $tmp_search_results " >&5
+	echo "configure:34361: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34394,11 +34446,11 @@ fi
 
 search_list="$datatap_dir/libatl.a $datatap_dir/lib/libatl.a $datatap_dir/include/libatl.a $search_list /usr/lib/libatl.a /usr/local/lib/libatl.a /opt/atl/lib/libatl.a /opt/misc/lib/libatl.a /opt/misc/lib/$cercs_cv_archive/libatl.a"
 tmp_search_results=""
-echo "configure:34397: searching for $search_list " >&5
+echo "configure:34449: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34401: first found $tmp_search_results " >&5
+	echo "configure:34453: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34467,11 +34519,11 @@ else
 
 search_list="$PWD/../atl $PWD/../../atl $PWD/../../../atl"
 tmp_search_results=""
-echo "configure:34470: searching for $search_list " >&5
+echo "configure:34522: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34474: first found $tmp_search_results " >&5
+	echo "configure:34526: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34509,11 +34561,11 @@ else
 
 search_list="$PWD/../atl $PWD/../../atl $PWD/../../../atl"
 tmp_search_results=""
-echo "configure:34512: searching for $search_list " >&5
+echo "configure:34564: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34516: first found $tmp_search_results " >&5
+	echo "configure:34568: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34637,11 +34689,11 @@ fi
 
 search_list="$datatap_dir/dill.h $datatap_dir/lib/dill.h $datatap_dir/include/dill.h $search_list /usr/include/dill.h /usr/local/include/dill.h /opt/dill/include/dill.h /opt/misc/include/dill.h /opt/misc/include/$cercs_cv_archive/dill.h"
 tmp_search_results=""
-echo "configure:34640: searching for $search_list " >&5
+echo "configure:34692: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34644: first found $tmp_search_results " >&5
+	echo "configure:34696: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34729,11 +34781,11 @@ fi
 
 search_list="$datatap_dir/libdill.a $datatap_dir/lib/libdill.a $datatap_dir/include/libdill.a $search_list /usr/lib/libdill.a /usr/local/lib/libdill.a /opt/dill/lib/libdill.a /opt/misc/lib/libdill.a /opt/misc/lib/$cercs_cv_archive/libdill.a"
 tmp_search_results=""
-echo "configure:34732: searching for $search_list " >&5
+echo "configure:34784: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34736: first found $tmp_search_results " >&5
+	echo "configure:34788: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34802,11 +34854,11 @@ else
 
 search_list="$PWD/../dill $PWD/../../dill $PWD/../../../dill"
 tmp_search_results=""
-echo "configure:34805: searching for $search_list " >&5
+echo "configure:34857: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34809: first found $tmp_search_results " >&5
+	echo "configure:34861: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34844,11 +34896,11 @@ else
 
 search_list="$PWD/../dill $PWD/../../dill $PWD/../../../dill"
 tmp_search_results=""
-echo "configure:34847: searching for $search_list " >&5
+echo "configure:34899: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34851: first found $tmp_search_results " >&5
+	echo "configure:34903: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -34972,11 +35024,11 @@ fi
 
 search_list="$datatap_dir/cercs_env.h $datatap_dir/lib/cercs_env.h $datatap_dir/include/cercs_env.h $search_list /usr/include/cercs_env.h /usr/local/include/cercs_env.h /opt/cercs_env/include/cercs_env.h /opt/misc/include/cercs_env.h /opt/misc/include/$cercs_cv_archive/cercs_env.h"
 tmp_search_results=""
-echo "configure:34975: searching for $search_list " >&5
+echo "configure:35027: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:34979: first found $tmp_search_results " >&5
+	echo "configure:35031: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -35064,11 +35116,11 @@ fi
 
 search_list="$datatap_dir/libcercs_env.a $datatap_dir/lib/libcercs_env.a $datatap_dir/include/libcercs_env.a $search_list /usr/lib/libcercs_env.a /usr/local/lib/libcercs_env.a /opt/cercs_env/lib/libcercs_env.a /opt/misc/lib/libcercs_env.a /opt/misc/lib/$cercs_cv_archive/libcercs_env.a"
 tmp_search_results=""
-echo "configure:35067: searching for $search_list " >&5
+echo "configure:35119: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:35071: first found $tmp_search_results " >&5
+	echo "configure:35123: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -35137,11 +35189,11 @@ else
 
 search_list="$PWD/../cercs_env $PWD/../../cercs_env $PWD/../../../cercs_env"
 tmp_search_results=""
-echo "configure:35140: searching for $search_list " >&5
+echo "configure:35192: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:35144: first found $tmp_search_results " >&5
+	echo "configure:35196: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -35179,11 +35231,11 @@ else
 
 search_list="$PWD/../cercs_env $PWD/../../cercs_env $PWD/../../../cercs_env"
 tmp_search_results=""
-echo "configure:35182: searching for $search_list " >&5
+echo "configure:35234: searching for $search_list " >&5
 for tmp_search_value in $search_list; do
    if test -r $tmp_search_value; then
 	tmp_search_results=$tmp_search_value
-	echo "configure:35186: first found $tmp_search_results " >&5
+	echo "configure:35238: first found $tmp_search_results " >&5
 	break
    fi
 done
@@ -36921,7 +36973,7 @@ fi
 
 
 if test "x$with_fastbit" != xno; then
-    FASTBIT_CPPFLAGS="-I$with_fastbit/include"
+    FASTBIT_CPPFLAGS="-I$with_fastbit/include/fastbit"
     FASTBIT_LDFLAGS="-L$with_fastbit/lib"
     FASTBIT_LIBS="-lfastbit"
 
@@ -37721,37 +37773,21 @@ if test -z "${HAVE_DATASPACES_TRUE}"; then
     ADIOSLIB_CFLAGS="${ADIOSLIB_CFLAGS}"
     ADIOSLIB_LDFLAGS="${ADIOSLIB_LDFLAGS} ${DATASPACES_LDFLAGS}"
     ADIOSLIB_LDADD="${ADIOSLIB_LDADD} ${DATASPACES_LIBS}"
-    ADIOSLIB_SEQ_CPPFLAGS="${ADIOSLIB_SEQ_CPPFLAGS} ${DATASPACES_CPPFLAGS}"
-    ADIOSLIB_SEQ_CFLAGS="${ADIOSLIB_SEQ_CFLAGS}"
-    ADIOSLIB_SEQ_LDFLAGS="${ADIOSLIB_SEQ_LDFLAGS} ${DATASPACES_LDFLAGS}"
-    ADIOSLIB_SEQ_LDADD="${ADIOSLIB_SEQ_LDADD} ${DATASPACES_LIBS}"
-    ADIOSREADLIB_CPPFLAGS="${ADIOSREADLIB_CPPFLAGS} ${DATASPACES_CPPFLAGS}"
+                    ADIOSREADLIB_CPPFLAGS="${ADIOSREADLIB_CPPFLAGS} ${DATASPACES_CPPFLAGS}"
     ADIOSREADLIB_CFLAGS="${ADIOSREADLIB_CFLAGS} ${DATASPACES_CFLAGS}"
     ADIOSREADLIB_LDFLAGS="${ADIOSREADLIB_LDFLAGS} ${DATASPACES_LDFLAGS}"
     ADIOSREADLIB_LDADD="${ADIOSREADLIB_LDADD} ${DATASPACES_LIBS}"
-    ADIOSREADLIB_SEQ_CPPFLAGS="${ADIOSREADLIB_SEQ_CPPFLAGS} ${DATASPACES_CPPFLAGS}"
-    ADIOSREADLIB_SEQ_CFLAGS="${ADIOSREADLIB_SEQ_CFLAGS} ${DATASPACES_CFLAGS}"
-    ADIOSREADLIB_SEQ_LDFLAGS="${ADIOSREADLIB_SEQ_LDFLAGS} ${DATASPACES_LDFLAGS}"
-    ADIOSREADLIB_SEQ_LDADD="${ADIOSREADLIB_SEQ_LDADD} ${DATASPACES_LIBS}"
-fi
+                fi
 if test -z "${HAVE_DIMES_TRUE}"; then
     ADIOSLIB_CPPFLAGS="${ADIOSLIB_CPPFLAGS} ${DIMES_CPPFLAGS}"
     ADIOSLIB_CFLAGS="${ADIOSLIB_CFLAGS}"
     ADIOSLIB_LDFLAGS="${ADIOSLIB_LDFLAGS} ${DIMES_LDFLAGS}"
     ADIOSLIB_LDADD="${ADIOSLIB_LDADD} ${DIMES_LIBS}"
-    ADIOSLIB_SEQ_CPPFLAGS="${ADIOSLIB_SEQ_CPPFLAGS} ${DIMES_CPPFLAGS}"
-    ADIOSLIB_SEQ_CFLAGS="${ADIOSLIB_SEQ_CFLAGS}"
-    ADIOSLIB_SEQ_LDFLAGS="${ADIOSLIB_SEQ_LDFLAGS} ${DIMES_LDFLAGS}"
-    ADIOSLIB_SEQ_LDADD="${ADIOSLIB_SEQ_LDADD} ${DIMES_LIBS}"
-    ADIOSREADLIB_CPPFLAGS="${ADIOSREADLIB_CPPFLAGS} ${DIMES_CPPFLAGS}"
+                    ADIOSREADLIB_CPPFLAGS="${ADIOSREADLIB_CPPFLAGS} ${DIMES_CPPFLAGS}"
     ADIOSREADLIB_CFLAGS="${ADIOSREADLIB_CFLAGS} ${DIMES_CFLAGS}"
     ADIOSREADLIB_LDFLAGS="${ADIOSREADLIB_LDFLAGS} ${DIMES_LDFLAGS}"
     ADIOSREADLIB_LDADD="${ADIOSREADLIB_LDADD} ${DIMES_LIBS}"
-    ADIOSREADLIB_SEQ_CPPFLAGS="${ADIOSREADLIB_SEQ_CPPFLAGS} ${DIMES_CPPFLAGS}"
-    ADIOSREADLIB_SEQ_CFLAGS="${ADIOSREADLIB_SEQ_CFLAGS} ${DIMES_CFLAGS}"
-    ADIOSREADLIB_SEQ_LDFLAGS="${ADIOSREADLIB_SEQ_LDFLAGS} ${DIMES_LDFLAGS}"
-    ADIOSREADLIB_SEQ_LDADD="${ADIOSREADLIB_SEQ_LDADD} ${DIMES_LIBS}"
-fi
+                fi
 if test -z "${HAVE_NSSI_TRUE}"; then
     ADIOSLIB_CPPFLAGS="${ADIOSLIB_CPPFLAGS} ${NSSI_CPPFLAGS}"
     ADIOSLIB_CFLAGS="${ADIOSLIB_CFLAGS} ${NSSI_CFLAGS}"
@@ -38228,26 +38264,14 @@ _ACEOF
 fi
 
 VERSION_MAJOR=`echo ${VERSION} | sed -e "s/\..*//"`
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION_MAJOR ${VERSION_MAJOR}
-_ACEOF
-
 VERSION_MINOR=`echo ${VERSION} | sed -e "s/[0-9]*\.\([0-9]*\).*/\1/"`
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION_MINOR ${VERSION_MINOR}
-_ACEOF
-
 VERSION_MICRO=`echo ${VERSION} | sed -e "s/[0-9]*\.[0-9]*\.\([0-9]*\).*/\1/"`
 VERSION_MICRO=`echo ${VERSION_MICRO} | sed -e "s/${VERSION}//"`
 if test -z "${VERSION_MICRO}"; then
     VERSION_MICRO=0
 fi
 
-cat >>confdefs.h <<_ACEOF
-#define VERSION_MICRO ${VERSION_MICRO}
-_ACEOF
+
 
 
 # Get the version of the source we are configuring here
@@ -38263,7 +38287,7 @@ _ACEOF
 
 
 
-ac_config_files="$ac_config_files Makefile src/Makefile tests/Makefile tests/C/Makefile tests/C/flexpath_tests/Makefile tests/C/flexpath_tests/1D_arr_global/Makefile tests/C/flexpath_tests/1D_arr_global_noxml/Makefile tests/C/flexpath_tests/global_range_select/Makefile tests/C/flexpath_tests/maya_noxml/Makefile tests/C/flexpath_tests/maya_append/Makefile tests/C/flexpath_tests/scalar/Makefile tests/C/fgr_tests/Makefile tests/C/query/Makefile tests/C/query/common/Makefile tests/C/query/fa [...]
+ac_config_files="$ac_config_files Makefile src/Makefile tests/Makefile tests/C/Makefile tests/C/flexpath_tests/Makefile tests/C/flexpath_tests/1D_arr_global/Makefile tests/C/flexpath_tests/1D_arr_global_noxml/Makefile tests/C/flexpath_tests/global_range_select/Makefile tests/C/flexpath_tests/maya_noxml/Makefile tests/C/flexpath_tests/maya_append/Makefile tests/C/flexpath_tests/scalar/Makefile tests/C/fgr_tests/Makefile tests/C/query/Makefile tests/C/query/common/Makefile tests/C/query/fa [...]
 
 
 cat >confcache <<\_ACEOF
@@ -39673,7 +39697,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by adios $as_me 1.8.0, which was
+This file was extended by adios $as_me 1.9.0, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -39736,7 +39760,7 @@ Report bugs to <bug-autoconf at gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_version="\\
-adios config.status 1.8.0
+adios config.status 1.9.0
 configured by $0, generated by GNU Autoconf 2.63,
   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
@@ -40318,6 +40342,12 @@ do
     "tests/bp_read/Makefile") CONFIG_FILES="$CONFIG_FILES tests/bp_read/Makefile" ;;
     "tests/suite/Makefile") CONFIG_FILES="$CONFIG_FILES tests/suite/Makefile" ;;
     "tests/suite/programs/Makefile") CONFIG_FILES="$CONFIG_FILES tests/suite/programs/Makefile" ;;
+    "tests/suite/programs/examples/Makefile") CONFIG_FILES="$CONFIG_FILES tests/suite/programs/examples/Makefile" ;;
+    "tests/suite/programs/examples/attributes/Makefile") CONFIG_FILES="$CONFIG_FILES tests/suite/programs/examples/attributes/Makefile" ;;
+    "tests/suite/programs/examples/scalars/Makefile") CONFIG_FILES="$CONFIG_FILES tests/suite/programs/examples/scalars/Makefile" ;;
+    "tests/suite/programs/examples/local_array/Makefile") CONFIG_FILES="$CONFIG_FILES tests/suite/programs/examples/local_array/Makefile" ;;
+    "tests/suite/programs/examples/global_array/Makefile") CONFIG_FILES="$CONFIG_FILES tests/suite/programs/examples/global_array/Makefile" ;;
+    "tests/suite/programs/examples/global_array_time/Makefile") CONFIG_FILES="$CONFIG_FILES tests/suite/programs/examples/global_array_time/Makefile" ;;
     "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
     "utils/skeldump/Makefile") CONFIG_FILES="$CONFIG_FILES utils/skeldump/Makefile" ;;
     "utils/skel/Makefile") CONFIG_FILES="$CONFIG_FILES utils/skel/Makefile" ;;
@@ -40336,6 +40366,7 @@ do
     "utils/bp2bp/Makefile") CONFIG_FILES="$CONFIG_FILES utils/bp2bp/Makefile" ;;
     "utils/list_methods/Makefile") CONFIG_FILES="$CONFIG_FILES utils/list_methods/Makefile" ;;
     "utils/bpmeta/Makefile") CONFIG_FILES="$CONFIG_FILES utils/bpmeta/Makefile" ;;
+    "utils/bprecover/Makefile") CONFIG_FILES="$CONFIG_FILES utils/bprecover/Makefile" ;;
     "utils/fastbit/Makefile") CONFIG_FILES="$CONFIG_FILES utils/fastbit/Makefile" ;;
     "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
     "examples/C/Makefile") CONFIG_FILES="$CONFIG_FILES examples/C/Makefile" ;;
@@ -40363,6 +40394,7 @@ do
     "examples/Fortran/schema/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Fortran/schema/Makefile" ;;
     "adios_config") CONFIG_FILES="$CONFIG_FILES adios_config" ;;
     "adios_config.flags") CONFIG_FILES="$CONFIG_FILES adios_config.flags" ;;
+    "src/public/adios_version.h") CONFIG_FILES="$CONFIG_FILES src/public/adios_version.h" ;;
 
   *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
 $as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
diff --git a/configure.ac b/configure.ac
index 320d5fb..ae92d02 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,4 @@
-s
-AC_INIT([adios], [1.8.0])
+AC_INIT([adios], [1.9.0])
 AC_CONFIG_SRCDIR([configure.ac])
 AC_CONFIG_AUX_DIR(config)
 AC_CONFIG_MACRO_DIR(config)
@@ -247,36 +246,36 @@ if test -z "${HAVE_DATASPACES_TRUE}"; then
     ADIOSLIB_CFLAGS="${ADIOSLIB_CFLAGS}"
     ADIOSLIB_LDFLAGS="${ADIOSLIB_LDFLAGS} ${DATASPACES_LDFLAGS}"
     ADIOSLIB_LDADD="${ADIOSLIB_LDADD} ${DATASPACES_LIBS}"
-    ADIOSLIB_SEQ_CPPFLAGS="${ADIOSLIB_SEQ_CPPFLAGS} ${DATASPACES_CPPFLAGS}"
-    ADIOSLIB_SEQ_CFLAGS="${ADIOSLIB_SEQ_CFLAGS}"
-    ADIOSLIB_SEQ_LDFLAGS="${ADIOSLIB_SEQ_LDFLAGS} ${DATASPACES_LDFLAGS}"
-    ADIOSLIB_SEQ_LDADD="${ADIOSLIB_SEQ_LDADD} ${DATASPACES_LIBS}"
+    dnl ADIOSLIB_SEQ_CPPFLAGS="${ADIOSLIB_SEQ_CPPFLAGS} ${DATASPACES_CPPFLAGS}"
+    dnl ADIOSLIB_SEQ_CFLAGS="${ADIOSLIB_SEQ_CFLAGS}"
+    dnl ADIOSLIB_SEQ_LDFLAGS="${ADIOSLIB_SEQ_LDFLAGS} ${DATASPACES_LDFLAGS}"
+    dnl ADIOSLIB_SEQ_LDADD="${ADIOSLIB_SEQ_LDADD} ${DATASPACES_LIBS}"
     ADIOSREADLIB_CPPFLAGS="${ADIOSREADLIB_CPPFLAGS} ${DATASPACES_CPPFLAGS}"
     ADIOSREADLIB_CFLAGS="${ADIOSREADLIB_CFLAGS} ${DATASPACES_CFLAGS}"
     ADIOSREADLIB_LDFLAGS="${ADIOSREADLIB_LDFLAGS} ${DATASPACES_LDFLAGS}"
     ADIOSREADLIB_LDADD="${ADIOSREADLIB_LDADD} ${DATASPACES_LIBS}"
-    ADIOSREADLIB_SEQ_CPPFLAGS="${ADIOSREADLIB_SEQ_CPPFLAGS} ${DATASPACES_CPPFLAGS}"
-    ADIOSREADLIB_SEQ_CFLAGS="${ADIOSREADLIB_SEQ_CFLAGS} ${DATASPACES_CFLAGS}"
-    ADIOSREADLIB_SEQ_LDFLAGS="${ADIOSREADLIB_SEQ_LDFLAGS} ${DATASPACES_LDFLAGS}"
-    ADIOSREADLIB_SEQ_LDADD="${ADIOSREADLIB_SEQ_LDADD} ${DATASPACES_LIBS}"
+    dnl ADIOSREADLIB_SEQ_CPPFLAGS="${ADIOSREADLIB_SEQ_CPPFLAGS} ${DATASPACES_CPPFLAGS}"
+    dnl ADIOSREADLIB_SEQ_CFLAGS="${ADIOSREADLIB_SEQ_CFLAGS} ${DATASPACES_CFLAGS}"
+    dnl ADIOSREADLIB_SEQ_LDFLAGS="${ADIOSREADLIB_SEQ_LDFLAGS} ${DATASPACES_LDFLAGS}"
+    dnl ADIOSREADLIB_SEQ_LDADD="${ADIOSREADLIB_SEQ_LDADD} ${DATASPACES_LIBS}"
 fi
 if test -z "${HAVE_DIMES_TRUE}"; then
     ADIOSLIB_CPPFLAGS="${ADIOSLIB_CPPFLAGS} ${DIMES_CPPFLAGS}"
     ADIOSLIB_CFLAGS="${ADIOSLIB_CFLAGS}"
     ADIOSLIB_LDFLAGS="${ADIOSLIB_LDFLAGS} ${DIMES_LDFLAGS}"
     ADIOSLIB_LDADD="${ADIOSLIB_LDADD} ${DIMES_LIBS}"
-    ADIOSLIB_SEQ_CPPFLAGS="${ADIOSLIB_SEQ_CPPFLAGS} ${DIMES_CPPFLAGS}"
-    ADIOSLIB_SEQ_CFLAGS="${ADIOSLIB_SEQ_CFLAGS}"
-    ADIOSLIB_SEQ_LDFLAGS="${ADIOSLIB_SEQ_LDFLAGS} ${DIMES_LDFLAGS}"
-    ADIOSLIB_SEQ_LDADD="${ADIOSLIB_SEQ_LDADD} ${DIMES_LIBS}"
+    dnl ADIOSLIB_SEQ_CPPFLAGS="${ADIOSLIB_SEQ_CPPFLAGS} ${DIMES_CPPFLAGS}"
+    dnl ADIOSLIB_SEQ_CFLAGS="${ADIOSLIB_SEQ_CFLAGS}"
+    dnl ADIOSLIB_SEQ_LDFLAGS="${ADIOSLIB_SEQ_LDFLAGS} ${DIMES_LDFLAGS}"
+    dnl ADIOSLIB_SEQ_LDADD="${ADIOSLIB_SEQ_LDADD} ${DIMES_LIBS}"
     ADIOSREADLIB_CPPFLAGS="${ADIOSREADLIB_CPPFLAGS} ${DIMES_CPPFLAGS}"
     ADIOSREADLIB_CFLAGS="${ADIOSREADLIB_CFLAGS} ${DIMES_CFLAGS}"
     ADIOSREADLIB_LDFLAGS="${ADIOSREADLIB_LDFLAGS} ${DIMES_LDFLAGS}"
     ADIOSREADLIB_LDADD="${ADIOSREADLIB_LDADD} ${DIMES_LIBS}"
-    ADIOSREADLIB_SEQ_CPPFLAGS="${ADIOSREADLIB_SEQ_CPPFLAGS} ${DIMES_CPPFLAGS}"
-    ADIOSREADLIB_SEQ_CFLAGS="${ADIOSREADLIB_SEQ_CFLAGS} ${DIMES_CFLAGS}"
-    ADIOSREADLIB_SEQ_LDFLAGS="${ADIOSREADLIB_SEQ_LDFLAGS} ${DIMES_LDFLAGS}"
-    ADIOSREADLIB_SEQ_LDADD="${ADIOSREADLIB_SEQ_LDADD} ${DIMES_LIBS}"
+    dnl ADIOSREADLIB_SEQ_CPPFLAGS="${ADIOSREADLIB_SEQ_CPPFLAGS} ${DIMES_CPPFLAGS}"
+    dnl ADIOSREADLIB_SEQ_CFLAGS="${ADIOSREADLIB_SEQ_CFLAGS} ${DIMES_CFLAGS}"
+    dnl ADIOSREADLIB_SEQ_LDFLAGS="${ADIOSREADLIB_SEQ_LDFLAGS} ${DIMES_LDFLAGS}"
+    dnl ADIOSREADLIB_SEQ_LDADD="${ADIOSREADLIB_SEQ_LDADD} ${DIMES_LIBS}"
 fi
 if test -z "${HAVE_NSSI_TRUE}"; then
     ADIOSLIB_CPPFLAGS="${ADIOSLIB_CPPFLAGS} ${NSSI_CPPFLAGS}"
@@ -740,16 +739,19 @@ fi
 
 dnl Generate major/minor/micro version numbers
 VERSION_MAJOR=[`echo ${VERSION} | sed -e "s/\..*//"`]
-AC_DEFINE_UNQUOTED(VERSION_MAJOR, ${VERSION_MAJOR}, [Major version number])
+dnl AC_DEFINE_UNQUOTED(VERSION_MAJOR, ${VERSION_MAJOR}, [Major version number])
 VERSION_MINOR=[`echo ${VERSION} | sed -e "s/[0-9]*\.\([0-9]*\).*/\1/"`]
-AC_DEFINE_UNQUOTED(VERSION_MINOR, ${VERSION_MINOR}, [Minor version number])
+dnl AC_DEFINE_UNQUOTED(VERSION_MINOR, ${VERSION_MINOR}, [Minor version number])
 VERSION_MICRO=[`echo ${VERSION} | sed -e "s/[0-9]*\.[0-9]*\.\([0-9]*\).*/\1/"`]
 dnl if micro not defined, here it equals to VERSION; do a minus
 VERSION_MICRO=`echo ${VERSION_MICRO} | sed -e "s/${VERSION}//"`
 if test -z "${VERSION_MICRO}"; then
     VERSION_MICRO=0
 fi
-AC_DEFINE_UNQUOTED(VERSION_MICRO, ${VERSION_MICRO}, [Micro version number])
+dnl AC_DEFINE_UNQUOTED(VERSION_MICRO, ${VERSION_MICRO}, [Micro version number])
+AC_SUBST(VERSION_MAJOR)
+AC_SUBST(VERSION_MINOR)
+AC_SUBST(VERSION_MICRO)
 
 # Get the version of the source we are configuring here
 # Just to print it out at the end of configure
@@ -785,6 +787,12 @@ AC_CONFIG_FILES([Makefile
                  tests/bp_read/Makefile
                  tests/suite/Makefile
                  tests/suite/programs/Makefile
+                 tests/suite/programs/examples/Makefile
+                 tests/suite/programs/examples/attributes/Makefile
+                 tests/suite/programs/examples/scalars/Makefile
+                 tests/suite/programs/examples/local_array/Makefile
+                 tests/suite/programs/examples/global_array/Makefile
+                 tests/suite/programs/examples/global_array_time/Makefile
                  utils/Makefile
                  utils/skeldump/Makefile
                  utils/skel/Makefile
@@ -803,6 +811,7 @@ AC_CONFIG_FILES([Makefile
                  utils/bp2bp/Makefile
                  utils/list_methods/Makefile
                  utils/bpmeta/Makefile
+                 utils/bprecover/Makefile
 		 utils/fastbit/Makefile
                  examples/Makefile
                  examples/C/Makefile
@@ -830,6 +839,7 @@ AC_CONFIG_FILES([Makefile
                  examples/Fortran/schema/Makefile
                  adios_config
                  adios_config.flags
+                 src/public/adios_version.h
                 ])
 
 AC_OUTPUT
diff --git a/examples/C/Makefile.in b/examples/C/Makefile.in
index 06616a0..a647c63 100644
--- a/examples/C/Makefile.in
+++ b/examples/C/Makefile.in
@@ -321,6 +321,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/examples/C/arrays/CMakeLists.txt b/examples/C/arrays/CMakeLists.txt
index f17ac03..c92f58e 100644
--- a/examples/C/arrays/CMakeLists.txt
+++ b/examples/C/arrays/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/arrays)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/arrays)
 
 add_executable(arrays_write arrays_write.c)
diff --git a/examples/C/arrays/Makefile.am b/examples/C/arrays/Makefile.am
index ccdc43a..1361f6a 100644
--- a/examples/C/arrays/Makefile.am
+++ b/examples/C/arrays/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/arrays/Makefile.in b/examples/C/arrays/Makefile.in
index 699cc25..6c51acf 100644
--- a/examples/C/arrays/Makefile.in
+++ b/examples/C/arrays/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 arrays_write_SOURCES = arrays_write.c
 arrays_write_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/examples/C/attributes/CMakeLists.txt b/examples/C/attributes/CMakeLists.txt
index 298a0b3..357a7dc 100644
--- a/examples/C/attributes/CMakeLists.txt
+++ b/examples/C/attributes/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/attributes)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/attributes)
 
 add_executable(attributes_write attributes_write.c)
diff --git a/examples/C/attributes/Makefile.am b/examples/C/attributes/Makefile.am
index 7b7253c..c70cc26 100644
--- a/examples/C/attributes/Makefile.am
+++ b/examples/C/attributes/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/attributes/Makefile.in b/examples/C/attributes/Makefile.in
index 90126cd..d646522 100644
--- a/examples/C/attributes/Makefile.in
+++ b/examples/C/attributes/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 attributes_write_SOURCES = attributes_write.c
 attributes_write_LDADD = $(top_builddir)/src/libadios.a \
diff --git a/examples/C/attributes/attributes_read.c b/examples/C/attributes/attributes_read.c
index d032252..222a7d6 100644
--- a/examples/C/attributes/attributes_read.c
+++ b/examples/C/attributes/attributes_read.c
@@ -44,20 +44,33 @@ int main (int argc, char ** argv)
         adios_get_attr (f, f->attr_namelist[i], &attr_type, &attr_size, &data);
 
         printf ("rank %d: attr: %s %s = ", rank, adios_type_to_string(attr_type), f->attr_namelist[i]);
-        switch (attr_type)  
+        int type_size = adios_type_size (attr_type, data);
+        int nelems = attr_size / type_size;
+        int k;
+        char *p = (char*)data;
+        for (k=0; k<nelems; k++) 
         {
-            case adios_integer:
-                printf ("%d\n", *(int *)data);
-                break;
-            case adios_double:
-                printf ("%e\n", *(double *)data);
-                break;
-            case adios_string:
-                printf ("%s\n", (char *)data);
-                break;
-            default:
-                printf ("??????\n");
+            if (k>0) printf(", ");
+            switch (attr_type)  
+            {
+                case adios_integer:
+                    printf ("%d", *(int *)p);
+                    break;
+                case adios_double:
+                    printf ("%e", *(double *)p);
+                    break;
+                case adios_string:
+                    printf ("\"%s\"", (char *)p);
+                    break;
+                case adios_string_array:
+                    printf ("\"%s\"", *(char **)p);
+                    break;
+                default:
+                    printf ("??????\n");
+            }
+            p=p+type_size;
         }
+        printf("\n");
         free (data);
         data = 0;
     }
diff --git a/examples/C/flexpath_arrays/Makefile.in b/examples/C/flexpath_arrays/Makefile.in
index a60fd5e..33bafbd 100644
--- a/examples/C/flexpath_arrays/Makefile.in
+++ b/examples/C/flexpath_arrays/Makefile.in
@@ -321,6 +321,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/examples/C/flexpath_arrays/global_range_select/CMakeLists.txt b/examples/C/flexpath_arrays/global_range_select/CMakeLists.txt
index ef4896f..1967674 100644
--- a/examples/C/flexpath_arrays/global_range_select/CMakeLists.txt
+++ b/examples/C/flexpath_arrays/global_range_select/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/flexpath_arrays/global_range_select)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/flexpath_arrays/global_range_select)
 
 add_executable(global_arrays_write arrays_write.c)
diff --git a/examples/C/flexpath_arrays/global_range_select/Makefile.am b/examples/C/flexpath_arrays/global_range_select/Makefile.am
index 4578c7c..9c7e77c 100644
--- a/examples/C/flexpath_arrays/global_range_select/Makefile.am
+++ b/examples/C/flexpath_arrays/global_range_select/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/flexpath_arrays/global_range_select/Makefile.in b/examples/C/flexpath_arrays/global_range_select/Makefile.in
index 525e5d5..b4b9582 100644
--- a/examples/C/flexpath_arrays/global_range_select/Makefile.in
+++ b/examples/C/flexpath_arrays/global_range_select/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 arrays_write_SOURCES = arrays_write.c
 arrays_write_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/examples/C/flexpath_arrays/process_select/CMakeLists.txt b/examples/C/flexpath_arrays/process_select/CMakeLists.txt
index 5bb71b8..5351cbd 100644
--- a/examples/C/flexpath_arrays/process_select/CMakeLists.txt
+++ b/examples/C/flexpath_arrays/process_select/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/flexpath_arrays/process_select)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/flexpath_arrays/process_select)
 
 add_executable(select_arrays_write arrays_write.c)
diff --git a/examples/C/flexpath_arrays/process_select/Makefile.am b/examples/C/flexpath_arrays/process_select/Makefile.am
index 0345f82..4b24454 100644
--- a/examples/C/flexpath_arrays/process_select/Makefile.am
+++ b/examples/C/flexpath_arrays/process_select/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/flexpath_arrays/process_select/Makefile.in b/examples/C/flexpath_arrays/process_select/Makefile.in
index 73b99bd..4a773b5 100644
--- a/examples/C/flexpath_arrays/process_select/Makefile.in
+++ b/examples/C/flexpath_arrays/process_select/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 arrays_write_SOURCES = arrays_write.c
 arrays_write_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/examples/C/global-array-time/CMakeLists.txt b/examples/C/global-array-time/CMakeLists.txt
index 14bd686..d95dc06 100644
--- a/examples/C/global-array-time/CMakeLists.txt
+++ b/examples/C/global-array-time/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/global-array-time)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/global-array-time)
 
 add_executable(adios_globaltime adios_globaltime.c)
diff --git a/examples/C/global-array-time/Makefile.am b/examples/C/global-array-time/Makefile.am
index d71d2ea..26ce27c 100644
--- a/examples/C/global-array-time/Makefile.am
+++ b/examples/C/global-array-time/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/global-array-time/Makefile.in b/examples/C/global-array-time/Makefile.in
index 7bab32b..88de1b8 100644
--- a/examples/C/global-array-time/Makefile.in
+++ b/examples/C/global-array-time/Makefile.in
@@ -341,6 +341,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -398,8 +401,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 adios_globaltime_SOURCES = adios_globaltime.c
 adios_globaltime_LDADD = $(top_builddir)/src/libadios.a \
diff --git a/examples/C/global-array/CMakeLists.txt b/examples/C/global-array/CMakeLists.txt
index 99abc4f..9c38db4 100644
--- a/examples/C/global-array/CMakeLists.txt
+++ b/examples/C/global-array/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/global-array)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/global-array)
 
 add_executable(adios_global adios_global.c)
diff --git a/examples/C/global-array/Makefile.am b/examples/C/global-array/Makefile.am
index 639c16c..fc5b5e8 100644
--- a/examples/C/global-array/Makefile.am
+++ b/examples/C/global-array/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/global-array/Makefile.in b/examples/C/global-array/Makefile.in
index ea1df9c..16d6fc7 100644
--- a/examples/C/global-array/Makefile.in
+++ b/examples/C/global-array/Makefile.in
@@ -398,6 +398,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -455,8 +458,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 adios_global_SOURCES = adios_global.c
 adios_global_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/examples/C/global-array/adios_global.xml b/examples/C/global-array/adios_global.xml
index a3cfd4d..8edc5ca 100644
--- a/examples/C/global-array/adios_global.xml
+++ b/examples/C/global-array/adios_global.xml
@@ -6,7 +6,7 @@
     <var name="rank" type="integer"/>
     <global-bounds dimensions="size,NX" offsets="rank,0">
        <var name="temperature" gwrite="t" type="double" dimensions="1,NX" 
-            transform="identity"/>
+            transform="none"/>
     </global-bounds>
     <attribute name="temperature/description" 
                value="Global array written from 'size' processes" 
diff --git a/examples/C/global-array/no_xml_write_byid.c b/examples/C/global-array/no_xml_write_byid.c
index 2b6cbf9..2429c4c 100644
--- a/examples/C/global-array/no_xml_write_byid.c
+++ b/examples/C/global-array/no_xml_write_byid.c
@@ -38,6 +38,9 @@ int main (int argc, char ** argv)
         int         nblocks = 3;
 	MPI_Comm    comm = MPI_COMM_WORLD;
         char g_str[100], o_str[100], l_str[100];
+        // attributes (from C variables)
+        int someints[5] = {5,4,3,2,1};
+        double somedoubles[5] = {5.55555, 4.4444, 3.333, 2.22, 1.1};
 
 	/* ADIOS variables declarations for matching gwrite_temperature.ch */
 	uint64_t    adios_groupsize, adios_totalsize;
@@ -70,9 +73,26 @@ int main (int argc, char ** argv)
                                           ,"", adios_double
                                           ,l_str, g_str, o_str
                                           );
-            adios_set_transform (var_ids[i], "identity");
+            adios_set_transform (var_ids[i], "none");
         }
-   
+
+        // add some attributes
+        adios_define_attribute_byvalue (m_adios_group, 
+                "single_string","", adios_string,  1, "A single string attribute");
+        char *strings[] = {"X","Yy","ZzZ"};
+        adios_define_attribute_byvalue (m_adios_group, 
+                "three_strings","", adios_string_array,  3, strings);
+        adios_define_attribute_byvalue (m_adios_group, 
+                "single_int",   "", adios_integer, 1, &someints);
+        adios_define_attribute_byvalue (m_adios_group, 
+                "single_double","", adios_double,  1, &somedoubles);
+        adios_define_attribute_byvalue (m_adios_group, 
+                "five_ints",    "", adios_integer, 5, &someints);
+        adios_define_attribute_byvalue (m_adios_group, 
+                "five_double",  "", adios_double,  5, &somedoubles);
+
+
+
         adios_open (&m_adios_file, "restart", filename, "w", comm);
 
         adios_groupsize = nblocks * (4 + 4 + 4 + NX * 8);
diff --git a/examples/C/icee_arrays/Makefile.in b/examples/C/icee_arrays/Makefile.in
index a642cab..1e1cdda 100644
--- a/examples/C/icee_arrays/Makefile.in
+++ b/examples/C/icee_arrays/Makefile.in
@@ -321,6 +321,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/examples/C/icee_arrays/array/CMakeLists.txt b/examples/C/icee_arrays/array/CMakeLists.txt
index 199180b..1c81fcc 100644
--- a/examples/C/icee_arrays/array/CMakeLists.txt
+++ b/examples/C/icee_arrays/array/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/icee_arrays/array)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/icee_arrays/array)
 
 add_executable(adios_write adios_write.c)
diff --git a/examples/C/icee_arrays/array/Makefile.am b/examples/C/icee_arrays/array/Makefile.am
index 1f6bb96..3658f0c 100644
--- a/examples/C/icee_arrays/array/Makefile.am
+++ b/examples/C/icee_arrays/array/Makefile.am
@@ -1,5 +1,5 @@
 INCLUDES = $(all_includes)
-INCLUDES += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+INCLUDES += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/icee_arrays/array/Makefile.in b/examples/C/icee_arrays/array/Makefile.in
index 6af8141..682b6d1 100644
--- a/examples/C/icee_arrays/array/Makefile.in
+++ b/examples/C/icee_arrays/array/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-INCLUDES = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+INCLUDES = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 adios_write_SOURCES = adios_write.c
 adios_write_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/examples/C/manual/CMakeLists.txt b/examples/C/manual/CMakeLists.txt
index 1604c70..b2c0a96 100644
--- a/examples/C/manual/CMakeLists.txt
+++ b/examples/C/manual/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/manual)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/manual)
 
 set (PROGS 1_nonadios_example 2_adios_write 3_adios_read 4_adios_nfiles)
diff --git a/examples/C/manual/Makefile.am b/examples/C/manual/Makefile.am
index 4e92193..dcadff0 100644
--- a/examples/C/manual/Makefile.am
+++ b/examples/C/manual/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/manual/Makefile.in b/examples/C/manual/Makefile.in
index 9272595..9481d5d 100644
--- a/examples/C/manual/Makefile.in
+++ b/examples/C/manual/Makefile.in
@@ -330,6 +330,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -387,8 +390,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 1_nonadios_example_SOURCES = 1_nonadios_example.c
 1_nonadios_example_LDADD = $(top_builddir)/src/libadios.a \
diff --git a/examples/C/query/CMakeLists.txt b/examples/C/query/CMakeLists.txt
index a999b6d..fb49fee 100644
--- a/examples/C/query/CMakeLists.txt
+++ b/examples/C/query/CMakeLists.txt
@@ -1,5 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/query)
 
 add_executable(write_vars write_vars.c)
diff --git a/examples/C/query/Makefile.am b/examples/C/query/Makefile.am
index 43791fd..8f6c02b 100644
--- a/examples/C/query/Makefile.am
+++ b/examples/C/query/Makefile.am
@@ -1,5 +1,5 @@
 INCLUDES = $(all_includes)
-INCLUDES += -I$(top_srcdir)/src/public -I$(top_srcdir)/src/query
+INCLUDES += -I$(top_builddir)/src/public  -I$(top_srcdir)/src/public -I$(top_srcdir)/src/query
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/query/Makefile.in b/examples/C/query/Makefile.in
index fb60e87..fd8d467 100644
--- a/examples/C/query/Makefile.in
+++ b/examples/C/query/Makefile.in
@@ -330,6 +330,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -387,8 +390,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-INCLUDES = $(all_includes) -I$(top_srcdir)/src/public \
-	-I$(top_srcdir)/src/query
+INCLUDES = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src/public -I$(top_srcdir)/src/query
 AUTOMAKE_OPTIONS = no-dependencies
 write_vars_SOURCES = write_vars.c
 write_vars_LDADD = $(top_builddir)/src/libadios_nompi.a \
diff --git a/examples/C/read_all/CMakeLists.txt b/examples/C/read_all/CMakeLists.txt
index bc581e9..c87d31d 100644
--- a/examples/C/read_all/CMakeLists.txt
+++ b/examples/C/read_all/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/read_all)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/read_all)
 
 add_executable(read_all read_all.c)
diff --git a/examples/C/read_all/Makefile.am b/examples/C/read_all/Makefile.am
index af63728..95464db 100644
--- a/examples/C/read_all/Makefile.am
+++ b/examples/C/read_all/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/read_all/Makefile.in b/examples/C/read_all/Makefile.in
index 616099b..ac26962 100644
--- a/examples/C/read_all/Makefile.in
+++ b/examples/C/read_all/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 read_all_SOURCES = read_all.c
 read_all_CPPFLAGS = ${MACRODEFFLAG}_NOMPI $(AM_CPPFLAGS)
diff --git a/examples/C/scalars/CMakeLists.txt b/examples/C/scalars/CMakeLists.txt
index 0f2dcc2..92afc80 100644
--- a/examples/C/scalars/CMakeLists.txt
+++ b/examples/C/scalars/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/scalars)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/scalars)
 
 add_executable(scalars_write scalars_write.c)
diff --git a/examples/C/scalars/Makefile.am b/examples/C/scalars/Makefile.am
index 12207c1..137e8af 100644
--- a/examples/C/scalars/Makefile.am
+++ b/examples/C/scalars/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/scalars/Makefile.in b/examples/C/scalars/Makefile.in
index 69c2509..4b3b7d6 100644
--- a/examples/C/scalars/Makefile.in
+++ b/examples/C/scalars/Makefile.in
@@ -323,6 +323,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -380,8 +383,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 scalars_write_SOURCES = scalars_write.c
 scalars_write_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/examples/C/schema/CMakeLists.txt b/examples/C/schema/CMakeLists.txt
index 665135b..d2a0202 100644
--- a/examples/C/schema/CMakeLists.txt
+++ b/examples/C/schema/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/schema)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/schema)
 
 add_executable(uniform2d uniform2d.c)
diff --git a/examples/C/schema/Makefile.am b/examples/C/schema/Makefile.am
index 71bd796..50ece6d 100644
--- a/examples/C/schema/Makefile.am
+++ b/examples/C/schema/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/schema/Makefile.in b/examples/C/schema/Makefile.in
index 7f2f8bb..bef4cf4 100644
--- a/examples/C/schema/Makefile.in
+++ b/examples/C/schema/Makefile.in
@@ -371,6 +371,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -428,8 +431,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 uniform2d_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
 uniform2d_LDFLAGS = $(ADIOSLIB_LDFLAGS)
diff --git a/examples/C/stat/CMakeLists.txt b/examples/C/stat/CMakeLists.txt
index c819f5f..0350eb6 100644
--- a/examples/C/stat/CMakeLists.txt
+++ b/examples/C/stat/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/stat)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/stat)
 
 add_executable(stat_write stat_write.c)
diff --git a/examples/C/stat/Makefile.am b/examples/C/stat/Makefile.am
index 4fd8509..39bc00f 100644
--- a/examples/C/stat/Makefile.am
+++ b/examples/C/stat/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/stat/Makefile.in b/examples/C/stat/Makefile.in
index 5a6bb66..32485de 100644
--- a/examples/C/stat/Makefile.in
+++ b/examples/C/stat/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 stat_write_SOURCES = stat_write.c
 stat_write_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/examples/C/transforms/CMakeLists.txt b/examples/C/transforms/CMakeLists.txt
index d1c5011..98ea6c2 100644
--- a/examples/C/transforms/CMakeLists.txt
+++ b/examples/C/transforms/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/examples/C/transforms)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/examples/C/transforms)
 
 add_executable(transforms_adios_global adios_global.c)
diff --git a/examples/C/transforms/Makefile.am b/examples/C/transforms/Makefile.am
index 85951fc..f9a3690 100644
--- a/examples/C/transforms/Makefile.am
+++ b/examples/C/transforms/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public $(TIMER_CPPFLAGS)
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public $(TIMER_CPPFLAGS)
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/C/transforms/Makefile.in b/examples/C/transforms/Makefile.in
index aad0c9c..d631626 100644
--- a/examples/C/transforms/Makefile.in
+++ b/examples/C/transforms/Makefile.in
@@ -330,6 +330,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -387,8 +390,9 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public $(TIMER_CPPFLAGS)
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public \
+	$(TIMER_CPPFLAGS)
 AUTOMAKE_OPTIONS = no-dependencies
 adios_global_SOURCES = adios_global.c
 adios_global_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/examples/Fortran/Makefile.in b/examples/Fortran/Makefile.in
index 26a22d6..9e6465f 100644
--- a/examples/Fortran/Makefile.in
+++ b/examples/Fortran/Makefile.in
@@ -321,6 +321,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/examples/Fortran/arrays/CMakeLists.txt b/examples/Fortran/arrays/CMakeLists.txt
index 4a9164a..6089dc7 100644
--- a/examples/Fortran/arrays/CMakeLists.txt
+++ b/examples/Fortran/arrays/CMakeLists.txt
@@ -1,6 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
-include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/examples/Fortran/arrays)
 link_directories(${PROJECT_BINARY_DIR}/examples/Fortran/arrays)
 
diff --git a/examples/Fortran/arrays/Makefile.am b/examples/Fortran/arrays/Makefile.am
index 3688588..355e3b4 100644
--- a/examples/Fortran/arrays/Makefile.am
+++ b/examples/Fortran/arrays/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_builddir)/src
+AM_CPPFLAGS += -I$(top_builddir)/src/public  -I$(top_builddir)/src
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/Fortran/arrays/Makefile.in b/examples/Fortran/arrays/Makefile.in
index a41660e..1995213 100644
--- a/examples/Fortran/arrays/Makefile.in
+++ b/examples/Fortran/arrays/Makefile.in
@@ -310,6 +310,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -367,7 +370,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_builddir)/src
 AUTOMAKE_OPTIONS = no-dependencies
 arrays_write_SOURCES = arrays_write.F90
 arrays_write_LDADD = $(top_builddir)/src/libadiosf.a $(ADIOSLIB_LDADD)
diff --git a/examples/Fortran/global-array-time/CMakeLists.txt b/examples/Fortran/global-array-time/CMakeLists.txt
index badcc2b..a1e4303 100644
--- a/examples/Fortran/global-array-time/CMakeLists.txt
+++ b/examples/Fortran/global-array-time/CMakeLists.txt
@@ -1,6 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
-include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/examples/Fortran/global-array-time)
 link_directories(${PROJECT_BINARY_DIR}/examples/Fortran/global-array-time)
 
diff --git a/examples/Fortran/global-array-time/Makefile.am b/examples/Fortran/global-array-time/Makefile.am
index 929a4ac..59247a5 100644
--- a/examples/Fortran/global-array-time/Makefile.am
+++ b/examples/Fortran/global-array-time/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_builddir)/src
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_builddir)/src
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/Fortran/global-array-time/Makefile.in b/examples/Fortran/global-array-time/Makefile.in
index 375defb..066eee9 100644
--- a/examples/Fortran/global-array-time/Makefile.in
+++ b/examples/Fortran/global-array-time/Makefile.in
@@ -303,6 +303,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -360,7 +363,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_builddir)/src
 AUTOMAKE_OPTIONS = no-dependencies
 adios_globaltime_SOURCES = adios_globaltime.F90
 adios_globaltime_LDADD = $(top_builddir)/src/libadiosf.a \
diff --git a/examples/Fortran/global-array/CMakeLists.txt b/examples/Fortran/global-array/CMakeLists.txt
index 87fc05a..b52d4a0 100644
--- a/examples/Fortran/global-array/CMakeLists.txt
+++ b/examples/Fortran/global-array/CMakeLists.txt
@@ -1,6 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
-include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src  ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/examples/Fortran/global-array)
 link_directories(${PROJECT_BINARY_DIR}/examples/Fortran/global-array)
 
diff --git a/examples/Fortran/global-array/Makefile.am b/examples/Fortran/global-array/Makefile.am
index cb350ed..3abd135 100644
--- a/examples/Fortran/global-array/Makefile.am
+++ b/examples/Fortran/global-array/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_builddir)/src
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_builddir)/src
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/Fortran/global-array/Makefile.in b/examples/Fortran/global-array/Makefile.in
index a0ef697..f233372 100644
--- a/examples/Fortran/global-array/Makefile.in
+++ b/examples/Fortran/global-array/Makefile.in
@@ -320,6 +320,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -377,7 +380,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_builddir)/src
 AUTOMAKE_OPTIONS = no-dependencies
 adios_global_SOURCES = adios_global.F90
 adios_global_LDADD = $(top_builddir)/src/libadiosf.a $(ADIOSLIB_LDADD)
diff --git a/examples/Fortran/global-array/no_xml_write_byid.F90 b/examples/Fortran/global-array/no_xml_write_byid.F90
index 23dcc03..e2bce3b 100644
--- a/examples/Fortran/global-array/no_xml_write_byid.F90
+++ b/examples/Fortran/global-array/no_xml_write_byid.F90
@@ -29,6 +29,11 @@ program no_xml_write_byid
     integer*8               :: m_adios_group
     integer*8               :: var_id1, var_id2
     character(len=32)       :: local, global, offset
+    !! attributes (from C variables)
+    integer, dimension(5)   :: someints = (/ 5,4,3,2,1 /)
+    real*8, dimension(5)    :: somedoubles = (/ 5.55555, 4.4444, 3.333, 2.22, 1.1 /)
+    character(len=5), dimension(3) :: three_strings = (/ "X    ", "Yy   ", "ZzZ  " /)
+
 
     call MPI_Init (ierr)
     call MPI_Comm_dup (MPI_COMM_WORLD, comm, ierr)
@@ -65,6 +70,22 @@ program no_xml_write_byid
 
     call adios_set_transform (var_id2, "identity", adios_err)
 
+
+    !! add some attributes
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "single_string","", 1, "A single string attribute", adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "three_strings","", 3, three_strings, adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "single_int",   "", 1, someints, adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "single_double","", 1, somedoubles, adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "five_ints",    "", 5, someints, adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "five_double",  "", 5, somedoubles, adios_err)
+
+
     call adios_open (adios_handle, "restart", filename, "w", comm, adios_err)
 
     adios_groupsize =  NX * 8 &
diff --git a/examples/Fortran/scalars/CMakeLists.txt b/examples/Fortran/scalars/CMakeLists.txt
index 644adbc..5fed1e9 100644
--- a/examples/Fortran/scalars/CMakeLists.txt
+++ b/examples/Fortran/scalars/CMakeLists.txt
@@ -1,6 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
-include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/examples/Fortran/scalars)
 link_directories(${PROJECT_BINARY_DIR}/examples/Fortran/scalars)
 
diff --git a/examples/Fortran/scalars/Makefile.am b/examples/Fortran/scalars/Makefile.am
index 67e1eda..3ac9197 100644
--- a/examples/Fortran/scalars/Makefile.am
+++ b/examples/Fortran/scalars/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_builddir)/src
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_builddir)/src
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/Fortran/scalars/Makefile.in b/examples/Fortran/scalars/Makefile.in
index 5520f84..31b0ad1 100644
--- a/examples/Fortran/scalars/Makefile.in
+++ b/examples/Fortran/scalars/Makefile.in
@@ -310,6 +310,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -367,7 +370,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_builddir)/src
 AUTOMAKE_OPTIONS = no-dependencies
 scalars_write_SOURCES = scalars_write.F90
 scalars_write_LDADD = $(top_builddir)/src/libadiosf.a \
diff --git a/examples/Fortran/schema/CMakeLists.txt b/examples/Fortran/schema/CMakeLists.txt
index d4d8d48..4ceae9b 100644
--- a/examples/Fortran/schema/CMakeLists.txt
+++ b/examples/Fortran/schema/CMakeLists.txt
@@ -1,6 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
-include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/examples/Fortran/schema)
 link_directories(${PROJECT_BINARY_DIR}/examples/Fortran/schema)
 
diff --git a/examples/Fortran/schema/Makefile.am b/examples/Fortran/schema/Makefile.am
index 099c3df..2a41c5e 100644
--- a/examples/Fortran/schema/Makefile.am
+++ b/examples/Fortran/schema/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_builddir)/src
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_builddir)/src
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/examples/Fortran/schema/Makefile.in b/examples/Fortran/schema/Makefile.in
index 1e05a74..92e6e1c 100644
--- a/examples/Fortran/schema/Makefile.in
+++ b/examples/Fortran/schema/Makefile.in
@@ -337,6 +337,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -394,7 +397,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_builddir)/src
 AUTOMAKE_OPTIONS = no-dependencies
 uniform2d_f_noxml_SOURCES = uniform2d_noxml.F90
 uniform2d_f_noxml_LDADD = $(top_builddir)/src/libadiosf.a \
diff --git a/examples/Makefile.in b/examples/Makefile.in
index 62c8c58..c955f14 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -321,6 +321,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/examples/coupling/coupling_reader_2D.F90 b/examples/coupling/coupling_reader_2D.F90
index 20f10b9..cdc845d 100644
--- a/examples/coupling/coupling_reader_2D.F90
+++ b/examples/coupling/coupling_reader_2D.F90
@@ -291,12 +291,12 @@ subroutine processArgs()
     use adios_read_mod
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     character(len=256) :: npx_str, npy_str, method_str, mode_str, ts_str
diff --git a/examples/coupling/coupling_writer_2D.F90 b/examples/coupling/coupling_writer_2D.F90
index f47b8af..8badded 100644
--- a/examples/coupling/coupling_writer_2D.F90
+++ b/examples/coupling/coupling_writer_2D.F90
@@ -180,12 +180,12 @@ subroutine processArgs()
     use coupling_writer_2D_comm
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     character(len=256) :: npx_str, npy_str, npz_str, ldx_str, ldy_str, ldz_str, ts_str
diff --git a/examples/staging/stage_write/genarray_stream.F90 b/examples/staging/stage_write/genarray_stream.F90
index 494ea6f..e4a3fbd 100644
--- a/examples/staging/stage_write/genarray_stream.F90
+++ b/examples/staging/stage_write/genarray_stream.F90
@@ -257,12 +257,12 @@ subroutine processArgs()
     use genarray_stream_comm
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     character(len=256) :: npx_str, npy_str, npz_str, ndx_str, ndy_str, ndz_str
diff --git a/examples/staging/stage_write_varyingsize/decompose_block.o b/examples/staging/stage_write_varyingsize/decompose_block.o
new file mode 100644
index 0000000..282b12e
Binary files /dev/null and b/examples/staging/stage_write_varyingsize/decompose_block.o differ
diff --git a/examples/staging/stage_write_varyingsize/genarray_varying b/examples/staging/stage_write_varyingsize/genarray_varying
new file mode 100755
index 0000000..f36de26
Binary files /dev/null and b/examples/staging/stage_write_varyingsize/genarray_varying differ
diff --git a/examples/staging/stage_write_varyingsize/genarray_varying.F90 b/examples/staging/stage_write_varyingsize/genarray_varying.F90
index 021d956..387706c 100644
--- a/examples/staging/stage_write_varyingsize/genarray_varying.F90
+++ b/examples/staging/stage_write_varyingsize/genarray_varying.F90
@@ -271,12 +271,12 @@ subroutine processArgs()
     use genarray_varying_comm
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     character(len=256) :: npx_str, npy_str, npz_str, ndx_str, ndy_str, ndz_str
diff --git a/examples/staging/stage_write_varyingsize/genarray_varying.o b/examples/staging/stage_write_varyingsize/genarray_varying.o
new file mode 100644
index 0000000..2b8f39a
Binary files /dev/null and b/examples/staging/stage_write_varyingsize/genarray_varying.o differ
diff --git a/examples/staging/stage_write_varyingsize/genarray_varying_comm.mod b/examples/staging/stage_write_varyingsize/genarray_varying_comm.mod
new file mode 100644
index 0000000..2dac388
--- /dev/null
+++ b/examples/staging/stage_write_varyingsize/genarray_varying_comm.mod
@@ -0,0 +1,122 @@
+V27 0x4 genarray_varying_comm
+20 genarray_varying.F90 S622 0
+07/23/2015  08:59:31
+enduse
+D 56 18 12
+D 58 21 9 3 45 43 0 1 0 0 1
+ 19 23 37 19 23 21
+ 25 29 39 25 29 27
+ 31 35 41 31 35 33
+D 61 21 6 1 0 16 0 0 0 0 0
+ 0 16 0 3 16 0
+D 64 18 46
+S 622 24 0 0 0 8 1 0 5031 5 0 A 0 0 0 0 0 0 0 0 0 0 0 0 59 0 0 0 0 0 0 0 0 24 0 0 0 0 0 0 genarray_varying_comm
+S 623 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 256 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 624 6 4 0 0 56 625 622 5053 4 0 A 0 0 0 0 0 0 0 0 0 0 0 0 684 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 outputfile
+S 625 6 4 0 0 56 669 622 5064 4 0 A 0 0 0 0 0 256 0 0 0 0 0 0 684 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 inputfile
+S 626 6 4 0 0 6 627 622 5074 4 0 A 0 0 0 0 0 0 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 npx
+S 627 6 4 0 0 6 628 622 5078 4 0 A 0 0 0 0 0 4 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 npy
+S 628 6 4 0 0 6 629 622 5082 4 0 A 0 0 0 0 0 8 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 npz
+S 629 6 4 0 0 6 630 622 5086 4 0 A 0 0 0 0 0 12 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 ndx
+S 630 6 4 0 0 6 631 622 5090 4 0 A 0 0 0 0 0 16 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 ndy
+S 631 6 4 0 0 6 632 622 5094 4 0 A 0 0 0 0 0 20 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 ndz
+S 632 6 4 0 0 6 633 622 5098 4 0 A 0 0 0 0 0 24 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 timesteps
+S 633 6 4 0 0 6 634 622 5108 4 0 A 0 0 0 0 0 28 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 sleeptime
+S 634 6 4 0 0 16 635 622 5118 4 0 A 0 0 0 0 0 32 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 common_size
+S 635 6 4 0 0 6 636 622 5130 4 0 A 0 0 0 0 0 36 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 gndx
+S 636 6 4 0 0 6 637 622 5135 4 0 A 0 0 0 0 0 40 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 gndy
+S 637 6 4 0 0 6 638 622 5140 4 0 A 0 0 0 0 0 44 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 gndz
+S 638 6 4 0 0 6 639 622 5145 4 0 A 0 0 0 0 0 48 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 offx
+S 639 6 4 0 0 6 640 622 5150 4 0 A 0 0 0 0 0 52 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 offy
+S 640 6 4 0 0 6 641 622 5155 4 0 A 0 0 0 0 0 56 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 offz
+S 641 6 4 0 0 6 642 622 5160 40800006 0 A 0 0 0 0 0 60 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 z_b_0
+S 642 6 4 0 0 6 643 622 5166 40800006 0 A 0 0 0 0 0 64 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 z_b_1
+S 643 6 4 0 0 6 661 622 5172 40800006 0 A 0 0 0 0 0 68 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 z_b_2
+S 644 7 6 0 0 58 1 622 5178 10a00004 51 A 0 0 0 0 0 0 647 0 0 0 649 0 0 0 0 0 0 0 0 646 0 0 648 622 0 0 0 0 double_xyz
+S 645 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 646 8 4 0 0 61 626 622 5189 40822004 1020 A 0 0 0 0 0 0 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 double_xyz$sd
+S 647 6 4 0 0 7 648 622 5203 40802001 1020 A 0 0 0 0 0 0 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 double_xyz$p
+S 648 6 4 0 0 7 646 622 5216 40802000 1020 A 0 0 0 0 0 0 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 double_xyz$o
+S 649 22 1 0 0 8 1 622 5229 40000000 1000 A 0 0 0 0 0 0 0 644 0 0 0 0 646 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 double_xyz$arrdsc
+S 650 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 651 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 652 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 653 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 654 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 655 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 656 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 657 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 658 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 659 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 660 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 661 6 4 0 0 6 662 622 5247 4 0 A 0 0 0 0 0 72 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 wrank
+S 662 6 4 0 0 6 663 622 5253 4 0 A 0 0 0 0 0 76 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 wnproc
+S 663 6 4 0 0 6 664 622 5260 4 0 A 0 0 0 0 0 80 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 app_comm
+S 664 6 4 0 0 6 665 622 5269 4 0 A 0 0 0 0 0 84 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 color
+S 665 6 4 0 0 6 666 622 5275 4 0 A 0 0 0 0 0 88 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 rank
+S 666 6 4 0 0 6 667 622 5280 4 0 A 0 0 0 0 0 92 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 nproc
+S 667 6 4 0 0 6 675 622 5286 4 0 A 0 0 0 0 0 96 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 ierr
+S 668 3 0 0 0 6 0 1 0 0 0 A 0 0 0 0 0 0 0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
+S 669 6 4 0 0 64 670 622 5291 4 0 A 0 0 0 0 0 512 0 0 0 0 0 0 684 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 group
+S 670 6 4 0 0 64 1 622 5297 4 0 A 0 0 0 0 0 712 0 0 0 0 0 0 684 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 filename
+S 671 6 4 0 0 7 672 622 5306 4 0 A 0 0 0 0 0 0 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 handle
+S 672 6 4 0 0 7 673 622 5313 4 0 A 0 0 0 0 0 8 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 total_size
+S 673 6 4 0 0 7 674 622 5324 4 0 A 0 0 0 0 0 16 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 group_size
+S 674 6 4 0 0 7 676 622 5335 4 0 A 0 0 0 0 0 24 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 adios_totalsize
+S 675 6 4 0 0 6 1 622 5351 4 0 A 0 0 0 0 0 100 0 0 0 0 0 0 685 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 err
+S 676 6 4 0 0 9 677 622 5355 4 0 A 0 0 0 0 0 32 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 start_time
+S 677 6 4 0 0 9 678 622 5366 4 0 A 0 0 0 0 0 40 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 end_time
+S 678 6 4 0 0 9 679 622 5375 4 0 A 0 0 0 0 0 48 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 total_time
+S 679 6 4 0 0 9 680 622 5386 4 0 A 0 0 0 0 0 56 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 gbs
+S 680 6 4 0 0 9 681 622 5390 4 0 A 0 0 0 0 0 64 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 sz
+S 681 6 4 0 0 9 682 622 5393 4 0 A 0 0 0 0 0 72 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 io_start_time
+S 682 6 4 0 0 9 683 622 5407 4 0 A 0 0 0 0 0 80 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 io_end_time
+S 683 6 4 0 0 9 1 622 5419 4 0 A 0 0 0 0 0 88 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 io_total_time
+S 684 11 0 0 0 8 1 622 5433 40800000 805000 A 0 0 0 0 0 912 0 0 624 670 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 _genarray_varying_comm$1
+S 685 11 0 0 0 8 684 622 5458 40800000 805000 A 0 0 0 0 0 240 0 0 647 675 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 _genarray_varying_comm$0
+S 686 11 0 0 0 8 685 622 5483 40800000 805000 A 0 0 0 0 0 96 0 0 671 683 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 _genarray_varying_comm$2
+A 12 2 0 0 0 6 623 0 0 0 12 0 0 0 0 0 0 0 0 0
+A 16 2 0 0 0 6 645 0 0 0 16 0 0 0 0 0 0 0 0 0
+A 17 2 0 0 0 6 650 0 0 0 17 0 0 0 0 0 0 0 0 0
+A 18 1 0 1 0 61 646 0 0 0 0 0 0 0 0 0 0 0 0 0
+A 19 10 0 0 0 6 18 1 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 17
+A 20 2 0 0 0 6 651 0 0 0 20 0 0 0 0 0 0 0 0 0
+A 21 10 0 0 19 6 18 4 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 20
+A 22 4 0 0 0 6 21 0 3 0 0 0 0 2 0 0 0 0 0 0
+A 23 4 0 0 7 6 19 0 22 0 0 0 0 1 0 0 0 0 0 0
+A 24 2 0 0 0 6 652 0 0 0 24 0 0 0 0 0 0 0 0 0
+A 25 10 0 0 21 6 18 7 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 24
+A 26 2 0 0 0 6 653 0 0 0 26 0 0 0 0 0 0 0 0 0
+A 27 10 0 0 25 6 18 10 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 26
+A 28 4 0 0 0 6 27 0 3 0 0 0 0 2 0 0 0 0 0 0
+A 29 4 0 0 0 6 25 0 28 0 0 0 0 1 0 0 0 0 0 0
+A 30 2 0 0 0 6 654 0 0 0 30 0 0 0 0 0 0 0 0 0
+A 31 10 0 0 27 6 18 13 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 30
+A 32 2 0 0 0 6 655 0 0 0 32 0 0 0 0 0 0 0 0 0
+A 33 10 0 0 31 6 18 16 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 32
+A 34 4 0 0 0 6 33 0 3 0 0 0 0 2 0 0 0 0 0 0
+A 35 4 0 0 0 6 31 0 34 0 0 0 0 1 0 0 0 0 0 0
+A 36 2 0 0 0 6 656 0 0 0 36 0 0 0 0 0 0 0 0 0
+A 37 10 0 0 33 6 18 19 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 36
+A 38 2 0 0 0 6 657 0 0 0 38 0 0 0 0 0 0 0 0 0
+A 39 10 0 0 37 6 18 22 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 38
+A 40 2 0 0 0 6 658 0 0 0 40 0 0 0 0 0 0 0 0 0
+A 41 10 0 0 39 6 18 25 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 40
+A 42 2 0 0 0 6 659 0 0 0 42 0 0 0 0 0 0 0 0 0
+A 43 10 0 0 41 6 18 28 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 42
+A 44 2 0 0 0 6 660 0 0 0 44 0 0 0 0 0 0 0 0 0
+A 45 10 0 0 43 6 18 31 0 0 0 0 0 0 0 0 0 0 0 0
+X 1 44
+A 46 2 0 0 0 6 668 0 0 0 46 0 0 0 0 0 0 0 0 0
+Z
+Z
diff --git a/examples/staging/stage_write_varyingsize/stage_write b/examples/staging/stage_write_varyingsize/stage_write
new file mode 100755
index 0000000..1728864
Binary files /dev/null and b/examples/staging/stage_write_varyingsize/stage_write differ
diff --git a/examples/staging/stage_write_varyingsize/stage_write.o b/examples/staging/stage_write_varyingsize/stage_write.o
new file mode 100644
index 0000000..2875c01
Binary files /dev/null and b/examples/staging/stage_write_varyingsize/stage_write.o differ
diff --git a/examples/staging/stage_write_varyingsize/utils.o b/examples/staging/stage_write_varyingsize/utils.o
new file mode 100644
index 0000000..4132438
Binary files /dev/null and b/examples/staging/stage_write_varyingsize/utils.o differ
diff --git a/runconf b/runconf
index 9ca8d6e..ea41c5a 100755
--- a/runconf
+++ b/runconf
@@ -21,13 +21,13 @@ if [ `hostname | cut -c 1-4` == "sith" ]; then
     echo "Configure on SITH for $TARGET env. for user ${USER}"
     module unload hdf5
     module unload netcdf
+    module unload mxml
+    module unload python
     module unload PE-gnu
     module unload PE-pgi
     module unload PE-intel
     module unload PE-pathscale
     module unload pgi gcc intel pathscale
-    module unload python
-    module unload mxml
     module load PE-$TARGET
     module load mxml/2.9
     MXMLDIR=$MXML_DIR
@@ -54,27 +54,36 @@ if [ `hostname | cut -c 1-4` == "sith" ]; then
     module unload netcdf
     #module load szip
     module load bzip2
-    #module load dataspaces/1.4.0
+    #module load dataspaces/1.5.0
     export MPICC=mpicc
     export MPICXX=mpiCC
     export MPIFC=mpif90
+    export CPPFLAGS="-DMPICH_IGNORE_CXX_SEEK" 
+    export CFLAGS="-g -O0 -fPIC" 
+    export CXXFLAGS="-g -O0 -fPIC" 
+    export FCFLAGS="-g -O0 -fPIC" 
     WITHFLEX=""
     WITHFGR=""
     WITHFASTBIT=""
+    unset DATASPACES_DIR
     if [ "$TARGET" == "pgi" ]; then
         export CC=pgcc
         export CXX=pgCC
         export FC=pgf90
         WITHFLEX="--with-flexpath=/ccs/proj/e2e/chaos/sith/$TARGET"
         WITHFGR="--with-fgr=/ccs/proj/e2e/qliu/tap" 
-        WITHFASTBIT="--with-fastbit=/sw/redhat6/fastbit/svn/rhel6_gnu4.7.2"
-        DATASPACES_DIR="/ccs/home/hbui/usr/software/dataspaces-dev"
+        WITHFASTBIT="--with-fastbit=/sw/redhat6/fastbit/svn/rhel6_gnu4.4.7"
+        DATASPACES_DIR="/ccs/proj/e2e/dataspaces/sith-tcp/1.6.pgi"
+        #DATASPACES_DIR="/ccs/home/hbui/usr/software/dataspaces-dev"
     elif [ "$TARGET" == "gnu" ]; then
         export CC=gcc
         export CXX=g++
         export FC=gfortran
+        #export CFLAGS="$CFLAGS -gdwarf-3" 
+        #export FCFLAGS="$FCFLAGS -gdwarf-3" 
         WITHFLEX="--with-flexpath=/ccs/proj/e2e/chaos/sith/$TARGET"
-        WITHFASTBIT="--with-fastbit=/sw/redhat6/fastbit/svn/rhel6_gnu4.7.2"
+        WITHFASTBIT="--with-fastbit=/sw/redhat6/fastbit/svn/rhel6_gnu4.8.2"
+        DATASPACES_DIR="/ccs/proj/e2e/dataspaces/sith-tcp/1.6.gnu"
     elif [ "$TARGET" == "intel" ]; then
         export CC=icc
         export CXX=icpc
@@ -84,8 +93,6 @@ if [ `hostname | cut -c 1-4` == "sith" ]; then
         exit 1
     fi
         
-    export CPPFLAGS="-DMPICH_IGNORE_CXX_SEEK" 
-    export CFLAGS="-g -fPIC" 
     $SRCDIR/configure --prefix=/ccs/proj/e2e/${USER}/ADIOS/sith.$TARGET \
         --config-cache \
         --enable-dependency-tracking \
@@ -98,14 +105,14 @@ if [ `hostname | cut -c 1-4` == "sith" ]; then
         --with-netcdf-libs="${SEQ_NC_CLIB}" \
         --with-zlib \
         --with-bzip2=$BZIP2_DIR \
-        --with-dataspaces=$DATASPACES_DIR \
-        --with-dimes=$DATASPACES_DIR \
+        --without-infiniband --with-dataspaces=$DATASPACES_DIR \
         $WITHFLEX \
-        $WITHFGR \
         $WITHFASTBIT \
         --with-aplod=/ccs/proj/e2e/ncsu/sith.gnu \
         --with-isobar=/ccs/proj/e2e/ncsu/sith.gnu \
-        --with-glib=/ccs/proj/e2e/qliu/glib
+        #--with-dimes=$DATASPACES_DIR \
+        #--with-glib=/ccs/proj/e2e/qliu/glib
+        #$WITHFGR \
         #--with-szip=$SZIP_DIR \
         #--with-phdf5=${PAR_HDF5_DIR} \
         #--with-phdf5-libs="${PAR_HDF5_CLIB}" \
@@ -380,6 +387,7 @@ elif [ `hostname | cut -c 1-5` == "titan" ]; then
         module swap craype-interlagos craype-istanbul
         module swap cray-libsci
         module load dataspaces/1.4.0
+        unset EXTRA_CFLAGS
         unset EXTRA_LIBS
         unset LDFLAGS
         if [ "$TARGET" == "pgi" ]; then
@@ -398,6 +406,8 @@ elif [ `hostname | cut -c 1-5` == "titan" ]; then
             #export EXTRA_LIBS="/opt/gcc/4.8.2/snos/lib64/libstdc++.a"
             #module swap gcc gcc/4.4.4
             #DATASPACES_DIR="/ccs/proj/e2e/dataspaces/titan/$TARGET"
+        elif [ "$TARGET" == "cray" ]; then
+            export EXTRA_CFLAGS="-h gnu"
         fi
      
         # NOTE hdf5-parallel module does not work with C++ compiler
@@ -411,7 +421,7 @@ elif [ `hostname | cut -c 1-5` == "titan" ]; then
         #export CC=mpicc
         #export FC=mpif90
         export CPPFLAGS="-DMPICH_IGNORE_CXX_SEEK -DDART_DO_VERSIONING" 
-        export CFLAGS="-fPIC -g -O0" 
+        export CFLAGS="-fPIC -g -O2 ${EXTRA_CFLAGS}" 
         LIBS="$EXTRA_LIBS" ${SRCDIR}/configure --prefix=/ccs/proj/e2e/${USER}/ADIOS/xk6.$TARGET \
         --enable-dependency-tracking \
         --disable-maintainer-mode \
@@ -475,13 +485,16 @@ elif [ `hostname | cut -c 1-4` == "eos-" ]; then
           unset LDFLAGS 
           export EXTRA_LIBS="/opt/gcc/4.8.1/snos/lib64/libstdc++.a"
           module swap gcc gcc/4.8.1
+      elif [ "$TARGET" == "cray" ]; then
+          export EXTRA_CFLAGS="-h gnu"
       else
           unset LDFLAGS 
           unset EXTRA_LIBS 
+          unset EXTRA_CFLAGS 
       fi
       module load mxml
       module load pmi
-      CFLAGS="-g -fPIC" ${SRCDIR}/configure --prefix=/ccs/proj/e2e/pnorbert/ADIOS/eos.$TARGET \
+      CFLAGS="-g -fPIC ${EXTRA_CFLAGS}" ${SRCDIR}/configure --prefix=/ccs/proj/e2e/pnorbert/ADIOS/eos.$TARGET \
           --enable-dependency-tracking \
           --with-cray-pmi=/opt/cray/pmi/default \
           --with-cray-ugni-incdir=/opt/cray/gni-headers/default/include \
@@ -525,9 +538,12 @@ elif [ `hostname | cut -c 1-7` == "chester" ]; then
           export EXTRA_LIBS="/opt/gcc/4.7.1/snos/lib64/libstdc++.a"
           export FLEXPATH="--with-flexpath=/ccs/proj/e2e/chaos/titan/gnu"
           #module swap gcc gcc/4.4.4
+      elif [ "$TARGET" == "cray" ]; then
+          export EXTRA_CFLAGS="-h gnu"
       else
           unset LDFLAGS 
           unset EXTRA_LIBS 
+          unset EXTRA_CFLAGS 
       fi
       #module load szip
       #module load xt-papi
@@ -537,7 +553,7 @@ elif [ `hostname | cut -c 1-7` == "chester" ]; then
       # use the two lines below for openmpi
       #export CC=mpicc
       #export FC=mpif90
-      CFLAGS="-g -fPIC" LDFLAGS="$CRAY_RCA_POST_LINK_OPTS" \
+      CFLAGS="-g -fPIC ${EXTRA_CFLAGS}" LDFLAGS="$CRAY_RCA_POST_LINK_OPTS" \
       ${SRCDIR}/configure --prefix=/ccs/proj/e2e/pnorbert/ADIOS/chester.$TARGET \
           --enable-dependency-tracking \
           --with-cray-pmi=/opt/cray/pmi/default \
@@ -636,12 +652,20 @@ elif [ `hostname | cut -c 1-6` == "edison" ]; then
         export FC=ifort
         export LDFLAGS=""
         WITHDART=""
+    elif [ "$TARGET" == "cray" ]; then
+        export EXTRA_CFLAGS="-h gnu"
+        export CC=cc
+        export CXX=CC
+        export FC=ftn
+        export LDFLAGS=""
+        WITHDART=""
+        export EXTRA_CFLAGS="-h gnu"
     else
         echo "TARGET must be pgi or gnu or intel"
         exit 1
     fi
     export CPPFLAGS="-DMPICH_IGNORE_CXX_SEEK"
-    export CFLAGS="-fPIC"
+    export CFLAGS="-fPIC ${EXTRA_CFLAGS}"
     ${SRCDIR}/configure --prefix=/global/homes/p/pnorbert/adios/master/edison/$TARGET \
         --enable-dependency-tracking \
         --with-mxml=$HOME/mxml/mxml.edison \
@@ -692,12 +716,20 @@ elif [ `hostname | cut -c 1-6` == "hopper" ]; then
         export FC=ifort
         export LDFLAGS=""
         WITHDART=""
+    elif [ "$TARGET" == "cray" ]; then
+        export EXTRA_CFLAGS="-h gnu"
+        export CC=cc
+        export CXX=CC
+        export FC=ftn
+        export LDFLAGS=""
+        WITHDART=""
+        export EXTRA_CFLAGS="-h gnu"
     else
         echo "TARGET must be pgi or gnu or intel"
         exit 1
     fi
     export CPPFLAGS="-DMPICH_IGNORE_CXX_SEEK"
-    export CFLAGS="-fPIC"
+    export CFLAGS="-fPIC ${EXTRA_CFLAGS}"
     ${SRCDIR}/configure --prefix=/project/projectdirs/m499/adios/devel-hopper-$TARGET \
         --enable-dependency-tracking \
         --with-mxml=$HOME/mxml/mxml.hopper \
@@ -884,7 +916,7 @@ elif [ `hostname | cut -c 1-7` == "adiosVM" ]; then
     export FC=gfortran
 
     export CFLAGS="-g -O0 -fPIC -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast"
-    ${SRCDIR}/configure --prefix=/opt/adios/1.8 \
+    ${SRCDIR}/configure --prefix=/opt/adios/1.9 \
         --disable-maintainer-mode \
         --enable-dependency-tracking \
         --with-mxml=/opt/mxml \
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 3ff9837..727f8ba 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,6 +1,6 @@
 include_directories(${PROJECT_BINARY_DIR})
 include_directories(${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/src/core ${PROJECT_SOURCE_DIR}/src/core/transforms)
-include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 
 if(HAVE_NSSI)
@@ -475,6 +475,7 @@ set(include_HEADERS ${include_HEADERS} public/adios.h
                    public/adios_read_v2_fwd.h 
                    public/adios_selection.h
                    public/adios_schema.h
+                   public/adios_link.h
                    public/adios_read_ext.h
                    public/adios_query.h)
 
@@ -538,6 +539,8 @@ set(libadiosread_a_CPPFLAGS "${libadiosread_a_CPPFLAGS} ${ADIOSLIB_EXTRA_CPPFLAG
 #add library adiosread
 #include_directories(${include_HEADERS})
 install(FILES ${include_HEADERS} DESTINATION ${includedir})
+# install generated header file adios_version.h
+install(FILES ${PROJECT_BINARY_DIR}/src/public/adios_version.h DESTINATION ${includedir})
 add_library(adiosread STATIC ${libadiosread_a_SOURCES})
 set_target_properties(adiosread PROPERTIES COMPILE_FLAGS "${libadiosread_a_CPPFLAGS} ${libadiosread_a_CFLAGS}")
 
diff --git a/src/Makefile.am b/src/Makefile.am
index 3132c9f..b310a41 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/src/core -I$(top_srcdir)/src/core/transforms -I$(top_srcdir)/src/core/query
+AM_CPPFLAGS=-I$(top_builddir)/src/public -I$(top_srcdir) -I$(top_srcdir)/src/core -I$(top_srcdir)/src/core/transforms -I$(top_srcdir)/src/core/query
 
 AUTOMAKE_OPTIONS = no-dependencies
 METASOURCES=AUTO
@@ -87,7 +87,6 @@ transforms_read_SOURCES = $(transforms_read_HDRS) \
                           core/adios_selection_util.c \
                           core/transforms/plugindetect/detect_plugin_read_hook_decls.h \
                           core/transforms/plugindetect/detect_plugin_read_hook_reg.h \
-                          core/adios_read_ext.c \
                           $(transforms_read_method_SOURCES)
 
 transforms_write_SOURCES = $(transforms_write_HDRS) \
@@ -252,17 +251,17 @@ libadiosf_nompi_a_CFLAGS = $(MACRODEFFLAG)_NOMPI $(ADIOSLIB_SEQ_CFLAGS)
 
 if HAVE_DATASPACES
 libadios_a_SOURCES += write/adios_dataspaces.c read/read_dataspaces.c
-libadios_nompi_a_SOURCES += write/adios_dataspaces.c read/read_dataspaces.c
+#libadios_nompi_a_SOURCES += write/adios_dataspaces.c read/read_dataspaces.c
 if BUILD_FORTRAN
-FortranLibSources += write/adios_dataspaces.c read/read_dataspaces.c
+FortranLibMPISources += write/adios_dataspaces.c read/read_dataspaces.c
 endif
 endif
 
 if HAVE_DIMES
 libadios_a_SOURCES += write/adios_dimes.c read/read_dimes.c
-libadios_nompi_a_SOURCES += write/adios_dimes.c read/read_dimes.c
+#libadios_nompi_a_SOURCES += write/adios_dimes.c read/read_dimes.c
 if BUILD_FORTRAN
-FortranLibSources += write/adios_dimes.c read/read_dimes.c
+FortranLibMPISources += write/adios_dimes.c read/read_dimes.c
 endif
 endif
 
@@ -410,6 +409,7 @@ endif
 endif   # BUILD_WRITE
 
 include_HEADERS += public/adios.h \
+                   public/adios_version.h \
                    public/adios_types.h \
                    public/adios_read.h \
                    public/adios_error.h \
@@ -421,6 +421,7 @@ include_HEADERS += public/adios.h \
                    public/adios_read_v2_fwd.h \
                    public/adios_selection.h \
 		   public/adios_schema.h \
+		   public/adios_link.h \
                    public/adios_read_ext.h \
                    public/adios_query.h
 
@@ -565,12 +566,12 @@ libadiosread_nompi_a_SOURCES = core/mpidummy.c\
                       read/read_bp.c 
 
 					  
-if HAVE_DATASPACES
-libadiosread_nompi_a_SOURCES += read/read_dataspaces.c
-endif
-if HAVE_DIMES
-libadiosread_nompi_a_SOURCES += read/read_dimes.c
-endif
+#if HAVE_DATASPACES
+#libadiosread_nompi_a_SOURCES += read/read_dataspaces.c
+#endif
+#if HAVE_DIMES
+#libadiosread_nompi_a_SOURCES += read/read_dimes.c
+#endif
 if HAVE_DATATAP
 libadiosread_nompi_a_SOURCES += read/read_datatap.c
 endif
@@ -613,12 +614,12 @@ FortranReadSeqLibSource = core/mpidummy.c\
                           core/util.c \
                           core/qhashtbl.c \
                           read/read_bp.c 
-if HAVE_DATASPACES
-FortranReadSeqLibSource += read/read_dataspaces.c
-endif
-if HAVE_DIMES
-FortranReadSeqLibSource += read/read_dimes.c
-endif
+#if HAVE_DATASPACES
+#FortranReadSeqLibSource += read/read_dataspaces.c
+#endif
+#if HAVE_DIMES
+#FortranReadSeqLibSource += read/read_dimes.c
+#endif
 if HAVE_DATATAP
 FortranReadSeqLibSource += read/read_datatap.c
 endif
@@ -711,6 +712,7 @@ EXTRA_DIST = core/adios_bp_v1.h core/adios_endianness.h \
              core/bp_types.h core/bp_utils.h core/buffer.h core/common_adios.h \
              core/common_read.h core/adios_infocache.h core/futils.h core/globals.h core/ds_metadata.h \
              core/util.h core/flexpath.h core/qhashtbl.h \
+	     public/adios_version.h.in \
              $(transforms_common_HDRS) $(transforms_read_HDRS) $(transforms_write_HDRS) \
              $(query_common_HDRS) $(query_method_HDRS) \
              transforms/transform_plugins.h \
diff --git a/src/Makefile.in b/src/Makefile.in
index e19bf66..547aeb2 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -51,32 +51,32 @@ DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__append_7 = libadiosf.a libadiosf_v1.a libadiosf_nompi.a libadiosf_nompi_v1.a
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_BGQ_TRUE at am__append_8 = write/adios_mpi_bgq.c  
 @BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__append_9 = write/adios_dataspaces.c read/read_dataspaces.c
- at BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__append_10 = write/adios_dataspaces.c read/read_dataspaces.c
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__append_11 = write/adios_dataspaces.c read/read_dataspaces.c
- at BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__append_12 = write/adios_dimes.c read/read_dimes.c
- at BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__append_13 = write/adios_dimes.c read/read_dimes.c
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__append_14 = write/adios_dimes.c read/read_dimes.c
- at BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__append_15 = write/adios_datatap.c read/read_datatap.c
- at BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__append_16 = write/adios_datatap.c read/read_datatap.c
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__append_17 = write/adios_datatap.c read/read_datatap.c
- at BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_18 = write/adios_phdf5.c 
- at BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_19 = $(MACRODEFFLAG)PHDF5 $(MACRODEFFLAG)H5_USE_16_API 
- at BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_20 = $(PHDF5_CPPFLAGS)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_21 = write/adios_phdf5.c 
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_22 = $(PHDF5_CPPFLAGS)
- at BUILD_WRITE_TRUE@@HAVE_NC4PAR_TRUE at am__append_23 = write/adios_nc4.c 
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NC4PAR_TRUE at am__append_24 = write/adios_nc4.c 
- at BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__append_25 = write/adios_flexpath.c  read/read_flexpath.c
- at BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__append_26 = write/adios_flexpath.c  read/read_flexpath.c
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__append_27 = write/adios_flexpath.c read/read_flexpath.c
- at BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__append_28 = write/adios_icee.c read/read_icee.c
- at BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__append_29 = write/adios_icee.c  read/read_icee.c
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__append_30 = write/adios_icee.c read/read_icee.c
- at BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_31 = nssi/adios_nssi_config.c write/adios_nssi.c nssi/adios_nssi_filter.c read/read_nssi.c
- at BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_32 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_33 = nssi/adios_nssi_config.c write/adios_nssi.c nssi/adios_nssi_filter.c read/read_nssi.c
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_34 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
- at BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_35 = adios_nssi_args.c adios_nssi_args.h
+#libadios_nompi_a_SOURCES += write/adios_dataspaces.c read/read_dataspaces.c
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__append_10 = write/adios_dataspaces.c read/read_dataspaces.c
+ at BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__append_11 = write/adios_dimes.c read/read_dimes.c
+#libadios_nompi_a_SOURCES += write/adios_dimes.c read/read_dimes.c
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__append_12 = write/adios_dimes.c read/read_dimes.c
+ at BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__append_13 = write/adios_datatap.c read/read_datatap.c
+ at BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__append_14 = write/adios_datatap.c read/read_datatap.c
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__append_15 = write/adios_datatap.c read/read_datatap.c
+ at BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_16 = write/adios_phdf5.c 
+ at BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_17 = $(MACRODEFFLAG)PHDF5 $(MACRODEFFLAG)H5_USE_16_API 
+ at BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_18 = $(PHDF5_CPPFLAGS)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_19 = write/adios_phdf5.c 
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__append_20 = $(PHDF5_CPPFLAGS)
+ at BUILD_WRITE_TRUE@@HAVE_NC4PAR_TRUE at am__append_21 = write/adios_nc4.c 
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NC4PAR_TRUE at am__append_22 = write/adios_nc4.c 
+ at BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__append_23 = write/adios_flexpath.c  read/read_flexpath.c
+ at BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__append_24 = write/adios_flexpath.c  read/read_flexpath.c
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__append_25 = write/adios_flexpath.c read/read_flexpath.c
+ at BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__append_26 = write/adios_icee.c read/read_icee.c
+ at BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__append_27 = write/adios_icee.c  read/read_icee.c
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__append_28 = write/adios_icee.c read/read_icee.c
+ at BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_29 = nssi/adios_nssi_config.c write/adios_nssi.c nssi/adios_nssi_filter.c read/read_nssi.c
+ at BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_30 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_31 = nssi/adios_nssi_config.c write/adios_nssi.c nssi/adios_nssi_filter.c read/read_nssi.c
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_32 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
+ at BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__append_33 = adios_nssi_args.c adios_nssi_args.h
 
 #libadios_a_SOURCES += write/adios_mpi_stagger.c \
 #                      write/adios_mpi_aggregate.c \
@@ -92,68 +92,77 @@ DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
 #                       write/adios_mpi_stripe.c \
 #                       write/adios_mpi_amr1.c \
 #                       write/adios_adaptive.c 
+ at BUILD_WRITE_TRUE@@RESEARCH_TRANSPORTS_FALSE at am__append_34 = $(MACRODEFFLAG)NO_RESEARCH_TRANSPORTS
+ at BUILD_WRITE_TRUE@@RESEARCH_TRANSPORTS_FALSE at am__append_35 = $(MACRODEFFLAG)NO_RESEARCH_TRANSPORTS
 @BUILD_WRITE_TRUE@@RESEARCH_TRANSPORTS_FALSE at am__append_36 = $(MACRODEFFLAG)NO_RESEARCH_TRANSPORTS
 @BUILD_WRITE_TRUE@@RESEARCH_TRANSPORTS_FALSE at am__append_37 = $(MACRODEFFLAG)NO_RESEARCH_TRANSPORTS
- at BUILD_WRITE_TRUE@@RESEARCH_TRANSPORTS_FALSE at am__append_38 = $(MACRODEFFLAG)NO_RESEARCH_TRANSPORTS
- at BUILD_WRITE_TRUE@@RESEARCH_TRANSPORTS_FALSE at am__append_39 = $(MACRODEFFLAG)NO_RESEARCH_TRANSPORTS
 
 #nodist_libadiosreadf_a_SOURCES += adios_write.mod
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__append_40 = adios_write_mod.mod 
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__append_41 = adios_write_mod.mod
- at HAVE_DATASPACES_TRUE@am__append_42 = read/read_dataspaces.c
- at HAVE_DIMES_TRUE@am__append_43 = read/read_dimes.c
- at HAVE_DATATAP_TRUE@am__append_44 = read/read_datatap.c
- at HAVE_FLEXPATH_TRUE@am__append_45 = read/read_flexpath.c
- at HAVE_ICEE_TRUE@am__append_46 = read/read_icee.c
- at HAVE_NSSI_TRUE@am__append_47 = nssi/adios_nssi_config.c read/read_nssi.c
- at HAVE_NSSI_TRUE@am__append_48 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__append_38 = adios_write_mod.mod 
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__append_39 = adios_write_mod.mod
+ at HAVE_DATASPACES_TRUE@am__append_40 = read/read_dataspaces.c
+ at HAVE_DIMES_TRUE@am__append_41 = read/read_dimes.c
+ at HAVE_DATATAP_TRUE@am__append_42 = read/read_datatap.c
+ at HAVE_FLEXPATH_TRUE@am__append_43 = read/read_flexpath.c
+ at HAVE_ICEE_TRUE@am__append_44 = read/read_icee.c
+ at HAVE_NSSI_TRUE@am__append_45 = nssi/adios_nssi_config.c read/read_nssi.c
+ at HAVE_NSSI_TRUE@am__append_46 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
 #libadiosread_a_CPPFLAGS += $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSLIB_CPPFLAGS) # $(MACRODEFFLAG)USE_TIMERS
- at HAVE_NSSI_TRUE@am__append_49 = $(ADIOSLIB_CFLAGS) 
- at BUILD_FORTRAN_TRUE@am__append_50 = libadiosreadf.a libadiosreadf_v1.a
- at BUILD_FORTRAN_TRUE@@HAVE_DATASPACES_TRUE at am__append_51 = read/read_dataspaces.c
- at BUILD_FORTRAN_TRUE@@HAVE_DIMES_TRUE at am__append_52 = read/read_dimes.c
- at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__append_53 = read/read_datatap.c
- at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__append_54 = read/read_flexpath.c
- at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__append_55 = read/read_icee.c
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_56 = nssi/adios_nssi_config.c read/read_nssi.c
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_57 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_58 = $(ADIOSLIB_CFLAGS) 
- at BUILD_FORTRAN_TRUE@am__append_59 = $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSREADLIB_CPPFLAGS)
+ at HAVE_NSSI_TRUE@am__append_47 = $(ADIOSLIB_CFLAGS) 
+ at BUILD_FORTRAN_TRUE@am__append_48 = libadiosreadf.a libadiosreadf_v1.a
+ at BUILD_FORTRAN_TRUE@@HAVE_DATASPACES_TRUE at am__append_49 = read/read_dataspaces.c
+ at BUILD_FORTRAN_TRUE@@HAVE_DIMES_TRUE at am__append_50 = read/read_dimes.c
+ at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__append_51 = read/read_datatap.c
+ at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__append_52 = read/read_flexpath.c
+ at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__append_53 = read/read_icee.c
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_54 = nssi/adios_nssi_config.c read/read_nssi.c
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_55 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_56 = $(ADIOSLIB_CFLAGS) 
+ at BUILD_FORTRAN_TRUE@am__append_57 = $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSREADLIB_CPPFLAGS)
 
 #nodist_libadiosreadf_a_SOURCES += adios_read_mod.mod
- at BUILD_FORTRAN_TRUE@am__append_60 = adios_read_mod.mod adios_defs_mod.mod adios_query_mod.mod
- at BUILD_FORTRAN_TRUE@am__append_61 = adios_read_mod.mod adios_defs_mod.mod adios_query_mod.mod
- at HAVE_DATASPACES_TRUE@am__append_62 = read/read_dataspaces.c
- at HAVE_DIMES_TRUE@am__append_63 = read/read_dimes.c
- at HAVE_DATATAP_TRUE@am__append_64 = read/read_datatap.c
- at HAVE_FLEXPATH_TRUE@am__append_65 = read/read_flexpath.c
- at HAVE_ICEE_TRUE@am__append_66 = read/read_icee.c
- at HAVE_NSSI_TRUE@am__append_67 = nssi/adios_nssi_config.c read/read_nssi.c
- at HAVE_NSSI_TRUE@am__append_68 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
- at HAVE_NSSI_TRUE@am__append_69 = $(ADIOSLIB_CFLAGS) 
+ at BUILD_FORTRAN_TRUE@am__append_58 = adios_read_mod.mod adios_defs_mod.mod adios_query_mod.mod
+ at BUILD_FORTRAN_TRUE@am__append_59 = adios_read_mod.mod adios_defs_mod.mod adios_query_mod.mod
+
+#if HAVE_DATASPACES
+#libadiosread_nompi_a_SOURCES += read/read_dataspaces.c
+#endif
+#if HAVE_DIMES
+#libadiosread_nompi_a_SOURCES += read/read_dimes.c
+#endif
+ at HAVE_DATATAP_TRUE@am__append_60 = read/read_datatap.c
+ at HAVE_FLEXPATH_TRUE@am__append_61 = read/read_flexpath.c
+ at HAVE_ICEE_TRUE@am__append_62 = read/read_icee.c
+ at HAVE_NSSI_TRUE@am__append_63 = nssi/adios_nssi_config.c read/read_nssi.c
+ at HAVE_NSSI_TRUE@am__append_64 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL $(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL
+ at HAVE_NSSI_TRUE@am__append_65 = $(ADIOSLIB_CFLAGS) 
 
 # Note: utils/adios_lint needs to link with adios_internals_mxml.o which depends
 #       on adios_internals.c, buffer.c and adios_transport_hooks.c. 
 #       We put these objects in libadiosread_nompi
 #       so we do not need to make another _nompi lib just for adios_lint
- at BUILD_FORTRAN_TRUE@am__append_70 = libadiosreadf_nompi.a libadiosreadf_nompi_v1.a
- at BUILD_FORTRAN_TRUE@@HAVE_DATASPACES_TRUE at am__append_71 = read/read_dataspaces.c
- at BUILD_FORTRAN_TRUE@@HAVE_DIMES_TRUE at am__append_72 = read/read_dimes.c
- at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__append_73 = read/read_datatap.c
- at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__append_74 = read/read_flexpath.c
- at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__append_75 = read/read_icee.c
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_76 = nssi/adios_nssi_config.c read/read_nssi.c
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_77 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL \
+ at BUILD_FORTRAN_TRUE@am__append_66 = libadiosreadf_nompi.a libadiosreadf_nompi_v1.a
+#if HAVE_DATASPACES
+#FortranReadSeqLibSource += read/read_dataspaces.c
+#endif
+#if HAVE_DIMES
+#FortranReadSeqLibSource += read/read_dimes.c
+#endif
+ at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__append_67 = read/read_datatap.c
+ at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__append_68 = read/read_flexpath.c
+ at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__append_69 = read/read_icee.c
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_70 = nssi/adios_nssi_config.c read/read_nssi.c
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_71 = $(MACRODEFFLAG)PTL_IFACE_CLIENT=CRAY_USER_NAL \
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE@	$(MACRODEFFLAG)PTL_IFACE_SERVER=CRAY_USER_NAL \
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE@	$(ADIOSLIB_EXTRA_CPPFLAGS) \
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE@	$(ADIOSLIB_CPPFLAGS) # \
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE@	$(MACRODEFFLAG)USE_TIMERS
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_78 = $(ADIOSLIB_CFLAGS) 
- at BUILD_FORTRAN_TRUE@am__append_79 = $(MACRODEFFLAG)_NOMPI $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSREADLIB_CPPFLAGS)
- at BUILD_WRITE_TRUE@am__append_80 = core/adios_internals_mxml.c 
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__append_72 = $(ADIOSLIB_CFLAGS) 
+ at BUILD_FORTRAN_TRUE@am__append_73 = $(MACRODEFFLAG)_NOMPI $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSREADLIB_CPPFLAGS)
+ at BUILD_WRITE_TRUE@am__append_74 = core/adios_internals_mxml.c 
 #Note: $(MACRODEFFLAG)NOMPI chokes IBM's bgxlf compiler but it can pass $(MACRODEFFLAG)_NOMPI. 
- at HAVE_DMALLOC_TRUE@am__append_81 = $(MACRODEFFLAG)DMALLOC 
- at HAVE_DMALLOC_TRUE@am__append_82 = $(MACRODEFFLAG)DMALLOC 
+ at HAVE_DMALLOC_TRUE@am__append_75 = $(MACRODEFFLAG)DMALLOC 
+ at HAVE_DMALLOC_TRUE@am__append_76 = $(MACRODEFFLAG)DMALLOC 
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/ac_alacrity.m4 \
@@ -317,8 +326,7 @@ am__objects_4 = $(am__objects_1) \
 	libadios_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadios_a-adios_transforms_datablock.$(OBJEXT) \
 	libadios_a-adios_patchdata.$(OBJEXT) \
-	libadios_a-adios_selection_util.$(OBJEXT) \
-	libadios_a-adios_read_ext.$(OBJEXT) $(am__objects_3)
+	libadios_a-adios_selection_util.$(OBJEXT) $(am__objects_3)
 am__objects_5 = libadios_a-adios_transform_identity_write.$(OBJEXT) \
 	libadios_a-adios_transform_zlib_write.$(OBJEXT) \
 	libadios_a-adios_transform_bzip2_write.$(OBJEXT) \
@@ -518,7 +526,6 @@ am__libadios_nompi_a_SOURCES_DIST = core/adios.c core/common_adios.c \
 	core/transforms/adios_patchdata.c core/adios_selection_util.c \
 	core/transforms/plugindetect/detect_plugin_read_hook_decls.h \
 	core/transforms/plugindetect/detect_plugin_read_hook_reg.h \
-	core/adios_read_ext.c \
 	transforms/adios_transform_identity_read.c \
 	transforms/adios_transform_zlib_read.c \
 	transforms/adios_transform_bzip2_read.c \
@@ -550,16 +557,14 @@ am__libadios_nompi_a_SOURCES_DIST = core/adios.c core/common_adios.c \
 	core/adios_bp_v1.c core/adios_endianness.c core/bp_utils.c \
 	core/futils.c core/adios_error.c core/adios_read.c \
 	core/adios_read_v1.c core/common_read.c core/adios_infocache.c \
-	core/globals.c core/mpidummy.c core/adios_timing.c \
-	core/adios_read_hooks.c core/adios_transport_hooks.c \
-	core/adios_socket.c core/adios_logger.c core/util.c \
-	core/qhashtbl.c read/read_bp.c read/read_bp_staged.c \
-	read/read_bp_staged1.c write/adios_posix.c \
-	write/adios_posix1.c write/adios_dataspaces.c \
-	read/read_dataspaces.c write/adios_dimes.c read/read_dimes.c \
-	write/adios_datatap.c read/read_datatap.c \
-	write/adios_flexpath.c read/read_flexpath.c write/adios_icee.c \
-	read/read_icee.c
+	core/adios_read_ext.c core/globals.c core/mpidummy.c \
+	core/adios_timing.c core/adios_read_hooks.c \
+	core/adios_transport_hooks.c core/adios_socket.c \
+	core/adios_logger.c core/util.c core/qhashtbl.c read/read_bp.c \
+	read/read_bp_staged.c read/read_bp_staged1.c \
+	write/adios_posix.c write/adios_posix1.c write/adios_datatap.c \
+	read/read_datatap.c write/adios_flexpath.c \
+	read/read_flexpath.c write/adios_icee.c read/read_icee.c
 am__objects_33 = $(am__objects_1) \
 	libadios_nompi_a-adios_transforms_common.$(OBJEXT) \
 	libadios_nompi_a-adios_transforms_hooks.$(OBJEXT) \
@@ -580,7 +585,7 @@ am__objects_35 = $(am__objects_1) \
 	libadios_nompi_a-adios_transforms_datablock.$(OBJEXT) \
 	libadios_nompi_a-adios_patchdata.$(OBJEXT) \
 	libadios_nompi_a-adios_selection_util.$(OBJEXT) \
-	libadios_nompi_a-adios_read_ext.$(OBJEXT) $(am__objects_34)
+	$(am__objects_34)
 am__objects_36 =  \
 	libadios_nompi_a-adios_transform_identity_write.$(OBJEXT) \
 	libadios_nompi_a-adios_transform_zlib_write.$(OBJEXT) \
@@ -608,15 +613,11 @@ am__objects_41 = $(am__objects_39) $(am__objects_40) $(am__objects_10)
 am__objects_42 = $(am__objects_38) $(am__objects_41)
 am__objects_43 = $(am__objects_42) \
 	libadios_nompi_a-adios_query.$(OBJEXT)
- at BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__objects_44 = libadios_nompi_a-adios_dataspaces.$(OBJEXT) \
- at BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE@	libadios_nompi_a-read_dataspaces.$(OBJEXT)
- at BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__objects_45 = libadios_nompi_a-adios_dimes.$(OBJEXT) \
- at BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE@	libadios_nompi_a-read_dimes.$(OBJEXT)
- at BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_46 = libadios_nompi_a-adios_datatap.$(OBJEXT) \
+ at BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_44 = libadios_nompi_a-adios_datatap.$(OBJEXT) \
 @BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE@	libadios_nompi_a-read_datatap.$(OBJEXT)
- at BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_47 = libadios_nompi_a-adios_flexpath.$(OBJEXT) \
+ at BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_45 = libadios_nompi_a-adios_flexpath.$(OBJEXT) \
 @BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE@	libadios_nompi_a-read_flexpath.$(OBJEXT)
- at BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_48 = libadios_nompi_a-adios_icee.$(OBJEXT) \
+ at BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_46 = libadios_nompi_a-adios_icee.$(OBJEXT) \
 @BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE@	libadios_nompi_a-read_icee.$(OBJEXT)
 @BUILD_WRITE_TRUE at am_libadios_nompi_a_OBJECTS =  \
 @BUILD_WRITE_TRUE@	libadios_nompi_a-adios.$(OBJEXT) \
@@ -651,8 +652,7 @@ am__objects_43 = $(am__objects_42) \
 @BUILD_WRITE_TRUE@	libadios_nompi_a-adios_posix.$(OBJEXT) \
 @BUILD_WRITE_TRUE@	libadios_nompi_a-adios_posix1.$(OBJEXT) \
 @BUILD_WRITE_TRUE@	$(am__objects_44) $(am__objects_45) \
- at BUILD_WRITE_TRUE@	$(am__objects_46) $(am__objects_47) \
- at BUILD_WRITE_TRUE@	$(am__objects_48)
+ at BUILD_WRITE_TRUE@	$(am__objects_46)
 libadios_nompi_a_OBJECTS = $(am_libadios_nompi_a_OBJECTS)
 libadiosf_a_AR = $(AR) $(ARFLAGS)
 libadiosf_a_LIBADD =
@@ -682,7 +682,6 @@ am__libadiosf_a_SOURCES_DIST = core/adiosf.c core/common_adios.c \
 	core/transforms/adios_patchdata.c core/adios_selection_util.c \
 	core/transforms/plugindetect/detect_plugin_read_hook_decls.h \
 	core/transforms/plugindetect/detect_plugin_read_hook_reg.h \
-	core/adios_read_ext.c \
 	transforms/adios_transform_identity_read.c \
 	transforms/adios_transform_zlib_read.c \
 	transforms/adios_transform_bzip2_read.c \
@@ -713,87 +712,83 @@ am__libadiosf_a_SOURCES_DIST = core/adiosf.c core/common_adios.c \
 	query/fastbit_adios.h query/adiosf_query.c core/buffer.c \
 	core/adios_bp_v1.c core/adios_endianness.c core/futils.c \
 	core/adios_error.c core/bp_utils.c core/common_read.c \
-	core/adios_infocache.c core/globals.c core/adios_timing.c \
-	core/adios_read_hooks.c core/adios_transport_hooks.c \
-	core/adios_socket.c core/adios_logger.c core/util.c \
-	core/qhashtbl.c read/read_bp.c read/read_bp_staged.c \
-	read/read_bp_staged1.c write/adios_posix.c \
-	write/adios_posix1.c write/adios_dataspaces.c \
-	read/read_dataspaces.c write/adios_dimes.c read/read_dimes.c \
-	write/adios_datatap.c read/read_datatap.c \
-	write/adios_flexpath.c read/read_flexpath.c write/adios_icee.c \
-	read/read_icee.c nssi/adios_nssi_config.c write/adios_nssi.c \
+	core/adios_infocache.c core/adios_read_ext.c core/globals.c \
+	core/adios_timing.c core/adios_read_hooks.c \
+	core/adios_transport_hooks.c core/adios_socket.c \
+	core/adios_logger.c core/util.c core/qhashtbl.c read/read_bp.c \
+	read/read_bp_staged.c read/read_bp_staged1.c \
+	write/adios_posix.c write/adios_posix1.c write/adios_datatap.c \
+	read/read_datatap.c write/adios_flexpath.c \
+	read/read_flexpath.c write/adios_icee.c read/read_icee.c \
+	nssi/adios_nssi_config.c write/adios_nssi.c \
 	nssi/adios_nssi_filter.c read/read_nssi.c write/adios_mpi.c \
 	write/adios_mpi_lustre.c write/adios_mpi_amr.c \
 	write/adios_var_merge.c write/adios_mpi_bgq.c \
-	write/adios_phdf5.c write/adios_nc4.c core/adiosf_read.c \
-	core/adiosf_defs_mod.f90 core/adiosf_write_mod.f90 \
-	core/adiosf_read_mod.f90 query/adios_query_mod.f90
-am__objects_49 = $(am__objects_1) \
+	write/adios_dataspaces.c read/read_dataspaces.c \
+	write/adios_dimes.c read/read_dimes.c write/adios_phdf5.c \
+	write/adios_nc4.c core/adiosf_read.c core/adiosf_defs_mod.f90 \
+	core/adiosf_write_mod.f90 core/adiosf_read_mod.f90 \
+	query/adios_query_mod.f90
+am__objects_47 = $(am__objects_1) \
 	libadiosf_a-adios_transforms_common.$(OBJEXT) \
 	libadiosf_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosf_a-adios_copyspec.$(OBJEXT) \
 	libadiosf_a-adios_subvolume.$(OBJEXT)
-am__objects_50 = libadiosf_a-adios_transform_identity_read.$(OBJEXT) \
+am__objects_48 = libadiosf_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosf_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosf_a-adios_transform_bzip2_read.$(OBJEXT) \
 	libadiosf_a-adios_transform_szip_read.$(OBJEXT) \
 	libadiosf_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosf_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosf_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_51 = $(am__objects_1) \
+am__objects_49 = $(am__objects_1) \
 	libadiosf_a-adios_transforms_read.$(OBJEXT) \
 	libadiosf_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosf_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosf_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosf_a-adios_patchdata.$(OBJEXT) \
-	libadiosf_a-adios_selection_util.$(OBJEXT) \
-	libadiosf_a-adios_read_ext.$(OBJEXT) $(am__objects_50)
-am__objects_52 = libadiosf_a-adios_transform_identity_write.$(OBJEXT) \
+	libadiosf_a-adios_selection_util.$(OBJEXT) $(am__objects_48)
+am__objects_50 = libadiosf_a-adios_transform_identity_write.$(OBJEXT) \
 	libadiosf_a-adios_transform_zlib_write.$(OBJEXT) \
 	libadiosf_a-adios_transform_bzip2_write.$(OBJEXT) \
 	libadiosf_a-adios_transform_szip_write.$(OBJEXT) \
 	libadiosf_a-adios_transform_isobar_write.$(OBJEXT) \
 	libadiosf_a-adios_transform_aplod_write.$(OBJEXT) \
 	libadiosf_a-adios_transform_alacrity_write.$(OBJEXT)
-am__objects_53 = $(am__objects_1) \
+am__objects_51 = $(am__objects_1) \
 	libadiosf_a-adios_transforms_write.$(OBJEXT) \
 	libadiosf_a-adios_transforms_hooks_write.$(OBJEXT) \
 	libadiosf_a-adios_transforms_util.$(OBJEXT) \
 	libadiosf_a-adios_transforms_specparse.$(OBJEXT) \
-	$(am__objects_52)
-am__objects_54 = $(am__objects_1) libadiosf_a-common_query.$(OBJEXT) \
+	$(am__objects_50)
+am__objects_52 = $(am__objects_1) libadiosf_a-common_query.$(OBJEXT) \
 	libadiosf_a-adios_query_hooks.$(OBJEXT) \
 	libadiosf_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_55 =  \
+ at HAVE_FASTBIT_TRUE@am__objects_53 =  \
 @HAVE_FASTBIT_TRUE@	libadiosf_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosf_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_56 = libadiosf_a-query_alac.$(OBJEXT)
-am__objects_57 = $(am__objects_55) $(am__objects_56) $(am__objects_10)
-am__objects_58 = $(am__objects_54) $(am__objects_57)
-am__objects_59 = $(am__objects_58) libadiosf_a-adiosf_query.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__objects_60 = libadiosf_a-adios_dataspaces.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE@	libadiosf_a-read_dataspaces.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__objects_61 = libadiosf_a-adios_dimes.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE@	libadiosf_a-read_dimes.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_62 = libadiosf_a-adios_datatap.$(OBJEXT) \
+ at HAVE_ALACRITY_TRUE@am__objects_54 = libadiosf_a-query_alac.$(OBJEXT)
+am__objects_55 = $(am__objects_53) $(am__objects_54) $(am__objects_10)
+am__objects_56 = $(am__objects_52) $(am__objects_55)
+am__objects_57 = $(am__objects_56) libadiosf_a-adiosf_query.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_58 = libadiosf_a-adios_datatap.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE@	libadiosf_a-read_datatap.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_63 = libadiosf_a-adios_flexpath.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_59 = libadiosf_a-adios_flexpath.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE@	libadiosf_a-read_flexpath.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_64 = libadiosf_a-adios_icee.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_60 = libadiosf_a-adios_icee.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE@	libadiosf_a-read_icee.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__objects_65 = libadiosf_a-adios_nssi_config.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__objects_61 = libadiosf_a-adios_nssi_config.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_a-adios_nssi.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_a-adios_nssi_filter.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_a-read_nssi.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_66 = libadiosf_a-adiosf.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_62 = libadiosf_a-adiosf.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-common_adios.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adios_internals.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adios_internals_mxml.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_47) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_49) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_51) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_53) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_59) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_57) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-buffer.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adios_bp_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adios_endianness.$(OBJEXT) \
@@ -816,25 +811,29 @@ am__objects_59 = $(am__objects_58) libadiosf_a-adiosf_query.$(OBJEXT)
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-read_bp_staged1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adios_posix.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adios_posix1.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_58) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_59) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_60) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_61) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_62) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_63) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_64) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_65)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_BGQ_TRUE at am__objects_67 = libadiosf_a-adios_mpi_bgq.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__objects_68 = libadiosf_a-adios_phdf5.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NC4PAR_TRUE at am__objects_69 = libadiosf_a-adios_nc4.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_70 = libadiosf_a-adios_mpi.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_61)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_BGQ_TRUE at am__objects_63 = libadiosf_a-adios_mpi_bgq.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__objects_64 = libadiosf_a-adios_dataspaces.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE@	libadiosf_a-read_dataspaces.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__objects_65 = libadiosf_a-adios_dimes.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE@	libadiosf_a-read_dimes.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__objects_66 = libadiosf_a-adios_phdf5.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NC4PAR_TRUE at am__objects_67 = libadiosf_a-adios_nc4.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_68 = libadiosf_a-adios_mpi.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adios_mpi_lustre.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adios_mpi_amr.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adios_var_merge.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_67) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_68) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_69)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am_libadiosf_a_OBJECTS =  \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_63) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_64) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_65) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_66) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_70) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_67)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am_libadiosf_a_OBJECTS =  \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_62) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_68) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_a-adiosf_read.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	adiosf_defs_mod.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	adiosf_write_mod.$(OBJEXT) \
@@ -873,7 +872,6 @@ am__libadiosf_nompi_a_SOURCES_DIST = core/adiosf.c core/common_adios.c \
 	core/transforms/adios_patchdata.c core/adios_selection_util.c \
 	core/transforms/plugindetect/detect_plugin_read_hook_decls.h \
 	core/transforms/plugindetect/detect_plugin_read_hook_reg.h \
-	core/adios_read_ext.c \
 	transforms/adios_transform_identity_read.c \
 	transforms/adios_transform_zlib_read.c \
 	transforms/adios_transform_bzip2_read.c \
@@ -904,26 +902,25 @@ am__libadiosf_nompi_a_SOURCES_DIST = core/adiosf.c core/common_adios.c \
 	query/fastbit_adios.h query/adiosf_query.c core/buffer.c \
 	core/adios_bp_v1.c core/adios_endianness.c core/futils.c \
 	core/adios_error.c core/bp_utils.c core/common_read.c \
-	core/adios_infocache.c core/globals.c core/adios_timing.c \
-	core/adios_read_hooks.c core/adios_transport_hooks.c \
-	core/adios_socket.c core/adios_logger.c core/util.c \
-	core/qhashtbl.c read/read_bp.c read/read_bp_staged.c \
-	read/read_bp_staged1.c write/adios_posix.c \
-	write/adios_posix1.c write/adios_dataspaces.c \
-	read/read_dataspaces.c write/adios_dimes.c read/read_dimes.c \
-	write/adios_datatap.c read/read_datatap.c \
-	write/adios_flexpath.c read/read_flexpath.c write/adios_icee.c \
-	read/read_icee.c nssi/adios_nssi_config.c write/adios_nssi.c \
+	core/adios_infocache.c core/adios_read_ext.c core/globals.c \
+	core/adios_timing.c core/adios_read_hooks.c \
+	core/adios_transport_hooks.c core/adios_socket.c \
+	core/adios_logger.c core/util.c core/qhashtbl.c read/read_bp.c \
+	read/read_bp_staged.c read/read_bp_staged1.c \
+	write/adios_posix.c write/adios_posix1.c write/adios_datatap.c \
+	read/read_datatap.c write/adios_flexpath.c \
+	read/read_flexpath.c write/adios_icee.c read/read_icee.c \
+	nssi/adios_nssi_config.c write/adios_nssi.c \
 	nssi/adios_nssi_filter.c read/read_nssi.c core/mpidummy.c \
 	core/adiosf_read.c core/adiosf_defs_mod.f90 \
 	core/adiosf_write_mod.f90 core/adiosf_read_mod.f90 \
 	query/adios_query_mod.f90
-am__objects_71 = $(am__objects_1) \
+am__objects_69 = $(am__objects_1) \
 	libadiosf_nompi_a-adios_transforms_common.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosf_nompi_a-adios_copyspec.$(OBJEXT) \
 	libadiosf_nompi_a-adios_subvolume.$(OBJEXT)
-am__objects_72 =  \
+am__objects_70 =  \
 	libadiosf_nompi_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transform_bzip2_read.$(OBJEXT) \
@@ -931,15 +928,15 @@ am__objects_72 =  \
 	libadiosf_nompi_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_73 = $(am__objects_1) \
+am__objects_71 = $(am__objects_1) \
 	libadiosf_nompi_a-adios_transforms_read.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosf_nompi_a-adios_patchdata.$(OBJEXT) \
 	libadiosf_nompi_a-adios_selection_util.$(OBJEXT) \
-	libadiosf_nompi_a-adios_read_ext.$(OBJEXT) $(am__objects_72)
-am__objects_74 =  \
+	$(am__objects_70)
+am__objects_72 =  \
 	libadiosf_nompi_a-adios_transform_identity_write.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transform_zlib_write.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transform_bzip2_write.$(OBJEXT) \
@@ -947,47 +944,43 @@ am__objects_74 =  \
 	libadiosf_nompi_a-adios_transform_isobar_write.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transform_aplod_write.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transform_alacrity_write.$(OBJEXT)
-am__objects_75 = $(am__objects_1) \
+am__objects_73 = $(am__objects_1) \
 	libadiosf_nompi_a-adios_transforms_write.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transforms_hooks_write.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transforms_util.$(OBJEXT) \
 	libadiosf_nompi_a-adios_transforms_specparse.$(OBJEXT) \
-	$(am__objects_74)
-am__objects_76 = $(am__objects_1) \
+	$(am__objects_72)
+am__objects_74 = $(am__objects_1) \
 	libadiosf_nompi_a-common_query.$(OBJEXT) \
 	libadiosf_nompi_a-adios_query_hooks.$(OBJEXT) \
 	libadiosf_nompi_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_77 =  \
+ at HAVE_FASTBIT_TRUE@am__objects_75 =  \
 @HAVE_FASTBIT_TRUE@	libadiosf_nompi_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosf_nompi_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_78 =  \
+ at HAVE_ALACRITY_TRUE@am__objects_76 =  \
 @HAVE_ALACRITY_TRUE@	libadiosf_nompi_a-query_alac.$(OBJEXT)
-am__objects_79 = $(am__objects_77) $(am__objects_78) $(am__objects_10)
-am__objects_80 = $(am__objects_76) $(am__objects_79)
-am__objects_81 = $(am__objects_80) \
+am__objects_77 = $(am__objects_75) $(am__objects_76) $(am__objects_10)
+am__objects_78 = $(am__objects_74) $(am__objects_77)
+am__objects_79 = $(am__objects_78) \
 	libadiosf_nompi_a-adiosf_query.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__objects_82 = libadiosf_nompi_a-adios_dataspaces.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE@	libadiosf_nompi_a-read_dataspaces.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__objects_83 = libadiosf_nompi_a-adios_dimes.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE@	libadiosf_nompi_a-read_dimes.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_84 = libadiosf_nompi_a-adios_datatap.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_80 = libadiosf_nompi_a-adios_datatap.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE@	libadiosf_nompi_a-read_datatap.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_85 = libadiosf_nompi_a-adios_flexpath.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_81 = libadiosf_nompi_a-adios_flexpath.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE@	libadiosf_nompi_a-read_flexpath.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_86 = libadiosf_nompi_a-adios_icee.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_82 = libadiosf_nompi_a-adios_icee.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE@	libadiosf_nompi_a-read_icee.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__objects_87 = libadiosf_nompi_a-adios_nssi_config.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__objects_83 = libadiosf_nompi_a-adios_nssi_config.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_nompi_a-adios_nssi.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_nompi_a-adios_nssi_filter.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_nompi_a-read_nssi.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_88 = libadiosf_nompi_a-adiosf.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_84 = libadiosf_nompi_a-adiosf.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-common_adios.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-adios_internals.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-adios_internals_mxml.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_69) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_71) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_73) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_75) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_81) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_79) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-buffer.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-adios_bp_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-adios_endianness.$(OBJEXT) \
@@ -1010,16 +1003,14 @@ am__objects_81 = $(am__objects_80) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-read_bp_staged1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-adios_posix.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-adios_posix1.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_80) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_81) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_82) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_83) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_83)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_85 = libadiosf_nompi_a-mpidummy.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am_libadiosf_nompi_a_OBJECTS =  \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_84) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_85) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_86) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_87)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_89 = libadiosf_nompi_a-mpidummy.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am_libadiosf_nompi_a_OBJECTS =  \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_88) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_89) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_a-adiosf_read.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	adiosf_defs_mod.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	adiosf_write_mod.$(OBJEXT) \
@@ -1054,7 +1045,6 @@ am__libadiosf_nompi_v1_a_SOURCES_DIST = core/adiosf.c \
 	core/transforms/adios_patchdata.c core/adios_selection_util.c \
 	core/transforms/plugindetect/detect_plugin_read_hook_decls.h \
 	core/transforms/plugindetect/detect_plugin_read_hook_reg.h \
-	core/adios_read_ext.c \
 	transforms/adios_transform_identity_read.c \
 	transforms/adios_transform_zlib_read.c \
 	transforms/adios_transform_bzip2_read.c \
@@ -1085,25 +1075,24 @@ am__libadiosf_nompi_v1_a_SOURCES_DIST = core/adiosf.c \
 	query/fastbit_adios.h query/adiosf_query.c core/buffer.c \
 	core/adios_bp_v1.c core/adios_endianness.c core/futils.c \
 	core/adios_error.c core/bp_utils.c core/common_read.c \
-	core/adios_infocache.c core/globals.c core/adios_timing.c \
-	core/adios_read_hooks.c core/adios_transport_hooks.c \
-	core/adios_socket.c core/adios_logger.c core/util.c \
-	core/qhashtbl.c read/read_bp.c read/read_bp_staged.c \
-	read/read_bp_staged1.c write/adios_posix.c \
-	write/adios_posix1.c write/adios_dataspaces.c \
-	read/read_dataspaces.c write/adios_dimes.c read/read_dimes.c \
-	write/adios_datatap.c read/read_datatap.c \
-	write/adios_flexpath.c read/read_flexpath.c write/adios_icee.c \
-	read/read_icee.c nssi/adios_nssi_config.c write/adios_nssi.c \
+	core/adios_infocache.c core/adios_read_ext.c core/globals.c \
+	core/adios_timing.c core/adios_read_hooks.c \
+	core/adios_transport_hooks.c core/adios_socket.c \
+	core/adios_logger.c core/util.c core/qhashtbl.c read/read_bp.c \
+	read/read_bp_staged.c read/read_bp_staged1.c \
+	write/adios_posix.c write/adios_posix1.c write/adios_datatap.c \
+	read/read_datatap.c write/adios_flexpath.c \
+	read/read_flexpath.c write/adios_icee.c read/read_icee.c \
+	nssi/adios_nssi_config.c write/adios_nssi.c \
 	nssi/adios_nssi_filter.c read/read_nssi.c core/mpidummy.c \
 	core/adiosf_read_v1.c core/adiosf_defs_mod.f90 \
 	core/adiosf_write_mod.f90
-am__objects_90 = $(am__objects_1) \
+am__objects_86 = $(am__objects_1) \
 	libadiosf_nompi_v1_a-adios_transforms_common.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_copyspec.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_subvolume.$(OBJEXT)
-am__objects_91 =  \
+am__objects_87 =  \
 	libadiosf_nompi_v1_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transform_bzip2_read.$(OBJEXT) \
@@ -1111,16 +1100,15 @@ am__objects_91 =  \
 	libadiosf_nompi_v1_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_92 = $(am__objects_1) \
+am__objects_88 = $(am__objects_1) \
 	libadiosf_nompi_v1_a-adios_transforms_read.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_patchdata.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_selection_util.$(OBJEXT) \
-	libadiosf_nompi_v1_a-adios_read_ext.$(OBJEXT) \
-	$(am__objects_91)
-am__objects_93 =  \
+	$(am__objects_87)
+am__objects_89 =  \
 	libadiosf_nompi_v1_a-adios_transform_identity_write.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transform_zlib_write.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transform_bzip2_write.$(OBJEXT) \
@@ -1128,46 +1116,42 @@ am__objects_93 =  \
 	libadiosf_nompi_v1_a-adios_transform_isobar_write.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transform_aplod_write.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transform_alacrity_write.$(OBJEXT)
-am__objects_94 = $(am__objects_1) \
+am__objects_90 = $(am__objects_1) \
 	libadiosf_nompi_v1_a-adios_transforms_write.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transforms_hooks_write.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transforms_util.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_transforms_specparse.$(OBJEXT) \
-	$(am__objects_93)
-am__objects_95 = $(am__objects_1) \
+	$(am__objects_89)
+am__objects_91 = $(am__objects_1) \
 	libadiosf_nompi_v1_a-common_query.$(OBJEXT) \
 	libadiosf_nompi_v1_a-adios_query_hooks.$(OBJEXT) \
 	libadiosf_nompi_v1_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_96 = libadiosf_nompi_v1_a-query_fastbit.$(OBJEXT) \
+ at HAVE_FASTBIT_TRUE@am__objects_92 = libadiosf_nompi_v1_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosf_nompi_v1_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_97 =  \
+ at HAVE_ALACRITY_TRUE@am__objects_93 =  \
 @HAVE_ALACRITY_TRUE@	libadiosf_nompi_v1_a-query_alac.$(OBJEXT)
-am__objects_98 = $(am__objects_96) $(am__objects_97) $(am__objects_10)
-am__objects_99 = $(am__objects_95) $(am__objects_98)
-am__objects_100 = $(am__objects_99) \
+am__objects_94 = $(am__objects_92) $(am__objects_93) $(am__objects_10)
+am__objects_95 = $(am__objects_91) $(am__objects_94)
+am__objects_96 = $(am__objects_95) \
 	libadiosf_nompi_v1_a-adiosf_query.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__objects_101 = libadiosf_nompi_v1_a-adios_dataspaces.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE@	libadiosf_nompi_v1_a-read_dataspaces.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__objects_102 = libadiosf_nompi_v1_a-adios_dimes.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE@	libadiosf_nompi_v1_a-read_dimes.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_103 = libadiosf_nompi_v1_a-adios_datatap.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_97 = libadiosf_nompi_v1_a-adios_datatap.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE@	libadiosf_nompi_v1_a-read_datatap.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_104 = libadiosf_nompi_v1_a-adios_flexpath.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_98 = libadiosf_nompi_v1_a-adios_flexpath.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE@	libadiosf_nompi_v1_a-read_flexpath.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_105 = libadiosf_nompi_v1_a-adios_icee.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_99 = libadiosf_nompi_v1_a-adios_icee.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE@	libadiosf_nompi_v1_a-read_icee.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__objects_106 = libadiosf_nompi_v1_a-adios_nssi_config.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__objects_100 = libadiosf_nompi_v1_a-adios_nssi_config.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_nompi_v1_a-adios_nssi.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_nompi_v1_a-adios_nssi_filter.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_nompi_v1_a-read_nssi.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_107 = libadiosf_nompi_v1_a-adiosf.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_101 = libadiosf_nompi_v1_a-adiosf.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-common_adios.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-adios_internals.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-adios_internals_mxml.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_86) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_88) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_90) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_92) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_94) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_100) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_96) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-buffer.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-adios_bp_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-adios_endianness.$(OBJEXT) \
@@ -1190,16 +1174,14 @@ am__objects_100 = $(am__objects_99) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-read_bp_staged1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-adios_posix.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-adios_posix1.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_97) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_98) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_99) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_100)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_102 = libadiosf_nompi_v1_a-mpidummy.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am_libadiosf_nompi_v1_a_OBJECTS =  \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_101) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_102) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_103) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_104) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_105) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_106)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_108 = libadiosf_nompi_v1_a-mpidummy.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am_libadiosf_nompi_v1_a_OBJECTS =  \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_107) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_108) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_nompi_v1_a-adiosf_read_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	adiosf_defs_mod.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	adiosf_write_mod.$(OBJEXT)
@@ -1232,7 +1214,6 @@ am__libadiosf_v1_a_SOURCES_DIST = core/adiosf.c core/common_adios.c \
 	core/transforms/adios_patchdata.c core/adios_selection_util.c \
 	core/transforms/plugindetect/detect_plugin_read_hook_decls.h \
 	core/transforms/plugindetect/detect_plugin_read_hook_reg.h \
-	core/adios_read_ext.c \
 	transforms/adios_transform_identity_read.c \
 	transforms/adios_transform_zlib_read.c \
 	transforms/adios_transform_bzip2_read.c \
@@ -1263,27 +1244,28 @@ am__libadiosf_v1_a_SOURCES_DIST = core/adiosf.c core/common_adios.c \
 	query/fastbit_adios.h query/adiosf_query.c core/buffer.c \
 	core/adios_bp_v1.c core/adios_endianness.c core/futils.c \
 	core/adios_error.c core/bp_utils.c core/common_read.c \
-	core/adios_infocache.c core/globals.c core/adios_timing.c \
-	core/adios_read_hooks.c core/adios_transport_hooks.c \
-	core/adios_socket.c core/adios_logger.c core/util.c \
-	core/qhashtbl.c read/read_bp.c read/read_bp_staged.c \
-	read/read_bp_staged1.c write/adios_posix.c \
-	write/adios_posix1.c write/adios_dataspaces.c \
-	read/read_dataspaces.c write/adios_dimes.c read/read_dimes.c \
-	write/adios_datatap.c read/read_datatap.c \
-	write/adios_flexpath.c read/read_flexpath.c write/adios_icee.c \
-	read/read_icee.c nssi/adios_nssi_config.c write/adios_nssi.c \
+	core/adios_infocache.c core/adios_read_ext.c core/globals.c \
+	core/adios_timing.c core/adios_read_hooks.c \
+	core/adios_transport_hooks.c core/adios_socket.c \
+	core/adios_logger.c core/util.c core/qhashtbl.c read/read_bp.c \
+	read/read_bp_staged.c read/read_bp_staged1.c \
+	write/adios_posix.c write/adios_posix1.c write/adios_datatap.c \
+	read/read_datatap.c write/adios_flexpath.c \
+	read/read_flexpath.c write/adios_icee.c read/read_icee.c \
+	nssi/adios_nssi_config.c write/adios_nssi.c \
 	nssi/adios_nssi_filter.c read/read_nssi.c write/adios_mpi.c \
 	write/adios_mpi_lustre.c write/adios_mpi_amr.c \
 	write/adios_var_merge.c write/adios_mpi_bgq.c \
-	write/adios_phdf5.c write/adios_nc4.c core/adiosf_read_v1.c \
+	write/adios_dataspaces.c read/read_dataspaces.c \
+	write/adios_dimes.c read/read_dimes.c write/adios_phdf5.c \
+	write/adios_nc4.c core/adiosf_read_v1.c \
 	core/adiosf_defs_mod.f90 core/adiosf_write_mod.f90
-am__objects_109 = $(am__objects_1) \
+am__objects_103 = $(am__objects_1) \
 	libadiosf_v1_a-adios_transforms_common.$(OBJEXT) \
 	libadiosf_v1_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosf_v1_a-adios_copyspec.$(OBJEXT) \
 	libadiosf_v1_a-adios_subvolume.$(OBJEXT)
-am__objects_110 =  \
+am__objects_104 =  \
 	libadiosf_v1_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosf_v1_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosf_v1_a-adios_transform_bzip2_read.$(OBJEXT) \
@@ -1291,15 +1273,15 @@ am__objects_110 =  \
 	libadiosf_v1_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosf_v1_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosf_v1_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_111 = $(am__objects_1) \
+am__objects_105 = $(am__objects_1) \
 	libadiosf_v1_a-adios_transforms_read.$(OBJEXT) \
 	libadiosf_v1_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosf_v1_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosf_v1_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosf_v1_a-adios_patchdata.$(OBJEXT) \
 	libadiosf_v1_a-adios_selection_util.$(OBJEXT) \
-	libadiosf_v1_a-adios_read_ext.$(OBJEXT) $(am__objects_110)
-am__objects_112 =  \
+	$(am__objects_104)
+am__objects_106 =  \
 	libadiosf_v1_a-adios_transform_identity_write.$(OBJEXT) \
 	libadiosf_v1_a-adios_transform_zlib_write.$(OBJEXT) \
 	libadiosf_v1_a-adios_transform_bzip2_write.$(OBJEXT) \
@@ -1307,48 +1289,44 @@ am__objects_112 =  \
 	libadiosf_v1_a-adios_transform_isobar_write.$(OBJEXT) \
 	libadiosf_v1_a-adios_transform_aplod_write.$(OBJEXT) \
 	libadiosf_v1_a-adios_transform_alacrity_write.$(OBJEXT)
-am__objects_113 = $(am__objects_1) \
+am__objects_107 = $(am__objects_1) \
 	libadiosf_v1_a-adios_transforms_write.$(OBJEXT) \
 	libadiosf_v1_a-adios_transforms_hooks_write.$(OBJEXT) \
 	libadiosf_v1_a-adios_transforms_util.$(OBJEXT) \
 	libadiosf_v1_a-adios_transforms_specparse.$(OBJEXT) \
-	$(am__objects_112)
-am__objects_114 = $(am__objects_1) \
+	$(am__objects_106)
+am__objects_108 = $(am__objects_1) \
 	libadiosf_v1_a-common_query.$(OBJEXT) \
 	libadiosf_v1_a-adios_query_hooks.$(OBJEXT) \
 	libadiosf_v1_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_115 =  \
+ at HAVE_FASTBIT_TRUE@am__objects_109 =  \
 @HAVE_FASTBIT_TRUE@	libadiosf_v1_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosf_v1_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_116 =  \
+ at HAVE_ALACRITY_TRUE@am__objects_110 =  \
 @HAVE_ALACRITY_TRUE@	libadiosf_v1_a-query_alac.$(OBJEXT)
-am__objects_117 = $(am__objects_115) $(am__objects_116) \
+am__objects_111 = $(am__objects_109) $(am__objects_110) \
 	$(am__objects_10)
-am__objects_118 = $(am__objects_114) $(am__objects_117)
-am__objects_119 = $(am__objects_118) \
+am__objects_112 = $(am__objects_108) $(am__objects_111)
+am__objects_113 = $(am__objects_112) \
 	libadiosf_v1_a-adiosf_query.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__objects_120 = libadiosf_v1_a-adios_dataspaces.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE@	libadiosf_v1_a-read_dataspaces.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__objects_121 = libadiosf_v1_a-adios_dimes.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE@	libadiosf_v1_a-read_dimes.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_122 = libadiosf_v1_a-adios_datatap.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE at am__objects_114 = libadiosf_v1_a-adios_datatap.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATATAP_TRUE@	libadiosf_v1_a-read_datatap.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_123 = libadiosf_v1_a-adios_flexpath.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_115 = libadiosf_v1_a-adios_flexpath.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_FLEXPATH_TRUE@	libadiosf_v1_a-read_flexpath.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_124 = libadiosf_v1_a-adios_icee.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE at am__objects_116 = libadiosf_v1_a-adios_icee.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_ICEE_TRUE@	libadiosf_v1_a-read_icee.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__objects_125 = libadiosf_v1_a-adios_nssi_config.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at am__objects_117 = libadiosf_v1_a-adios_nssi_config.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_v1_a-adios_nssi.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_v1_a-adios_nssi_filter.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE@	libadiosf_v1_a-read_nssi.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_126 = libadiosf_v1_a-adiosf.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_118 = libadiosf_v1_a-adiosf.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-common_adios.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adios_internals.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adios_internals_mxml.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_109) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_111) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_103) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_105) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_107) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_113) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_119) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-buffer.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adios_bp_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adios_endianness.$(OBJEXT) \
@@ -1371,25 +1349,29 @@ am__objects_119 = $(am__objects_118) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-read_bp_staged1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adios_posix.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adios_posix1.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_120) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_121) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_122) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_123) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_124) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_125)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_BGQ_TRUE at am__objects_127 = libadiosf_v1_a-adios_mpi_bgq.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__objects_128 = libadiosf_v1_a-adios_phdf5.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NC4PAR_TRUE at am__objects_129 = libadiosf_v1_a-adios_nc4.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_130 = libadiosf_v1_a-adios_mpi.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_114) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_115) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_116) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_117)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_BGQ_TRUE at am__objects_119 = libadiosf_v1_a-adios_mpi_bgq.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE at am__objects_120 = libadiosf_v1_a-adios_dataspaces.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DATASPACES_TRUE@	libadiosf_v1_a-read_dataspaces.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE at am__objects_121 = libadiosf_v1_a-adios_dimes.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_DIMES_TRUE@	libadiosf_v1_a-read_dimes.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_PHDF5_TRUE at am__objects_122 = libadiosf_v1_a-adios_phdf5.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@@HAVE_NC4PAR_TRUE at am__objects_123 = libadiosf_v1_a-adios_nc4.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am__objects_124 = libadiosf_v1_a-adios_mpi.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adios_mpi_lustre.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adios_mpi_amr.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adios_var_merge.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_127) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_128) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_129)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_119) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_120) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_121) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_122) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_123)
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at am_libadiosf_v1_a_OBJECTS =  \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_126) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_130) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_118) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__objects_124) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	libadiosf_v1_a-adiosf_read_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	adiosf_defs_mod.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	adiosf_write_mod.$(OBJEXT)
@@ -1441,12 +1423,12 @@ am__libadiosread_a_SOURCES_DIST = core/adios_bp_v1.c \
 	read/read_bp_staged1.c read/read_dataspaces.c \
 	read/read_dimes.c read/read_datatap.c read/read_flexpath.c \
 	read/read_icee.c nssi/adios_nssi_config.c read/read_nssi.c
-am__objects_131 = $(am__objects_1) \
+am__objects_125 = $(am__objects_1) \
 	libadiosread_a-adios_transforms_common.$(OBJEXT) \
 	libadiosread_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosread_a-adios_copyspec.$(OBJEXT) \
 	libadiosread_a-adios_subvolume.$(OBJEXT)
-am__objects_132 =  \
+am__objects_126 =  \
 	libadiosread_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosread_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosread_a-adios_transform_bzip2_read.$(OBJEXT) \
@@ -1454,37 +1436,37 @@ am__objects_132 =  \
 	libadiosread_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosread_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosread_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_133 = $(am__objects_1) \
+am__objects_127 = $(am__objects_1) \
 	libadiosread_a-adios_transforms_read.$(OBJEXT) \
 	libadiosread_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosread_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosread_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosread_a-adios_patchdata.$(OBJEXT) \
 	libadiosread_a-adios_selection_util.$(OBJEXT) \
-	libadiosread_a-adios_read_ext.$(OBJEXT) $(am__objects_132)
-am__objects_134 = $(am__objects_1) \
+	$(am__objects_126)
+am__objects_128 = $(am__objects_1) \
 	libadiosread_a-common_query.$(OBJEXT) \
 	libadiosread_a-adios_query_hooks.$(OBJEXT) \
 	libadiosread_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_135 =  \
+ at HAVE_FASTBIT_TRUE@am__objects_129 =  \
 @HAVE_FASTBIT_TRUE@	libadiosread_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosread_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_136 =  \
+ at HAVE_ALACRITY_TRUE@am__objects_130 =  \
 @HAVE_ALACRITY_TRUE@	libadiosread_a-query_alac.$(OBJEXT)
-am__objects_137 = $(am__objects_135) $(am__objects_136) \
+am__objects_131 = $(am__objects_129) $(am__objects_130) \
 	$(am__objects_10)
-am__objects_138 = $(am__objects_134) $(am__objects_137)
-am__objects_139 = $(am__objects_138) \
+am__objects_132 = $(am__objects_128) $(am__objects_131)
+am__objects_133 = $(am__objects_132) \
 	libadiosread_a-adios_query.$(OBJEXT)
- at HAVE_DATASPACES_TRUE@am__objects_140 = libadiosread_a-read_dataspaces.$(OBJEXT)
- at HAVE_DIMES_TRUE@am__objects_141 =  \
+ at HAVE_DATASPACES_TRUE@am__objects_134 = libadiosread_a-read_dataspaces.$(OBJEXT)
+ at HAVE_DIMES_TRUE@am__objects_135 =  \
 @HAVE_DIMES_TRUE@	libadiosread_a-read_dimes.$(OBJEXT)
- at HAVE_DATATAP_TRUE@am__objects_142 =  \
+ at HAVE_DATATAP_TRUE@am__objects_136 =  \
 @HAVE_DATATAP_TRUE@	libadiosread_a-read_datatap.$(OBJEXT)
- at HAVE_FLEXPATH_TRUE@am__objects_143 =  \
+ at HAVE_FLEXPATH_TRUE@am__objects_137 =  \
 @HAVE_FLEXPATH_TRUE@	libadiosread_a-read_flexpath.$(OBJEXT)
- at HAVE_ICEE_TRUE@am__objects_144 = libadiosread_a-read_icee.$(OBJEXT)
- at HAVE_NSSI_TRUE@am__objects_145 =  \
+ at HAVE_ICEE_TRUE@am__objects_138 = libadiosread_a-read_icee.$(OBJEXT)
+ at HAVE_NSSI_TRUE@am__objects_139 =  \
 @HAVE_NSSI_TRUE@	libadiosread_a-adios_nssi_config.$(OBJEXT) \
 @HAVE_NSSI_TRUE@	libadiosread_a-read_nssi.$(OBJEXT)
 am_libadiosread_a_OBJECTS = libadiosread_a-adios_bp_v1.$(OBJEXT) \
@@ -1496,8 +1478,8 @@ am_libadiosread_a_OBJECTS = libadiosread_a-adios_bp_v1.$(OBJEXT) \
 	libadiosread_a-adios_read_v1.$(OBJEXT) \
 	libadiosread_a-common_read.$(OBJEXT) \
 	libadiosread_a-adios_infocache.$(OBJEXT) \
-	libadiosread_a-adios_read_ext.$(OBJEXT) $(am__objects_131) \
-	$(am__objects_133) $(am__objects_139) \
+	libadiosread_a-adios_read_ext.$(OBJEXT) $(am__objects_125) \
+	$(am__objects_127) $(am__objects_133) \
 	libadiosread_a-globals.$(OBJEXT) \
 	libadiosread_a-adios_read_hooks.$(OBJEXT) \
 	libadiosread_a-adios_logger.$(OBJEXT) \
@@ -1505,9 +1487,9 @@ am_libadiosread_a_OBJECTS = libadiosread_a-adios_bp_v1.$(OBJEXT) \
 	libadiosread_a-qhashtbl.$(OBJEXT) \
 	libadiosread_a-read_bp.$(OBJEXT) \
 	libadiosread_a-read_bp_staged.$(OBJEXT) \
-	libadiosread_a-read_bp_staged1.$(OBJEXT) $(am__objects_140) \
-	$(am__objects_141) $(am__objects_142) $(am__objects_143) \
-	$(am__objects_144) $(am__objects_145)
+	libadiosread_a-read_bp_staged1.$(OBJEXT) $(am__objects_134) \
+	$(am__objects_135) $(am__objects_136) $(am__objects_137) \
+	$(am__objects_138) $(am__objects_139)
 am__dist_libadiosread_a_SOURCES_DIST = nssi/adios_nssi_args.x
 dist_libadiosread_a_OBJECTS =
 @HAVE_NSSI_TRUE at nodist_libadiosread_a_OBJECTS =  \
@@ -1558,16 +1540,15 @@ am__libadiosread_nompi_a_SOURCES_DIST = core/mpidummy.c \
 	query/query_fastbit.c query/fastbit_adios.c query/query_alac.c \
 	query/fastbit_adios.h query/adios_query.c core/adios_logger.c \
 	core/buffer.c core/globals.c core/adios_read_hooks.c \
-	core/util.c core/qhashtbl.c read/read_bp.c \
-	read/read_dataspaces.c read/read_dimes.c read/read_datatap.c \
+	core/util.c core/qhashtbl.c read/read_bp.c read/read_datatap.c \
 	read/read_flexpath.c read/read_icee.c nssi/adios_nssi_config.c \
 	read/read_nssi.c
-am__objects_146 = $(am__objects_1) \
+am__objects_140 = $(am__objects_1) \
 	libadiosread_nompi_a-adios_transforms_common.$(OBJEXT) \
 	libadiosread_nompi_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosread_nompi_a-adios_copyspec.$(OBJEXT) \
 	libadiosread_nompi_a-adios_subvolume.$(OBJEXT)
-am__objects_147 =  \
+am__objects_141 =  \
 	libadiosread_nompi_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosread_nompi_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosread_nompi_a-adios_transform_bzip2_read.$(OBJEXT) \
@@ -1575,36 +1556,32 @@ am__objects_147 =  \
 	libadiosread_nompi_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosread_nompi_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosread_nompi_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_148 = $(am__objects_1) \
+am__objects_142 = $(am__objects_1) \
 	libadiosread_nompi_a-adios_transforms_read.$(OBJEXT) \
 	libadiosread_nompi_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosread_nompi_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosread_nompi_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosread_nompi_a-adios_patchdata.$(OBJEXT) \
 	libadiosread_nompi_a-adios_selection_util.$(OBJEXT) \
-	libadiosread_nompi_a-adios_read_ext.$(OBJEXT) \
-	$(am__objects_147)
-am__objects_149 = $(am__objects_1) \
+	$(am__objects_141)
+am__objects_143 = $(am__objects_1) \
 	libadiosread_nompi_a-common_query.$(OBJEXT) \
 	libadiosread_nompi_a-adios_query_hooks.$(OBJEXT) \
 	libadiosread_nompi_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_150 = libadiosread_nompi_a-query_fastbit.$(OBJEXT) \
+ at HAVE_FASTBIT_TRUE@am__objects_144 = libadiosread_nompi_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosread_nompi_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_151 =  \
+ at HAVE_ALACRITY_TRUE@am__objects_145 =  \
 @HAVE_ALACRITY_TRUE@	libadiosread_nompi_a-query_alac.$(OBJEXT)
-am__objects_152 = $(am__objects_150) $(am__objects_151) \
+am__objects_146 = $(am__objects_144) $(am__objects_145) \
 	$(am__objects_10)
-am__objects_153 = $(am__objects_149) $(am__objects_152)
-am__objects_154 = $(am__objects_153) \
+am__objects_147 = $(am__objects_143) $(am__objects_146)
+am__objects_148 = $(am__objects_147) \
 	libadiosread_nompi_a-adios_query.$(OBJEXT)
- at HAVE_DATASPACES_TRUE@am__objects_155 = libadiosread_nompi_a-read_dataspaces.$(OBJEXT)
- at HAVE_DIMES_TRUE@am__objects_156 =  \
- at HAVE_DIMES_TRUE@	libadiosread_nompi_a-read_dimes.$(OBJEXT)
- at HAVE_DATATAP_TRUE@am__objects_157 = libadiosread_nompi_a-read_datatap.$(OBJEXT)
- at HAVE_FLEXPATH_TRUE@am__objects_158 = libadiosread_nompi_a-read_flexpath.$(OBJEXT)
- at HAVE_ICEE_TRUE@am__objects_159 =  \
+ at HAVE_DATATAP_TRUE@am__objects_149 = libadiosread_nompi_a-read_datatap.$(OBJEXT)
+ at HAVE_FLEXPATH_TRUE@am__objects_150 = libadiosread_nompi_a-read_flexpath.$(OBJEXT)
+ at HAVE_ICEE_TRUE@am__objects_151 =  \
 @HAVE_ICEE_TRUE@	libadiosread_nompi_a-read_icee.$(OBJEXT)
- at HAVE_NSSI_TRUE@am__objects_160 = libadiosread_nompi_a-adios_nssi_config.$(OBJEXT) \
+ at HAVE_NSSI_TRUE@am__objects_152 = libadiosread_nompi_a-adios_nssi_config.$(OBJEXT) \
 @HAVE_NSSI_TRUE@	libadiosread_nompi_a-read_nssi.$(OBJEXT)
 am_libadiosread_nompi_a_OBJECTS =  \
 	libadiosread_nompi_a-mpidummy.$(OBJEXT) \
@@ -1618,16 +1595,15 @@ am_libadiosread_nompi_a_OBJECTS =  \
 	libadiosread_nompi_a-common_read.$(OBJEXT) \
 	libadiosread_nompi_a-adios_infocache.$(OBJEXT) \
 	libadiosread_nompi_a-adios_read_ext.$(OBJEXT) \
-	$(am__objects_146) $(am__objects_148) $(am__objects_154) \
+	$(am__objects_140) $(am__objects_142) $(am__objects_148) \
 	libadiosread_nompi_a-adios_logger.$(OBJEXT) \
 	libadiosread_nompi_a-buffer.$(OBJEXT) \
 	libadiosread_nompi_a-globals.$(OBJEXT) \
 	libadiosread_nompi_a-adios_read_hooks.$(OBJEXT) \
 	libadiosread_nompi_a-util.$(OBJEXT) \
 	libadiosread_nompi_a-qhashtbl.$(OBJEXT) \
-	libadiosread_nompi_a-read_bp.$(OBJEXT) $(am__objects_155) \
-	$(am__objects_156) $(am__objects_157) $(am__objects_158) \
-	$(am__objects_159) $(am__objects_160)
+	libadiosread_nompi_a-read_bp.$(OBJEXT) $(am__objects_149) \
+	$(am__objects_150) $(am__objects_151) $(am__objects_152)
 am__dist_libadiosread_nompi_a_SOURCES_DIST = nssi/adios_nssi_args.x
 dist_libadiosread_nompi_a_OBJECTS =
 @HAVE_NSSI_TRUE at nodist_libadiosread_nompi_a_OBJECTS = libadiosread_nompi_a-adios_nssi_args.$(OBJEXT)
@@ -1682,12 +1658,12 @@ am__libadiosreadf_a_SOURCES_DIST = core/adios_bp_v1.c \
 	read/read_icee.c nssi/adios_nssi_config.c read/read_nssi.c \
 	core/adiosf_read.c core/adiosf_defs_mod.f90 \
 	core/adiosf_read_mod.f90 query/adios_query_mod.f90
-am__objects_161 = $(am__objects_1) \
+am__objects_153 = $(am__objects_1) \
 	libadiosreadf_a-adios_transforms_common.$(OBJEXT) \
 	libadiosreadf_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosreadf_a-adios_copyspec.$(OBJEXT) \
 	libadiosreadf_a-adios_subvolume.$(OBJEXT)
-am__objects_162 =  \
+am__objects_154 =  \
 	libadiosreadf_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosreadf_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosreadf_a-adios_transform_bzip2_read.$(OBJEXT) \
@@ -1695,36 +1671,36 @@ am__objects_162 =  \
 	libadiosreadf_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosreadf_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosreadf_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_163 = $(am__objects_1) \
+am__objects_155 = $(am__objects_1) \
 	libadiosreadf_a-adios_transforms_read.$(OBJEXT) \
 	libadiosreadf_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosreadf_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosreadf_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosreadf_a-adios_patchdata.$(OBJEXT) \
 	libadiosreadf_a-adios_selection_util.$(OBJEXT) \
-	libadiosreadf_a-adios_read_ext.$(OBJEXT) $(am__objects_162)
-am__objects_164 = $(am__objects_1) \
+	$(am__objects_154)
+am__objects_156 = $(am__objects_1) \
 	libadiosreadf_a-common_query.$(OBJEXT) \
 	libadiosreadf_a-adios_query_hooks.$(OBJEXT) \
 	libadiosreadf_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_165 =  \
+ at HAVE_FASTBIT_TRUE@am__objects_157 =  \
 @HAVE_FASTBIT_TRUE@	libadiosreadf_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosreadf_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_166 =  \
+ at HAVE_ALACRITY_TRUE@am__objects_158 =  \
 @HAVE_ALACRITY_TRUE@	libadiosreadf_a-query_alac.$(OBJEXT)
-am__objects_167 = $(am__objects_165) $(am__objects_166) \
+am__objects_159 = $(am__objects_157) $(am__objects_158) \
 	$(am__objects_10)
-am__objects_168 = $(am__objects_164) $(am__objects_167)
-am__objects_169 = $(am__objects_168) \
+am__objects_160 = $(am__objects_156) $(am__objects_159)
+am__objects_161 = $(am__objects_160) \
 	libadiosreadf_a-adiosf_query.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DATASPACES_TRUE at am__objects_170 = libadiosreadf_a-read_dataspaces.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DIMES_TRUE at am__objects_171 = libadiosreadf_a-read_dimes.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__objects_172 = libadiosreadf_a-read_datatap.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_173 = libadiosreadf_a-read_flexpath.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__objects_174 = libadiosreadf_a-read_icee.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__objects_175 = libadiosreadf_a-adios_nssi_config.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@HAVE_DATASPACES_TRUE at am__objects_162 = libadiosreadf_a-read_dataspaces.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_DIMES_TRUE at am__objects_163 = libadiosreadf_a-read_dimes.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__objects_164 = libadiosreadf_a-read_datatap.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_165 = libadiosreadf_a-read_flexpath.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__objects_166 = libadiosreadf_a-read_icee.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__objects_167 = libadiosreadf_a-adios_nssi_config.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE@	libadiosreadf_a-read_nssi.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@am__objects_176 =  \
+ at BUILD_FORTRAN_TRUE@am__objects_168 =  \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-adios_bp_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-adios_endianness.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-bp_utils.$(OBJEXT) \
@@ -1733,8 +1709,8 @@ am__objects_169 = $(am__objects_168) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-common_read.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-adios_infocache.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-adios_read_ext.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_161) $(am__objects_163) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_169) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_153) $(am__objects_155) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_161) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-globals.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-adios_read_hooks.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-adios_logger.$(OBJEXT) \
@@ -1743,10 +1719,10 @@ am__objects_169 = $(am__objects_168) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-read_bp.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-read_bp_staged.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-read_bp_staged1.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_170) $(am__objects_171) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_172) $(am__objects_173) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_174) $(am__objects_175)
- at BUILD_FORTRAN_TRUE@am_libadiosreadf_a_OBJECTS = $(am__objects_176) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_162) $(am__objects_163) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_164) $(am__objects_165) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_166) $(am__objects_167)
+ at BUILD_FORTRAN_TRUE@am_libadiosreadf_a_OBJECTS = $(am__objects_168) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_a-adiosf_read.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	adiosf_defs_mod.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	adiosf_read_mod.$(OBJEXT) \
@@ -1800,15 +1776,15 @@ am__libadiosreadf_nompi_a_SOURCES_DIST = core/mpidummy.c \
 	query/query_fastbit.c query/fastbit_adios.c query/query_alac.c \
 	query/fastbit_adios.h query/adiosf_query.c core/globals.c \
 	core/adios_read_hooks.c core/util.c core/qhashtbl.c \
-	read/read_bp.c read/read_dataspaces.c read/read_dimes.c \
-	read/read_datatap.c read/read_flexpath.c read/read_icee.c \
-	nssi/adios_nssi_config.c read/read_nssi.c core/adiosf_read.c
-am__objects_177 = $(am__objects_1) \
+	read/read_bp.c read/read_datatap.c read/read_flexpath.c \
+	read/read_icee.c nssi/adios_nssi_config.c read/read_nssi.c \
+	core/adiosf_read.c
+am__objects_169 = $(am__objects_1) \
 	libadiosreadf_nompi_a-adios_transforms_common.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_copyspec.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_subvolume.$(OBJEXT)
-am__objects_178 =  \
+am__objects_170 =  \
 	libadiosreadf_nompi_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_transform_bzip2_read.$(OBJEXT) \
@@ -1816,35 +1792,32 @@ am__objects_178 =  \
 	libadiosreadf_nompi_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_179 = $(am__objects_1) \
+am__objects_171 = $(am__objects_1) \
 	libadiosreadf_nompi_a-adios_transforms_read.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_patchdata.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_selection_util.$(OBJEXT) \
-	libadiosreadf_nompi_a-adios_read_ext.$(OBJEXT) \
-	$(am__objects_178)
-am__objects_180 = $(am__objects_1) \
+	$(am__objects_170)
+am__objects_172 = $(am__objects_1) \
 	libadiosreadf_nompi_a-common_query.$(OBJEXT) \
 	libadiosreadf_nompi_a-adios_query_hooks.$(OBJEXT) \
 	libadiosreadf_nompi_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_181 = libadiosreadf_nompi_a-query_fastbit.$(OBJEXT) \
+ at HAVE_FASTBIT_TRUE@am__objects_173 = libadiosreadf_nompi_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosreadf_nompi_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_182 = libadiosreadf_nompi_a-query_alac.$(OBJEXT)
-am__objects_183 = $(am__objects_181) $(am__objects_182) \
+ at HAVE_ALACRITY_TRUE@am__objects_174 = libadiosreadf_nompi_a-query_alac.$(OBJEXT)
+am__objects_175 = $(am__objects_173) $(am__objects_174) \
 	$(am__objects_10)
-am__objects_184 = $(am__objects_180) $(am__objects_183)
-am__objects_185 = $(am__objects_184) \
+am__objects_176 = $(am__objects_172) $(am__objects_175)
+am__objects_177 = $(am__objects_176) \
 	libadiosreadf_nompi_a-adiosf_query.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DATASPACES_TRUE at am__objects_186 = libadiosreadf_nompi_a-read_dataspaces.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DIMES_TRUE at am__objects_187 = libadiosreadf_nompi_a-read_dimes.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__objects_188 = libadiosreadf_nompi_a-read_datatap.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_189 = libadiosreadf_nompi_a-read_flexpath.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__objects_190 = libadiosreadf_nompi_a-read_icee.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__objects_191 = libadiosreadf_nompi_a-adios_nssi_config.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__objects_178 = libadiosreadf_nompi_a-read_datatap.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_179 = libadiosreadf_nompi_a-read_flexpath.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__objects_180 = libadiosreadf_nompi_a-read_icee.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__objects_181 = libadiosreadf_nompi_a-adios_nssi_config.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE@	libadiosreadf_nompi_a-read_nssi.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@am__objects_192 =  \
+ at BUILD_FORTRAN_TRUE@am__objects_182 =  \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-mpidummy.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-adios_bp_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-adios_endianness.$(OBJEXT) \
@@ -1855,18 +1828,17 @@ am__objects_185 = $(am__objects_184) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-common_read.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-adios_infocache.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-adios_read_ext.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_177) $(am__objects_179) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_185) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_169) $(am__objects_171) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_177) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-globals.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-adios_read_hooks.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-util.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-qhashtbl.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-read_bp.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_186) $(am__objects_187) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_188) $(am__objects_189) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_190) $(am__objects_191)
+ at BUILD_FORTRAN_TRUE@	$(am__objects_178) $(am__objects_179) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_180) $(am__objects_181)
 @BUILD_FORTRAN_TRUE at am_libadiosreadf_nompi_a_OBJECTS =  \
- at BUILD_FORTRAN_TRUE@	$(am__objects_192) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_182) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_a-adiosf_read.$(OBJEXT)
 am__dist_libadiosreadf_nompi_a_SOURCES_DIST = nssi/adios_nssi_args.x
 dist_libadiosreadf_nompi_a_OBJECTS =
@@ -1917,51 +1889,47 @@ am__libadiosreadf_nompi_v1_a_SOURCES_DIST = core/mpidummy.c \
 	query/query_fastbit.c query/fastbit_adios.c query/query_alac.c \
 	query/fastbit_adios.h query/adiosf_query.c core/globals.c \
 	core/adios_read_hooks.c core/util.c core/qhashtbl.c \
-	read/read_bp.c read/read_dataspaces.c read/read_dimes.c \
-	read/read_datatap.c read/read_flexpath.c read/read_icee.c \
-	nssi/adios_nssi_config.c read/read_nssi.c \
+	read/read_bp.c read/read_datatap.c read/read_flexpath.c \
+	read/read_icee.c nssi/adios_nssi_config.c read/read_nssi.c \
 	core/adiosf_read_v1.c
-am__objects_193 = $(am__objects_1) \
+am__objects_183 = $(am__objects_1) \
 	libadiosreadf_nompi_v1_a-adios_transforms_common.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_copyspec.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_subvolume.$(OBJEXT)
-am__objects_194 = libadiosreadf_nompi_v1_a-adios_transform_identity_read.$(OBJEXT) \
+am__objects_184 = libadiosreadf_nompi_v1_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transform_bzip2_read.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transform_szip_read.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_195 = $(am__objects_1) \
+am__objects_185 = $(am__objects_1) \
 	libadiosreadf_nompi_v1_a-adios_transforms_read.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_patchdata.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_selection_util.$(OBJEXT) \
-	libadiosreadf_nompi_v1_a-adios_read_ext.$(OBJEXT) \
-	$(am__objects_194)
-am__objects_196 = $(am__objects_1) \
+	$(am__objects_184)
+am__objects_186 = $(am__objects_1) \
 	libadiosreadf_nompi_v1_a-common_query.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-adios_query_hooks.$(OBJEXT) \
 	libadiosreadf_nompi_v1_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_197 = libadiosreadf_nompi_v1_a-query_fastbit.$(OBJEXT) \
+ at HAVE_FASTBIT_TRUE@am__objects_187 = libadiosreadf_nompi_v1_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosreadf_nompi_v1_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_198 = libadiosreadf_nompi_v1_a-query_alac.$(OBJEXT)
-am__objects_199 = $(am__objects_197) $(am__objects_198) \
+ at HAVE_ALACRITY_TRUE@am__objects_188 = libadiosreadf_nompi_v1_a-query_alac.$(OBJEXT)
+am__objects_189 = $(am__objects_187) $(am__objects_188) \
 	$(am__objects_10)
-am__objects_200 = $(am__objects_196) $(am__objects_199)
-am__objects_201 = $(am__objects_200) \
+am__objects_190 = $(am__objects_186) $(am__objects_189)
+am__objects_191 = $(am__objects_190) \
 	libadiosreadf_nompi_v1_a-adiosf_query.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DATASPACES_TRUE at am__objects_202 = libadiosreadf_nompi_v1_a-read_dataspaces.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DIMES_TRUE at am__objects_203 = libadiosreadf_nompi_v1_a-read_dimes.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__objects_204 = libadiosreadf_nompi_v1_a-read_datatap.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_205 = libadiosreadf_nompi_v1_a-read_flexpath.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__objects_206 = libadiosreadf_nompi_v1_a-read_icee.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__objects_207 = libadiosreadf_nompi_v1_a-adios_nssi_config.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__objects_192 = libadiosreadf_nompi_v1_a-read_datatap.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_193 = libadiosreadf_nompi_v1_a-read_flexpath.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__objects_194 = libadiosreadf_nompi_v1_a-read_icee.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__objects_195 = libadiosreadf_nompi_v1_a-adios_nssi_config.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE@	libadiosreadf_nompi_v1_a-read_nssi.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@am__objects_208 = libadiosreadf_nompi_v1_a-mpidummy.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@am__objects_196 = libadiosreadf_nompi_v1_a-mpidummy.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-adios_bp_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-adios_endianness.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-bp_utils.$(OBJEXT) \
@@ -1971,18 +1939,17 @@ am__objects_201 = $(am__objects_200) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-common_read.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-adios_infocache.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-adios_read_ext.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_193) $(am__objects_195) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_201) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_183) $(am__objects_185) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_191) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-globals.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-adios_read_hooks.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-util.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-qhashtbl.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-read_bp.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_202) $(am__objects_203) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_204) $(am__objects_205) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_206) $(am__objects_207)
+ at BUILD_FORTRAN_TRUE@	$(am__objects_192) $(am__objects_193) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_194) $(am__objects_195)
 @BUILD_FORTRAN_TRUE at am_libadiosreadf_nompi_v1_a_OBJECTS =  \
- at BUILD_FORTRAN_TRUE@	$(am__objects_208) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_196) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_nompi_v1_a-adiosf_read_v1.$(OBJEXT)
 libadiosreadf_nompi_v1_a_OBJECTS =  \
 	$(am_libadiosreadf_nompi_v1_a_OBJECTS)
@@ -2033,12 +2000,12 @@ am__libadiosreadf_v1_a_SOURCES_DIST = core/adios_bp_v1.c \
 	read/read_dimes.c read/read_datatap.c read/read_flexpath.c \
 	read/read_icee.c nssi/adios_nssi_config.c read/read_nssi.c \
 	core/adiosf_read_v1.c
-am__objects_209 = $(am__objects_1) \
+am__objects_197 = $(am__objects_1) \
 	libadiosreadf_v1_a-adios_transforms_common.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_transforms_hooks.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_copyspec.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_subvolume.$(OBJEXT)
-am__objects_210 =  \
+am__objects_198 =  \
 	libadiosreadf_v1_a-adios_transform_identity_read.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_transform_zlib_read.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_transform_bzip2_read.$(OBJEXT) \
@@ -2046,36 +2013,36 @@ am__objects_210 =  \
 	libadiosreadf_v1_a-adios_transform_isobar_read.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_transform_aplod_read.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_transform_alacrity_read.$(OBJEXT)
-am__objects_211 = $(am__objects_1) \
+am__objects_199 = $(am__objects_1) \
 	libadiosreadf_v1_a-adios_transforms_read.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_transforms_hooks_read.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_transforms_reqgroup.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_transforms_datablock.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_patchdata.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_selection_util.$(OBJEXT) \
-	libadiosreadf_v1_a-adios_read_ext.$(OBJEXT) $(am__objects_210)
-am__objects_212 = $(am__objects_1) \
+	$(am__objects_198)
+am__objects_200 = $(am__objects_1) \
 	libadiosreadf_v1_a-common_query.$(OBJEXT) \
 	libadiosreadf_v1_a-adios_query_hooks.$(OBJEXT) \
 	libadiosreadf_v1_a-query_utils.$(OBJEXT)
- at HAVE_FASTBIT_TRUE@am__objects_213 =  \
+ at HAVE_FASTBIT_TRUE@am__objects_201 =  \
 @HAVE_FASTBIT_TRUE@	libadiosreadf_v1_a-query_fastbit.$(OBJEXT) \
 @HAVE_FASTBIT_TRUE@	libadiosreadf_v1_a-fastbit_adios.$(OBJEXT)
- at HAVE_ALACRITY_TRUE@am__objects_214 =  \
+ at HAVE_ALACRITY_TRUE@am__objects_202 =  \
 @HAVE_ALACRITY_TRUE@	libadiosreadf_v1_a-query_alac.$(OBJEXT)
-am__objects_215 = $(am__objects_213) $(am__objects_214) \
+am__objects_203 = $(am__objects_201) $(am__objects_202) \
 	$(am__objects_10)
-am__objects_216 = $(am__objects_212) $(am__objects_215)
-am__objects_217 = $(am__objects_216) \
+am__objects_204 = $(am__objects_200) $(am__objects_203)
+am__objects_205 = $(am__objects_204) \
 	libadiosreadf_v1_a-adiosf_query.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DATASPACES_TRUE at am__objects_218 = libadiosreadf_v1_a-read_dataspaces.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DIMES_TRUE at am__objects_219 = libadiosreadf_v1_a-read_dimes.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__objects_220 = libadiosreadf_v1_a-read_datatap.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_221 = libadiosreadf_v1_a-read_flexpath.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__objects_222 = libadiosreadf_v1_a-read_icee.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__objects_223 = libadiosreadf_v1_a-adios_nssi_config.$(OBJEXT) \
+ at BUILD_FORTRAN_TRUE@@HAVE_DATASPACES_TRUE at am__objects_206 = libadiosreadf_v1_a-read_dataspaces.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_DIMES_TRUE at am__objects_207 = libadiosreadf_v1_a-read_dimes.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_DATATAP_TRUE at am__objects_208 = libadiosreadf_v1_a-read_datatap.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_FLEXPATH_TRUE at am__objects_209 = libadiosreadf_v1_a-read_flexpath.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_ICEE_TRUE at am__objects_210 = libadiosreadf_v1_a-read_icee.$(OBJEXT)
+ at BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at am__objects_211 = libadiosreadf_v1_a-adios_nssi_config.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE@	libadiosreadf_v1_a-read_nssi.$(OBJEXT)
- at BUILD_FORTRAN_TRUE@am__objects_224 =  \
+ at BUILD_FORTRAN_TRUE@am__objects_212 =  \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-adios_bp_v1.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-adios_endianness.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-bp_utils.$(OBJEXT) \
@@ -2084,8 +2051,8 @@ am__objects_217 = $(am__objects_216) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-common_read.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-adios_infocache.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-adios_read_ext.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_209) $(am__objects_211) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_217) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_197) $(am__objects_199) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_205) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-globals.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-adios_read_hooks.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-adios_logger.$(OBJEXT) \
@@ -2094,11 +2061,11 @@ am__objects_217 = $(am__objects_216) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-read_bp.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-read_bp_staged.$(OBJEXT) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-read_bp_staged1.$(OBJEXT) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_218) $(am__objects_219) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_220) $(am__objects_221) \
- at BUILD_FORTRAN_TRUE@	$(am__objects_222) $(am__objects_223)
+ at BUILD_FORTRAN_TRUE@	$(am__objects_206) $(am__objects_207) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_208) $(am__objects_209) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_210) $(am__objects_211)
 @BUILD_FORTRAN_TRUE at am_libadiosreadf_v1_a_OBJECTS =  \
- at BUILD_FORTRAN_TRUE@	$(am__objects_224) \
+ at BUILD_FORTRAN_TRUE@	$(am__objects_212) \
 @BUILD_FORTRAN_TRUE@	libadiosreadf_v1_a-adiosf_read_v1.$(OBJEXT)
 libadiosreadf_v1_a_OBJECTS = $(am_libadiosreadf_v1_a_OBJECTS)
 @HAVE_NSSI_TRUE at am__EXEEXT_1 = nssi-staging-server$(EXEEXT) \
@@ -2371,7 +2338,7 @@ PAMI_LDFLAGS = @PAMI_LDFLAGS@
 PAMI_LIBS = @PAMI_LIBS@
 PATHPROG = @PATHPROG@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PHDF5_CPPFLAGS = @PHDF5_CPPFLAGS@ $(am__append_19)
+PHDF5_CPPFLAGS = @PHDF5_CPPFLAGS@ $(am__append_17)
 PHDF5_LDFLAGS = @PHDF5_LDFLAGS@
 PHDF5_LIBS = @PHDF5_LIBS@
 PORTALS_CFLAGS = @PORTALS_CFLAGS@
@@ -2400,6 +2367,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -2457,7 +2427,7 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/src/core -I$(top_srcdir)/src/core/transforms -I$(top_srcdir)/src/core/query
+AM_CPPFLAGS = -I$(top_builddir)/src/public -I$(top_srcdir) -I$(top_srcdir)/src/core -I$(top_srcdir)/src/core/transforms -I$(top_srcdir)/src/core/query
 AUTOMAKE_OPTIONS = no-dependencies
 METASOURCES = AUTO
 @HAVE_NSSI_TRUE at nssi_staging_server_SOURCES = nssi/nssi_staging_server.cpp nssi/aggregation.cpp
@@ -2474,31 +2444,31 @@ METASOURCES = AUTO
 @HAVE_NSSI_TRUE at nssi_coupling_server_LDADD =  \
 @HAVE_NSSI_TRUE@	$(top_builddir)/src/libadios.a \
 @HAVE_NSSI_TRUE@	$(ADIOSLIB_LDADD) $(NSSI_SERVER_LIBS)
-CLEANFILES = $(am__append_35) $(am__append_41) $(am__append_61)
-include_HEADERS = public/adios.h public/adios_types.h \
-	public/adios_read.h public/adios_error.h public/adios_mpi.h \
-	public/mpidummy.h public/adios_read_v1.h \
+CLEANFILES = $(am__append_33) $(am__append_39) $(am__append_59)
+include_HEADERS = public/adios.h public/adios_version.h \
+	public/adios_types.h public/adios_read.h public/adios_error.h \
+	public/adios_mpi.h public/mpidummy.h public/adios_read_v1.h \
 	public/adios_read_v1_defs.h public/adios_read_v2.h \
 	public/adios_read_v2_fwd.h public/adios_selection.h \
-	public/adios_schema.h public/adios_read_ext.h \
-	public/adios_query.h
-nodist_include_HEADERS = $(am__append_40) $(am__append_60)
+	public/adios_schema.h public/adios_link.h \
+	public/adios_read_ext.h public/adios_query.h
+nodist_include_HEADERS = $(am__append_38) $(am__append_58)
 lib_LIBRARIES = $(am__append_5) $(am__append_7) libadiosread.a \
-	$(am__append_50) libadiosread_nompi.a $(am__append_70)
-libadiosread_a_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_48) \
+	$(am__append_48) libadiosread_nompi.a $(am__append_66)
+libadiosread_a_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_46) \
 	$(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSREADLIB_CPPFLAGS) \
-	$(am__append_81)
-libadiosreadf_a_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_57) \
-	$(am__append_59)
-libadiosread_nompi_a_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_68) \
+	$(am__append_75)
+libadiosreadf_a_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_55) \
+	$(am__append_57)
+libadiosread_nompi_a_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_64) \
 	$(MACRODEFFLAG)_NOMPI $(ADIOSLIB_EXTRA_CPPFLAGS) \
-	$(ADIOSREADLIB_CPPFLAGS) $(am__append_82)
-libadiosreadf_nompi_a_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_77) \
-	$(am__append_79)
-libadiosread_a_CFLAGS = $(am__append_49)
-libadiosreadf_a_CFLAGS = $(am__append_58)
-libadiosread_nompi_a_CFLAGS = $(am__append_69)
-libadiosreadf_nompi_a_CFLAGS = $(am__append_78)
+	$(ADIOSREADLIB_CPPFLAGS) $(am__append_76)
+libadiosreadf_nompi_a_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_71) \
+	$(am__append_73)
+libadiosread_a_CFLAGS = $(am__append_47)
+libadiosreadf_a_CFLAGS = $(am__append_56)
+libadiosread_nompi_a_CFLAGS = $(am__append_65)
+libadiosreadf_nompi_a_CFLAGS = $(am__append_72)
 
 # Identity plugin:
 
@@ -2565,7 +2535,6 @@ transforms_read_SOURCES = $(transforms_read_HDRS) \
                           core/adios_selection_util.c \
                           core/transforms/plugindetect/detect_plugin_read_hook_decls.h \
                           core/transforms/plugindetect/detect_plugin_read_hook_reg.h \
-                          core/adios_read_ext.c \
                           $(transforms_read_method_SOURCES)
 
 transforms_write_SOURCES = $(transforms_write_HDRS) \
@@ -2617,10 +2586,10 @@ query_F_SOURCES = $(query_SOURCES) query/adiosf_query.c
 @BUILD_WRITE_TRUE@	write/adios_mpi_amr.c write/adios_posix.c \
 @BUILD_WRITE_TRUE@	write/adios_posix1.c write/adios_var_merge.c \
 @BUILD_WRITE_TRUE@	$(am__append_6) $(am__append_9) \
- at BUILD_WRITE_TRUE@	$(am__append_12) $(am__append_15) \
- at BUILD_WRITE_TRUE@	$(am__append_18) $(am__append_23) \
- at BUILD_WRITE_TRUE@	$(am__append_25) $(am__append_28) \
- at BUILD_WRITE_TRUE@	$(am__append_31)
+ at BUILD_WRITE_TRUE@	$(am__append_11) $(am__append_13) \
+ at BUILD_WRITE_TRUE@	$(am__append_16) $(am__append_21) \
+ at BUILD_WRITE_TRUE@	$(am__append_23) $(am__append_26) \
+ at BUILD_WRITE_TRUE@	$(am__append_29)
 @BUILD_WRITE_TRUE at libadios_nompi_a_SOURCES = core/adios.c \
 @BUILD_WRITE_TRUE@	core/common_adios.c core/adios_internals.c \
 @BUILD_WRITE_TRUE@	core/adios_internals_mxml.c \
@@ -2640,9 +2609,8 @@ query_F_SOURCES = $(query_SOURCES) query/adiosf_query.c
 @BUILD_WRITE_TRUE@	core/util.c core/qhashtbl.c read/read_bp.c \
 @BUILD_WRITE_TRUE@	read/read_bp_staged.c read/read_bp_staged1.c \
 @BUILD_WRITE_TRUE@	write/adios_posix.c write/adios_posix1.c \
- at BUILD_WRITE_TRUE@	$(am__append_10) $(am__append_13) \
- at BUILD_WRITE_TRUE@	$(am__append_16) $(am__append_26) \
- at BUILD_WRITE_TRUE@	$(am__append_29)
+ at BUILD_WRITE_TRUE@	$(am__append_14) $(am__append_24) \
+ at BUILD_WRITE_TRUE@	$(am__append_27)
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at FortranLibSources =  \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	core/adiosf.c \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	core/common_adios.c \
@@ -2674,40 +2642,40 @@ query_F_SOURCES = $(query_SOURCES) query/adiosf_query.c
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	read/read_bp_staged1.c \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	write/adios_posix.c \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	write/adios_posix1.c \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_11) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_14) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_17) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_27) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_30) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_33)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_15) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_25) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_28) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_31)
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at FortranLibMPISources =  \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	write/adios_mpi.c \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	write/adios_mpi_lustre.c \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	write/adios_mpi_amr.c \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	write/adios_var_merge.c \
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_8) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_21) \
- at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_24)
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_10) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_12) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_19) \
+ at BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE@	$(am__append_22)
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at FortranLibSEQSources = core/mpidummy.c
 @BUILD_WRITE_TRUE at libadios_a_CPPFLAGS = $(AM_CPPFLAGS) \
 @BUILD_WRITE_TRUE@	$(ADIOSLIB_EXTRA_CPPFLAGS) \
- at BUILD_WRITE_TRUE@	$(ADIOSLIB_CPPFLAGS) $(am__append_20) \
- at BUILD_WRITE_TRUE@	$(am__append_32) $(am__append_36)
+ at BUILD_WRITE_TRUE@	$(ADIOSLIB_CPPFLAGS) $(am__append_18) \
+ at BUILD_WRITE_TRUE@	$(am__append_30) $(am__append_34)
 @BUILD_WRITE_TRUE at libadios_a_CFLAGS = $(ADIOSLIB_CFLAGS) 
 @BUILD_WRITE_TRUE at libadios_nompi_a_CPPFLAGS = $(AM_CPPFLAGS) \
 @BUILD_WRITE_TRUE@	$(MACRODEFFLAG)_NOMPI \
 @BUILD_WRITE_TRUE@	$(ADIOSLIB_EXTRA_CPPFLAGS) \
- at BUILD_WRITE_TRUE@	$(ADIOSLIB_SEQ_CPPFLAGS) $(am__append_37)
+ at BUILD_WRITE_TRUE@	$(ADIOSLIB_SEQ_CPPFLAGS) $(am__append_35)
 @BUILD_WRITE_TRUE at libadios_nompi_a_CFLAGS = $(MACRODEFFLAG)_NOMPI $(ADIOSLIB_SEQ_CFLAGS) 
 @BUILD_WRITE_TRUE at libadiosf_a_CPPFLAGS = $(AM_CPPFLAGS) \
 @BUILD_WRITE_TRUE@	$(ADIOSLIB_EXTRA_CPPFLAGS) \
- at BUILD_WRITE_TRUE@	$(ADIOSLIB_CPPFLAGS) $(am__append_22) \
- at BUILD_WRITE_TRUE@	$(am__append_34) $(am__append_38)
+ at BUILD_WRITE_TRUE@	$(ADIOSLIB_CPPFLAGS) $(am__append_20) \
+ at BUILD_WRITE_TRUE@	$(am__append_32) $(am__append_36)
 @BUILD_WRITE_TRUE at libadiosf_a_CFLAGS = $(ADIOSLIB_CFLAGS) 
 @BUILD_WRITE_TRUE at libadiosf_nompi_a_CPPFLAGS = $(AM_CPPFLAGS) \
 @BUILD_WRITE_TRUE@	$(MACRODEFFLAG)_NOMPI \
 @BUILD_WRITE_TRUE@	$(ADIOSLIB_EXTRA_CPPFLAGS) \
- at BUILD_WRITE_TRUE@	$(ADIOSLIB_SEQ_CPPFLAGS) $(am__append_39)
+ at BUILD_WRITE_TRUE@	$(ADIOSLIB_SEQ_CPPFLAGS) $(am__append_37)
 @BUILD_WRITE_TRUE at libadiosf_nompi_a_CFLAGS = $(MACRODEFFLAG)_NOMPI $(ADIOSLIB_SEQ_CFLAGS) 
 @BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at dist_libadios_a_SOURCES = nssi/adios_nssi_args.x
 @BUILD_WRITE_TRUE@@HAVE_NSSI_TRUE at nodist_libadios_a_SOURCES = adios_nssi_args.c adios_nssi_args.h
@@ -2755,9 +2723,9 @@ libadiosread_a_SOURCES = core/adios_bp_v1.c core/adios_endianness.c \
 	$(transforms_common_SOURCES) $(transforms_read_SOURCES) \
 	$(query_C_SOURCES) core/globals.c core/adios_read_hooks.c \
 	core/adios_logger.c core/util.c core/qhashtbl.c read/read_bp.c \
-	read/read_bp_staged.c read/read_bp_staged1.c $(am__append_42) \
-	$(am__append_43) $(am__append_44) $(am__append_45) \
-	$(am__append_46) $(am__append_47)
+	read/read_bp_staged.c read/read_bp_staged1.c $(am__append_40) \
+	$(am__append_41) $(am__append_42) $(am__append_43) \
+	$(am__append_44) $(am__append_45)
 @HAVE_NSSI_TRUE at dist_libadiosread_a_SOURCES = nssi/adios_nssi_args.x
 @HAVE_NSSI_TRUE at nodist_libadiosread_a_SOURCES = adios_nssi_args.c adios_nssi_args.h
 @BUILD_FORTRAN_TRUE at FortranReadLibSource = core/adios_bp_v1.c \
@@ -2772,10 +2740,10 @@ libadiosread_a_SOURCES = core/adios_bp_v1.c core/adios_endianness.c \
 @BUILD_FORTRAN_TRUE@	core/adios_logger.c core/util.c \
 @BUILD_FORTRAN_TRUE@	core/qhashtbl.c read/read_bp.c \
 @BUILD_FORTRAN_TRUE@	read/read_bp_staged.c \
- at BUILD_FORTRAN_TRUE@	read/read_bp_staged1.c $(am__append_51) \
+ at BUILD_FORTRAN_TRUE@	read/read_bp_staged1.c $(am__append_49) \
+ at BUILD_FORTRAN_TRUE@	$(am__append_50) $(am__append_51) \
 @BUILD_FORTRAN_TRUE@	$(am__append_52) $(am__append_53) \
- at BUILD_FORTRAN_TRUE@	$(am__append_54) $(am__append_55) \
- at BUILD_FORTRAN_TRUE@	$(am__append_56)
+ at BUILD_FORTRAN_TRUE@	$(am__append_54)
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at dist_libadiosreadf_a_SOURCES = nssi/adios_nssi_args.x
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at nodist_libadiosreadf_a_SOURCES = adios_nssi_args.c adios_nssi_args.h
 @BUILD_FORTRAN_TRUE at libadiosreadf_a_SOURCES = $(FortranReadLibSource) \
@@ -2794,9 +2762,8 @@ libadiosread_nompi_a_SOURCES = core/mpidummy.c core/adios_bp_v1.c \
 	$(transforms_read_SOURCES) $(query_C_SOURCES) \
 	core/adios_logger.c core/buffer.c core/globals.c \
 	core/adios_read_hooks.c core/util.c core/qhashtbl.c \
-	read/read_bp.c $(am__append_62) $(am__append_63) \
-	$(am__append_64) $(am__append_65) $(am__append_66) \
-	$(am__append_67)
+	read/read_bp.c $(am__append_60) $(am__append_61) \
+	$(am__append_62) $(am__append_63)
 @HAVE_NSSI_TRUE at dist_libadiosread_nompi_a_SOURCES = nssi/adios_nssi_args.x
 @HAVE_NSSI_TRUE at nodist_libadiosread_nompi_a_SOURCES = adios_nssi_args.c adios_nssi_args.h
 @BUILD_FORTRAN_TRUE at FortranReadSeqLibSource = core/mpidummy.c \
@@ -2810,9 +2777,8 @@ libadiosread_nompi_a_SOURCES = core/mpidummy.c core/adios_bp_v1.c \
 @BUILD_FORTRAN_TRUE@	$(query_F_SOURCES) core/globals.c \
 @BUILD_FORTRAN_TRUE@	core/adios_read_hooks.c core/util.c \
 @BUILD_FORTRAN_TRUE@	core/qhashtbl.c read/read_bp.c \
- at BUILD_FORTRAN_TRUE@	$(am__append_71) $(am__append_72) \
- at BUILD_FORTRAN_TRUE@	$(am__append_73) $(am__append_74) \
- at BUILD_FORTRAN_TRUE@	$(am__append_75) $(am__append_76)
+ at BUILD_FORTRAN_TRUE@	$(am__append_67) $(am__append_68) \
+ at BUILD_FORTRAN_TRUE@	$(am__append_69) $(am__append_70)
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at dist_libadiosreadf_nompi_a_SOURCES = nssi/adios_nssi_args.x
 @BUILD_FORTRAN_TRUE@@HAVE_NSSI_TRUE at nodist_libadiosreadf_nompi_a_SOURCES = adios_nssi_args.c adios_nssi_args.h
 @BUILD_FORTRAN_TRUE at libadiosreadf_nompi_a_SOURCES = $(FortranReadSeqLibSource) core/adiosf_read.c
@@ -2826,7 +2792,7 @@ libadios_internal_nompi_a_SOURCES = core/mpidummy.c core/adios_bp_v1.c \
 	$(query_C_SOURCES) core/buffer.c core/adios_error.c \
 	core/adios_logger.c core/adios_timing.c core/util.c \
 	core/qhashtbl.c core/futils.c core/adios_transport_hooks.c \
-	$(am__append_80)
+	$(am__append_74)
 libadios_internal_nompi_a_CPPFLAGS = $(AM_CPPFLAGS) $(MACRODEFFLAG)_INTERNAL $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSLIB_INT_CPPFLAGS) $(ADIOSLIB_CPPFLAGS)
 
 #bin_PROGRAMS+=adios_flags
@@ -2855,6 +2821,7 @@ EXTRA_DIST = core/adios_bp_v1.h core/adios_endianness.h \
              core/bp_types.h core/bp_utils.h core/buffer.h core/common_adios.h \
              core/common_read.h core/adios_infocache.h core/futils.h core/globals.h core/ds_metadata.h \
              core/util.h core/flexpath.h core/qhashtbl.h \
+	     public/adios_version.h.in \
              $(transforms_common_HDRS) $(transforms_read_HDRS) $(transforms_write_HDRS) \
              $(query_common_HDRS) $(query_method_HDRS) \
              transforms/transform_plugins.h \
@@ -3862,12 +3829,6 @@ libadios_nompi_a-adios_selection_util.o: core/adios_selection_util.c
 libadios_nompi_a-adios_selection_util.obj: core/adios_selection_util.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_selection_util.obj `if test -f 'core/adios_selection_util.c'; then $(CYGPATH_W) 'core/adios_selection_util.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_selection_util.c'; fi`
 
-libadios_nompi_a-adios_read_ext.o: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
-
-libadios_nompi_a-adios_read_ext.obj: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
-
 libadios_nompi_a-adios_transform_identity_read.o: transforms/adios_transform_identity_read.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_transform_identity_read.o `test -f 'transforms/adios_transform_identity_read.c' || echo '$(srcdir)/'`transforms/adios_transform_identity_read.c
 
@@ -4078,6 +4039,12 @@ libadios_nompi_a-adios_infocache.o: core/adios_infocache.c
 libadios_nompi_a-adios_infocache.obj: core/adios_infocache.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_infocache.obj `if test -f 'core/adios_infocache.c'; then $(CYGPATH_W) 'core/adios_infocache.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_infocache.c'; fi`
 
+libadios_nompi_a-adios_read_ext.o: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
+
+libadios_nompi_a-adios_read_ext.obj: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
+
 libadios_nompi_a-globals.o: core/globals.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-globals.o `test -f 'core/globals.c' || echo '$(srcdir)/'`core/globals.c
 
@@ -4162,30 +4129,6 @@ libadios_nompi_a-adios_posix1.o: write/adios_posix1.c
 libadios_nompi_a-adios_posix1.obj: write/adios_posix1.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_posix1.obj `if test -f 'write/adios_posix1.c'; then $(CYGPATH_W) 'write/adios_posix1.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_posix1.c'; fi`
 
-libadios_nompi_a-adios_dataspaces.o: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_dataspaces.o `test -f 'write/adios_dataspaces.c' || echo '$(srcdir)/'`write/adios_dataspaces.c
-
-libadios_nompi_a-adios_dataspaces.obj: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_dataspaces.obj `if test -f 'write/adios_dataspaces.c'; then $(CYGPATH_W) 'write/adios_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dataspaces.c'; fi`
-
-libadios_nompi_a-read_dataspaces.o: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
-
-libadios_nompi_a-read_dataspaces.obj: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
-
-libadios_nompi_a-adios_dimes.o: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_dimes.o `test -f 'write/adios_dimes.c' || echo '$(srcdir)/'`write/adios_dimes.c
-
-libadios_nompi_a-adios_dimes.obj: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_dimes.obj `if test -f 'write/adios_dimes.c'; then $(CYGPATH_W) 'write/adios_dimes.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dimes.c'; fi`
-
-libadios_nompi_a-read_dimes.o: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
-
-libadios_nompi_a-read_dimes.obj: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
-
 libadios_nompi_a-adios_datatap.o: write/adios_datatap.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadios_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadios_nompi_a_CFLAGS) $(CFLAGS) -c -o libadios_nompi_a-adios_datatap.o `test -f 'write/adios_datatap.c' || echo '$(srcdir)/'`write/adios_datatap.c
 
@@ -4306,12 +4249,6 @@ libadiosf_a-adios_selection_util.o: core/adios_selection_util.c
 libadiosf_a-adios_selection_util.obj: core/adios_selection_util.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_selection_util.obj `if test -f 'core/adios_selection_util.c'; then $(CYGPATH_W) 'core/adios_selection_util.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_selection_util.c'; fi`
 
-libadiosf_a-adios_read_ext.o: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
-
-libadiosf_a-adios_read_ext.obj: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
-
 libadiosf_a-adios_transform_identity_read.o: transforms/adios_transform_identity_read.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_transform_identity_read.o `test -f 'transforms/adios_transform_identity_read.c' || echo '$(srcdir)/'`transforms/adios_transform_identity_read.c
 
@@ -4510,6 +4447,12 @@ libadiosf_a-adios_infocache.o: core/adios_infocache.c
 libadiosf_a-adios_infocache.obj: core/adios_infocache.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_infocache.obj `if test -f 'core/adios_infocache.c'; then $(CYGPATH_W) 'core/adios_infocache.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_infocache.c'; fi`
 
+libadiosf_a-adios_read_ext.o: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
+
+libadiosf_a-adios_read_ext.obj: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
+
 libadiosf_a-globals.o: core/globals.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-globals.o `test -f 'core/globals.c' || echo '$(srcdir)/'`core/globals.c
 
@@ -4588,30 +4531,6 @@ libadiosf_a-adios_posix1.o: write/adios_posix1.c
 libadiosf_a-adios_posix1.obj: write/adios_posix1.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_posix1.obj `if test -f 'write/adios_posix1.c'; then $(CYGPATH_W) 'write/adios_posix1.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_posix1.c'; fi`
 
-libadiosf_a-adios_dataspaces.o: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_dataspaces.o `test -f 'write/adios_dataspaces.c' || echo '$(srcdir)/'`write/adios_dataspaces.c
-
-libadiosf_a-adios_dataspaces.obj: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_dataspaces.obj `if test -f 'write/adios_dataspaces.c'; then $(CYGPATH_W) 'write/adios_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dataspaces.c'; fi`
-
-libadiosf_a-read_dataspaces.o: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
-
-libadiosf_a-read_dataspaces.obj: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
-
-libadiosf_a-adios_dimes.o: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_dimes.o `test -f 'write/adios_dimes.c' || echo '$(srcdir)/'`write/adios_dimes.c
-
-libadiosf_a-adios_dimes.obj: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_dimes.obj `if test -f 'write/adios_dimes.c'; then $(CYGPATH_W) 'write/adios_dimes.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dimes.c'; fi`
-
-libadiosf_a-read_dimes.o: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
-
-libadiosf_a-read_dimes.obj: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
-
 libadiosf_a-adios_datatap.o: write/adios_datatap.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_datatap.o `test -f 'write/adios_datatap.c' || echo '$(srcdir)/'`write/adios_datatap.c
 
@@ -4702,6 +4621,30 @@ libadiosf_a-adios_mpi_bgq.o: write/adios_mpi_bgq.c
 libadiosf_a-adios_mpi_bgq.obj: write/adios_mpi_bgq.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_mpi_bgq.obj `if test -f 'write/adios_mpi_bgq.c'; then $(CYGPATH_W) 'write/adios_mpi_bgq.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_mpi_bgq.c'; fi`
 
+libadiosf_a-adios_dataspaces.o: write/adios_dataspaces.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_dataspaces.o `test -f 'write/adios_dataspaces.c' || echo '$(srcdir)/'`write/adios_dataspaces.c
+
+libadiosf_a-adios_dataspaces.obj: write/adios_dataspaces.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_dataspaces.obj `if test -f 'write/adios_dataspaces.c'; then $(CYGPATH_W) 'write/adios_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dataspaces.c'; fi`
+
+libadiosf_a-read_dataspaces.o: read/read_dataspaces.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
+
+libadiosf_a-read_dataspaces.obj: read/read_dataspaces.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
+
+libadiosf_a-adios_dimes.o: write/adios_dimes.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_dimes.o `test -f 'write/adios_dimes.c' || echo '$(srcdir)/'`write/adios_dimes.c
+
+libadiosf_a-adios_dimes.obj: write/adios_dimes.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_dimes.obj `if test -f 'write/adios_dimes.c'; then $(CYGPATH_W) 'write/adios_dimes.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dimes.c'; fi`
+
+libadiosf_a-read_dimes.o: read/read_dimes.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
+
+libadiosf_a-read_dimes.obj: read/read_dimes.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
+
 libadiosf_a-adios_phdf5.o: write/adios_phdf5.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_a_CFLAGS) $(CFLAGS) -c -o libadiosf_a-adios_phdf5.o `test -f 'write/adios_phdf5.c' || echo '$(srcdir)/'`write/adios_phdf5.c
 
@@ -4810,12 +4753,6 @@ libadiosf_nompi_a-adios_selection_util.o: core/adios_selection_util.c
 libadiosf_nompi_a-adios_selection_util.obj: core/adios_selection_util.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_selection_util.obj `if test -f 'core/adios_selection_util.c'; then $(CYGPATH_W) 'core/adios_selection_util.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_selection_util.c'; fi`
 
-libadiosf_nompi_a-adios_read_ext.o: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
-
-libadiosf_nompi_a-adios_read_ext.obj: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
-
 libadiosf_nompi_a-adios_transform_identity_read.o: transforms/adios_transform_identity_read.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_transform_identity_read.o `test -f 'transforms/adios_transform_identity_read.c' || echo '$(srcdir)/'`transforms/adios_transform_identity_read.c
 
@@ -5014,6 +4951,12 @@ libadiosf_nompi_a-adios_infocache.o: core/adios_infocache.c
 libadiosf_nompi_a-adios_infocache.obj: core/adios_infocache.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_infocache.obj `if test -f 'core/adios_infocache.c'; then $(CYGPATH_W) 'core/adios_infocache.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_infocache.c'; fi`
 
+libadiosf_nompi_a-adios_read_ext.o: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
+
+libadiosf_nompi_a-adios_read_ext.obj: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
+
 libadiosf_nompi_a-globals.o: core/globals.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-globals.o `test -f 'core/globals.c' || echo '$(srcdir)/'`core/globals.c
 
@@ -5092,30 +5035,6 @@ libadiosf_nompi_a-adios_posix1.o: write/adios_posix1.c
 libadiosf_nompi_a-adios_posix1.obj: write/adios_posix1.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_posix1.obj `if test -f 'write/adios_posix1.c'; then $(CYGPATH_W) 'write/adios_posix1.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_posix1.c'; fi`
 
-libadiosf_nompi_a-adios_dataspaces.o: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_dataspaces.o `test -f 'write/adios_dataspaces.c' || echo '$(srcdir)/'`write/adios_dataspaces.c
-
-libadiosf_nompi_a-adios_dataspaces.obj: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_dataspaces.obj `if test -f 'write/adios_dataspaces.c'; then $(CYGPATH_W) 'write/adios_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dataspaces.c'; fi`
-
-libadiosf_nompi_a-read_dataspaces.o: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
-
-libadiosf_nompi_a-read_dataspaces.obj: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
-
-libadiosf_nompi_a-adios_dimes.o: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_dimes.o `test -f 'write/adios_dimes.c' || echo '$(srcdir)/'`write/adios_dimes.c
-
-libadiosf_nompi_a-adios_dimes.obj: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_dimes.obj `if test -f 'write/adios_dimes.c'; then $(CYGPATH_W) 'write/adios_dimes.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dimes.c'; fi`
-
-libadiosf_nompi_a-read_dimes.o: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
-
-libadiosf_nompi_a-read_dimes.obj: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
-
 libadiosf_nompi_a-adios_datatap.o: write/adios_datatap.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_a-adios_datatap.o `test -f 'write/adios_datatap.c' || echo '$(srcdir)/'`write/adios_datatap.c
 
@@ -5272,12 +5191,6 @@ libadiosf_nompi_v1_a-adios_selection_util.o: core/adios_selection_util.c
 libadiosf_nompi_v1_a-adios_selection_util.obj: core/adios_selection_util.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_selection_util.obj `if test -f 'core/adios_selection_util.c'; then $(CYGPATH_W) 'core/adios_selection_util.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_selection_util.c'; fi`
 
-libadiosf_nompi_v1_a-adios_read_ext.o: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
-
-libadiosf_nompi_v1_a-adios_read_ext.obj: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
-
 libadiosf_nompi_v1_a-adios_transform_identity_read.o: transforms/adios_transform_identity_read.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_transform_identity_read.o `test -f 'transforms/adios_transform_identity_read.c' || echo '$(srcdir)/'`transforms/adios_transform_identity_read.c
 
@@ -5476,6 +5389,12 @@ libadiosf_nompi_v1_a-adios_infocache.o: core/adios_infocache.c
 libadiosf_nompi_v1_a-adios_infocache.obj: core/adios_infocache.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_infocache.obj `if test -f 'core/adios_infocache.c'; then $(CYGPATH_W) 'core/adios_infocache.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_infocache.c'; fi`
 
+libadiosf_nompi_v1_a-adios_read_ext.o: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
+
+libadiosf_nompi_v1_a-adios_read_ext.obj: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
+
 libadiosf_nompi_v1_a-globals.o: core/globals.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-globals.o `test -f 'core/globals.c' || echo '$(srcdir)/'`core/globals.c
 
@@ -5554,30 +5473,6 @@ libadiosf_nompi_v1_a-adios_posix1.o: write/adios_posix1.c
 libadiosf_nompi_v1_a-adios_posix1.obj: write/adios_posix1.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_posix1.obj `if test -f 'write/adios_posix1.c'; then $(CYGPATH_W) 'write/adios_posix1.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_posix1.c'; fi`
 
-libadiosf_nompi_v1_a-adios_dataspaces.o: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_dataspaces.o `test -f 'write/adios_dataspaces.c' || echo '$(srcdir)/'`write/adios_dataspaces.c
-
-libadiosf_nompi_v1_a-adios_dataspaces.obj: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_dataspaces.obj `if test -f 'write/adios_dataspaces.c'; then $(CYGPATH_W) 'write/adios_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dataspaces.c'; fi`
-
-libadiosf_nompi_v1_a-read_dataspaces.o: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
-
-libadiosf_nompi_v1_a-read_dataspaces.obj: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
-
-libadiosf_nompi_v1_a-adios_dimes.o: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_dimes.o `test -f 'write/adios_dimes.c' || echo '$(srcdir)/'`write/adios_dimes.c
-
-libadiosf_nompi_v1_a-adios_dimes.obj: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_dimes.obj `if test -f 'write/adios_dimes.c'; then $(CYGPATH_W) 'write/adios_dimes.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dimes.c'; fi`
-
-libadiosf_nompi_v1_a-read_dimes.o: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
-
-libadiosf_nompi_v1_a-read_dimes.obj: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
-
 libadiosf_nompi_v1_a-adios_datatap.o: write/adios_datatap.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_nompi_v1_a-adios_datatap.o `test -f 'write/adios_datatap.c' || echo '$(srcdir)/'`write/adios_datatap.c
 
@@ -5734,12 +5629,6 @@ libadiosf_v1_a-adios_selection_util.o: core/adios_selection_util.c
 libadiosf_v1_a-adios_selection_util.obj: core/adios_selection_util.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_selection_util.obj `if test -f 'core/adios_selection_util.c'; then $(CYGPATH_W) 'core/adios_selection_util.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_selection_util.c'; fi`
 
-libadiosf_v1_a-adios_read_ext.o: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
-
-libadiosf_v1_a-adios_read_ext.obj: core/adios_read_ext.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
-
 libadiosf_v1_a-adios_transform_identity_read.o: transforms/adios_transform_identity_read.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_transform_identity_read.o `test -f 'transforms/adios_transform_identity_read.c' || echo '$(srcdir)/'`transforms/adios_transform_identity_read.c
 
@@ -5938,6 +5827,12 @@ libadiosf_v1_a-adios_infocache.o: core/adios_infocache.c
 libadiosf_v1_a-adios_infocache.obj: core/adios_infocache.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_infocache.obj `if test -f 'core/adios_infocache.c'; then $(CYGPATH_W) 'core/adios_infocache.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_infocache.c'; fi`
 
+libadiosf_v1_a-adios_read_ext.o: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_read_ext.o `test -f 'core/adios_read_ext.c' || echo '$(srcdir)/'`core/adios_read_ext.c
+
+libadiosf_v1_a-adios_read_ext.obj: core/adios_read_ext.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_read_ext.obj `if test -f 'core/adios_read_ext.c'; then $(CYGPATH_W) 'core/adios_read_ext.c'; else $(CYGPATH_W) '$(srcdir)/core/adios_read_ext.c'; fi`
+
 libadiosf_v1_a-globals.o: core/globals.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-globals.o `test -f 'core/globals.c' || echo '$(srcdir)/'`core/globals.c
 
@@ -6016,30 +5911,6 @@ libadiosf_v1_a-adios_posix1.o: write/adios_posix1.c
 libadiosf_v1_a-adios_posix1.obj: write/adios_posix1.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_posix1.obj `if test -f 'write/adios_posix1.c'; then $(CYGPATH_W) 'write/adios_posix1.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_posix1.c'; fi`
 
-libadiosf_v1_a-adios_dataspaces.o: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_dataspaces.o `test -f 'write/adios_dataspaces.c' || echo '$(srcdir)/'`write/adios_dataspaces.c
-
-libadiosf_v1_a-adios_dataspaces.obj: write/adios_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_dataspaces.obj `if test -f 'write/adios_dataspaces.c'; then $(CYGPATH_W) 'write/adios_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dataspaces.c'; fi`
-
-libadiosf_v1_a-read_dataspaces.o: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
-
-libadiosf_v1_a-read_dataspaces.obj: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
-
-libadiosf_v1_a-adios_dimes.o: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_dimes.o `test -f 'write/adios_dimes.c' || echo '$(srcdir)/'`write/adios_dimes.c
-
-libadiosf_v1_a-adios_dimes.obj: write/adios_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_dimes.obj `if test -f 'write/adios_dimes.c'; then $(CYGPATH_W) 'write/adios_dimes.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dimes.c'; fi`
-
-libadiosf_v1_a-read_dimes.o: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
-
-libadiosf_v1_a-read_dimes.obj: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
-
 libadiosf_v1_a-adios_datatap.o: write/adios_datatap.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_datatap.o `test -f 'write/adios_datatap.c' || echo '$(srcdir)/'`write/adios_datatap.c
 
@@ -6130,6 +6001,30 @@ libadiosf_v1_a-adios_mpi_bgq.o: write/adios_mpi_bgq.c
 libadiosf_v1_a-adios_mpi_bgq.obj: write/adios_mpi_bgq.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_mpi_bgq.obj `if test -f 'write/adios_mpi_bgq.c'; then $(CYGPATH_W) 'write/adios_mpi_bgq.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_mpi_bgq.c'; fi`
 
+libadiosf_v1_a-adios_dataspaces.o: write/adios_dataspaces.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_dataspaces.o `test -f 'write/adios_dataspaces.c' || echo '$(srcdir)/'`write/adios_dataspaces.c
+
+libadiosf_v1_a-adios_dataspaces.obj: write/adios_dataspaces.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_dataspaces.obj `if test -f 'write/adios_dataspaces.c'; then $(CYGPATH_W) 'write/adios_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dataspaces.c'; fi`
+
+libadiosf_v1_a-read_dataspaces.o: read/read_dataspaces.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
+
+libadiosf_v1_a-read_dataspaces.obj: read/read_dataspaces.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
+
+libadiosf_v1_a-adios_dimes.o: write/adios_dimes.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_dimes.o `test -f 'write/adios_dimes.c' || echo '$(srcdir)/'`write/adios_dimes.c
+
+libadiosf_v1_a-adios_dimes.obj: write/adios_dimes.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_dimes.obj `if test -f 'write/adios_dimes.c'; then $(CYGPATH_W) 'write/adios_dimes.c'; else $(CYGPATH_W) '$(srcdir)/write/adios_dimes.c'; fi`
+
+libadiosf_v1_a-read_dimes.o: read/read_dimes.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
+
+libadiosf_v1_a-read_dimes.obj: read/read_dimes.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
+
 libadiosf_v1_a-adios_phdf5.o: write/adios_phdf5.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosf_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosf_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosf_v1_a-adios_phdf5.o `test -f 'write/adios_phdf5.c' || echo '$(srcdir)/'`write/adios_phdf5.c
 
@@ -6700,18 +6595,6 @@ libadiosread_nompi_a-read_bp.o: read/read_bp.c
 libadiosread_nompi_a-read_bp.obj: read/read_bp.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosread_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosread_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosread_nompi_a-read_bp.obj `if test -f 'read/read_bp.c'; then $(CYGPATH_W) 'read/read_bp.c'; else $(CYGPATH_W) '$(srcdir)/read/read_bp.c'; fi`
 
-libadiosread_nompi_a-read_dataspaces.o: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosread_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosread_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosread_nompi_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
-
-libadiosread_nompi_a-read_dataspaces.obj: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosread_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosread_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosread_nompi_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
-
-libadiosread_nompi_a-read_dimes.o: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosread_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosread_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosread_nompi_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
-
-libadiosread_nompi_a-read_dimes.obj: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosread_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosread_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosread_nompi_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
-
 libadiosread_nompi_a-read_datatap.o: read/read_datatap.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosread_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosread_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosread_nompi_a-read_datatap.o `test -f 'read/read_datatap.c' || echo '$(srcdir)/'`read/read_datatap.c
 
@@ -7276,18 +7159,6 @@ libadiosreadf_nompi_a-read_bp.o: read/read_bp.c
 libadiosreadf_nompi_a-read_bp.obj: read/read_bp.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_a-read_bp.obj `if test -f 'read/read_bp.c'; then $(CYGPATH_W) 'read/read_bp.c'; else $(CYGPATH_W) '$(srcdir)/read/read_bp.c'; fi`
 
-libadiosreadf_nompi_a-read_dataspaces.o: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
-
-libadiosreadf_nompi_a-read_dataspaces.obj: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
-
-libadiosreadf_nompi_a-read_dimes.o: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
-
-libadiosreadf_nompi_a-read_dimes.obj: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
-
 libadiosreadf_nompi_a-read_datatap.o: read/read_datatap.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_a-read_datatap.o `test -f 'read/read_datatap.c' || echo '$(srcdir)/'`read/read_datatap.c
 
@@ -7564,18 +7435,6 @@ libadiosreadf_nompi_v1_a-read_bp.o: read/read_bp.c
 libadiosreadf_nompi_v1_a-read_bp.obj: read/read_bp.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_v1_a-read_bp.obj `if test -f 'read/read_bp.c'; then $(CYGPATH_W) 'read/read_bp.c'; else $(CYGPATH_W) '$(srcdir)/read/read_bp.c'; fi`
 
-libadiosreadf_nompi_v1_a-read_dataspaces.o: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_v1_a-read_dataspaces.o `test -f 'read/read_dataspaces.c' || echo '$(srcdir)/'`read/read_dataspaces.c
-
-libadiosreadf_nompi_v1_a-read_dataspaces.obj: read/read_dataspaces.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_v1_a-read_dataspaces.obj `if test -f 'read/read_dataspaces.c'; then $(CYGPATH_W) 'read/read_dataspaces.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dataspaces.c'; fi`
-
-libadiosreadf_nompi_v1_a-read_dimes.o: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_v1_a-read_dimes.o `test -f 'read/read_dimes.c' || echo '$(srcdir)/'`read/read_dimes.c
-
-libadiosreadf_nompi_v1_a-read_dimes.obj: read/read_dimes.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_v1_a-read_dimes.obj `if test -f 'read/read_dimes.c'; then $(CYGPATH_W) 'read/read_dimes.c'; else $(CYGPATH_W) '$(srcdir)/read/read_dimes.c'; fi`
-
 libadiosreadf_nompi_v1_a-read_datatap.o: read/read_datatap.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libadiosreadf_nompi_v1_a_CPPFLAGS) $(CPPFLAGS) $(libadiosreadf_nompi_v1_a_CFLAGS) $(CFLAGS) -c -o libadiosreadf_nompi_v1_a-read_datatap.o `test -f 'read/read_datatap.c' || echo '$(srcdir)/'`read/read_datatap.c
 
diff --git a/src/core/adios.c b/src/core/adios.c
index dbd00be..bef175f 100644
--- a/src/core/adios.c
+++ b/src/core/adios.c
@@ -87,7 +87,7 @@ int adios_group_size (int64_t fd_p, uint64_t data_size
  * passing variable names, user is expected to pass variable id, which is returned
  * from adios_define_var call. Therefore, this function is only used in the no-xml way.
  */
-int adios_write_byid (int64_t fd_p, int64_t id, void * var)
+int adios_write_byid (int64_t fd_p, int64_t id, const void * var)
 {
     return common_adios_write_byid ((struct adios_file_struct *) fd_p, (struct adios_var_struct *) id, var);
 }
@@ -96,7 +96,7 @@ int adios_write_byid (int64_t fd_p, int64_t id, void * var)
 /* This C api function is a bit different from the Fortran api funcion, but
  * they call the same common_adios_write()
  */
-int adios_write (int64_t fd_p, const char * name, void * var)
+int adios_write (int64_t fd_p, const char * name, const void * var)
 {
     int retval;
     struct adios_file_struct * fd = (struct adios_file_struct *) fd_p;
@@ -273,6 +273,11 @@ int adios_close (int64_t fd_p)
 {
     int retval;
     struct adios_file_struct * fd = (struct adios_file_struct *) fd_p;
+    if (!fd)
+    {
+        adios_error (err_invalid_file_pointer, "Invalid handle passed to adios_close\n");
+        return adios_errno;
+    }
     struct adios_var_struct * v = fd->group->vars;
 
     retval = common_adios_close (fd_p);
@@ -433,6 +438,16 @@ int adios_delete_attrdefs (int64_t id)
     return adios_errno;
 }
 
+int adios_define_attribute_byvalue (int64_t group, 
+                            const char * name, const char * path, 
+                            enum ADIOS_DATATYPES type, int  nelems, void * values
+                           )
+{
+    adios_errno = err_no_error;
+    adios_common_define_attribute_byvalue (group, name, path, type, nelems, values);
+    return adios_errno;
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 // adios_common_select_method is in adios_internals_mxml.c
diff --git a/src/core/adios_bp_v1.c b/src/core/adios_bp_v1.c
index 332eed2..8d6dc97 100644
--- a/src/core/adios_bp_v1.c
+++ b/src/core/adios_bp_v1.c
@@ -185,7 +185,8 @@ int adios_parse_index_offsets_v1 (struct adios_bp_buffer_struct_v1 * b)
 }
 
 int adios_parse_process_group_index_v1 (struct adios_bp_buffer_struct_v1 * b,
-                         struct adios_index_process_group_struct_v1 ** pg_root
+                         struct adios_index_process_group_struct_v1 ** pg_root,
+                         struct adios_index_process_group_struct_v1 ** pg_tail
                          )
 {
     struct adios_index_process_group_struct_v1 ** root;
@@ -279,6 +280,10 @@ int adios_parse_process_group_index_v1 (struct adios_bp_buffer_struct_v1 * b,
         }
         b->offset += 8;
 
+        // record this as the tail
+        if (pg_tail)
+            *pg_tail = (*root);
+
         root = &(*root)->next;
     }
 
@@ -825,6 +830,7 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                       malloc (sizeof (struct adios_index_attribute_struct_v1));
             (*root)->next = 0;
         }
+        (*root)->nelems = 1; // initialize to 1 in case there will be no dimension characteristic
         uint8_t flag;
         uint32_t attr_entry_length;
         uint16_t len;
@@ -885,7 +891,6 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
         (*root)->characteristics_allocated = characteristics_sets_count;
         b->offset += 8;
 
-        // validate remaining length: offsets_count * (8 + 2 * (size of type))
         uint64_t j;
         (*root)->characteristics = malloc (characteristics_sets_count
                        * sizeof (struct adios_index_characteristic_struct_v1)
@@ -924,27 +929,34 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                         uint16_t data_size;
                         void * data = 0;
 
-                        if ((*root)->type == adios_string)
+                        if ((*root)->type == adios_string_array)
+                        {
+                            // there is no length info at this point
+                            data_size = 0;
+                            data = malloc ((*root)->nelems*sizeof(char*));
+                        }
+                        else if ((*root)->type == adios_string)
                         {
                             data_size = *(uint16_t *) (b->buff + b->offset);
                             if(b->change_endianness == adios_flag_yes) {
                                 swap_16(data_size);
                             }
                             b->offset += 2;
+                            data = malloc (data_size + 1);
+                            ((char *) data) [data_size] = '\0';
                         }
                         else
                         {
                             data_size = adios_get_type_size ((*root)->type, "");
+                            data = malloc ((*root)->nelems*data_size);
                         }
 
-                        data = malloc (data_size + 1);
-                        ((char *) data) [data_size] = '\0';
 
                         if (!data)
                         {
                             adios_error(err_no_memory, "cannot allocate"
                                     "%d bytes to copy scalar %s\n",
-                                    data_size, (*root)->attr_name);
+                                    (*root)->nelems*data_size, (*root)->attr_name);
 
                             return 1;
                         }
@@ -964,9 +976,9 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                             case adios_long_double:
                             case adios_complex:
                             case adios_double_complex:
-                                memcpy (data, (b->buff + b->offset), data_size);
+                                memcpy (data, (b->buff + b->offset), (*root)->nelems*data_size);
 
-                                if(b->change_endianness == adios_flag_yes) {
+                                if(b->change_endianness == adios_flag_yes && data_size>1) {
                                     if((*root)->type == adios_complex) {
                                         // TODO
                                     }
@@ -974,31 +986,56 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                                         // TODO
                                     }
                                     else {
-                                        switch(data_size)
+                                        int k;
+                                        char *p = (char *)data;
+                                        for (k=0; k<(*root)->nelems; k++) 
                                         {
-                                            case 2:
-                                                swap_16_ptr(data);
-                                                break;
-                                            case 4:
-                                                swap_32_ptr(data);
-                                                break;
-                                            case 8:
-                                                swap_64_ptr(data);
-                                                break;
-                                            case 16:
-                                                swap_128_ptr(data);
-                                                break;
+                                            switch(data_size)
+                                            {
+                                                case 2:
+                                                    swap_16_ptr(p);
+                                                    break;
+                                                case 4:
+                                                    swap_32_ptr(p);
+                                                    break;
+                                                case 8:
+                                                    swap_64_ptr(p);
+                                                    break;
+                                                case 16:
+                                                    swap_128_ptr(p);
+                                                    break;
+                                            }
+                                            p  += data_size;
                                         }
                                     }
                                 }
 
-                                b->offset += data_size;
+                                b->offset += (*root)->nelems*data_size;
                                 break;
+
                             case adios_string:
                                 memcpy (data, (b->buff + b->offset), data_size);
                                 b->offset += data_size;
                                 break;
 
+                            case adios_string_array:
+                                {
+                                    char ** p = (char**)data;
+                                    int k;
+                                    for (k=0; k < (*root)->nelems; k++) {
+                                        data_size = *(uint16_t *) (b->buff + b->offset);
+                                        if(b->change_endianness == adios_flag_yes) {
+                                            swap_16(data_size);
+                                        }
+                                        b->offset += 2;
+                                        p[k] = malloc (data_size + 1);
+                                        p[k] [data_size] = '\0';
+                                        memcpy (p[k], (b->buff + b->offset), data_size);
+                                        b->offset += data_size;
+                                    }
+                                }
+                                break;
+
                             default:
                                 free (data);
                                 data = 0;
@@ -1013,7 +1050,7 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                     case adios_characteristic_offset:
                     {
                         (*root)->characteristics [j].offset =
-                                            *(uint64_t *) (b->buff + b->offset);
+                            *(uint64_t *) (b->buff + b->offset);
                         if(b->change_endianness == adios_flag_yes) {
                             swap_64((*root)->characteristics [j].offset);
                         }
@@ -1025,7 +1062,7 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                     case adios_characteristic_bitmap:
                     {
                         (*root)->characteristics [j].offset =
-                                            *(uint32_t *) (b->buff + b->offset);
+                            *(uint32_t *) (b->buff + b->offset);
                         if(b->change_endianness == adios_flag_yes) {
                             swap_32((*root)->characteristics [j].offset);
                         }
@@ -1037,7 +1074,7 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                     case adios_characteristic_payload_offset:
                     {
                         (*root)->characteristics [j].payload_offset =
-                                            *(uint64_t *) (b->buff + b->offset);
+                            *(uint64_t *) (b->buff + b->offset);
                         if(b->change_endianness == adios_flag_yes) {
                             swap_64((*root)->characteristics [j].payload_offset);
                         }
@@ -1049,7 +1086,7 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                     case adios_characteristic_file_index:
                     {
                         (*root)->characteristics [j].file_index =
-                                            *(uint32_t *) (b->buff + b->offset);
+                            *(uint32_t *) (b->buff + b->offset);
                         if(b->change_endianness == adios_flag_yes) {
                             swap_32((*root)->characteristics [j].file_index);
                         }
@@ -1061,7 +1098,7 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                     case adios_characteristic_time_index:
                     {
                         (*root)->characteristics [j].time_index =
-                                            *(uint32_t *) (b->buff + b->offset);
+                            *(uint32_t *) (b->buff + b->offset);
                         if(b->change_endianness == adios_flag_yes) {
                             swap_32((*root)->characteristics [j].time_index);
                         }
@@ -1074,7 +1111,7 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                     {
                         /* BP Format v1: varid/attrid was 16bit, now it's 32 bit */
                         (*root)->characteristics [j].var_id =
-                                            *(uint32_t *) (b->buff + b->offset);
+                            *(uint32_t *) (b->buff + b->offset);
                         if(b->change_endianness == adios_flag_yes) {
                             swap_32((*root)->characteristics [j].var_id);
                         }
@@ -1088,15 +1125,43 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
                     {
                         adios_transform_deserialize_transform_characteristic(&(*root)->characteristics[j].transform, b);
                         /*
-                        (*root)->characteristics [j].transform_type =
-                                            *(uint8_t *) (b->buff + b->offset);
+                           (*root)->characteristics [j].transform_type =
+                         *(uint8_t *) (b->buff + b->offset);
+                         b->offset += 1;
+                         */
+                        break;
+                    }
+
+                    case adios_characteristic_dimensions:
+                    {
+                        uint16_t dims_length;
+
+                        (*root)->characteristics [j].dims.count = *(uint8_t *) (b->buff + b->offset);
                         b->offset += 1;
-                        */
+
+                        dims_length = *(uint16_t *) (b->buff + b->offset);
+                        if(b->change_endianness == adios_flag_yes) {
+                            swap_16(dims_length);
+                        }
+                        b->offset += 2;
+
+                        (*root)->characteristics [j].dims.dims = (uint64_t *) malloc (dims_length);
+                        memcpy ((*root)->characteristics [j].dims.dims,
+                                (b->buff + b->offset), dims_length);
+                        if(b->change_endianness == adios_flag_yes) {
+                            int di = 0;
+                            int dims_num = dims_length / 8;
+                            for (di = 0; di < dims_num; di ++) {
+                                swap_64(((*root)->characteristics [j].dims.dims)[di]);
+                            }
+                        }
+                        b->offset += dims_length;
+                        (*root)->nelems = (*root)->characteristics [j].dims.dims[0];
                         break;
                     }
-                    
+
                     default:
-                        break;
+                    break;
                 }
                 item++;
             }
@@ -1109,7 +1174,7 @@ int adios_parse_attributes_index_v1 (struct adios_bp_buffer_struct_v1 * b
 }
 
 int adios_parse_process_group_header_v1 (struct adios_bp_buffer_struct_v1 * b
-                       ,struct adios_process_group_header_struct_v1 * pg_header
+        ,struct adios_process_group_header_struct_v1 * pg_header
                             )
 {
     if (b->length - b->offset < 24)
@@ -1334,15 +1399,15 @@ int adios_parse_var_data_header_v1 (struct adios_bp_buffer_struct_v1 * b
 
         (*root)->dimension.rank = 0;
         (*root)->dimension.var_id = 0;
-        (*root)->dimension.time_index = adios_flag_no;
+        (*root)->dimension.is_time_index = adios_flag_no;
 
         (*root)->global_dimension.rank = 0;
         (*root)->global_dimension.var_id = 0;
-        (*root)->global_dimension.time_index = adios_flag_no;
+        (*root)->global_dimension.is_time_index = adios_flag_no;
 
         (*root)->local_offset.rank = 0;
         (*root)->local_offset.var_id = 0;
-        (*root)->local_offset.time_index = adios_flag_no;
+        (*root)->local_offset.is_time_index = adios_flag_no;
 
         flag = *(b->buff + b->offset);
         b->offset += 1;
@@ -1354,7 +1419,7 @@ int adios_parse_var_data_header_v1 (struct adios_bp_buffer_struct_v1 * b
                 swap_32((*root)->dimension.var_id);
             }
             if ((*root)->dimension.var_id == 0)
-                (*root)->dimension.time_index = adios_flag_yes;
+                (*root)->dimension.is_time_index = adios_flag_yes;
             b->offset += 4;
         }
         else
@@ -1378,7 +1443,7 @@ int adios_parse_var_data_header_v1 (struct adios_bp_buffer_struct_v1 * b
                 swap_32((*root)->global_dimension.var_id);
             }
             if ((*root)->global_dimension.var_id == 0)
-                (*root)->global_dimension.time_index = adios_flag_yes;
+                (*root)->global_dimension.is_time_index = adios_flag_yes;
             b->offset += 4;
         }
         else
@@ -1402,7 +1467,7 @@ int adios_parse_var_data_header_v1 (struct adios_bp_buffer_struct_v1 * b
                 swap_32((*root)->local_offset.var_id);
             }
             if ((*root)->local_offset.var_id == 0)
-                (*root)->local_offset.time_index = adios_flag_yes;
+                (*root)->local_offset.is_time_index = adios_flag_yes;
             b->offset += 4;
         }
         else
@@ -1681,6 +1746,17 @@ int adios_parse_var_data_header_v1 (struct adios_bp_buffer_struct_v1 * b
 
     var_header->payload_size = length_of_var - (b->offset - initial_offset);
 
+    /* At this point we are at the payload, processed all metadata.
+       If offset and payload_offset was not read in, let's calculate them here
+       b->offset was 0 when reading in the whole PG and start processing with
+       parsing the process group. 
+        initial_offset points to the beginning of this variable's metadata.
+        b->offset points to the beginning of this variable's payload.
+    */
+    if (var_header->characteristics.offset == 0)
+        var_header->characteristics.offset = b->read_pg_offset + initial_offset;
+    if (var_header->characteristics.payload_offset == 0)
+        var_header->characteristics.payload_offset = b->read_pg_offset + b->offset;
     return 0;
 }
 
@@ -1887,6 +1963,9 @@ int adios_parse_attributes_header_v1 (struct adios_bp_buffer_struct_v1 * b
     return 0;
 }
 
+/** Read/parse an attribute from the PG into adios_attribute_struct_v1.
+   Used by bpdump to print out the actual attributes stored in each PG
+*/
 int adios_parse_attribute_v1 (struct adios_bp_buffer_struct_v1 * b
         ,struct adios_attribute_struct_v1 * attribute
         )
@@ -1956,21 +2035,76 @@ int adios_parse_attribute_v1 (struct adios_bp_buffer_struct_v1 * b
         flag = *(b->buff + b->offset);
         attribute->type = (enum ADIOS_DATATYPES) flag;
         b->offset += 1;
-        attribute->length = *(uint32_t *) (b->buff + b->offset);
-        if(b->change_endianness == adios_flag_yes) {
-            swap_32(attribute->length);
+        if (attribute->type == adios_string_array) 
+        {
+            attribute->length = 0;
+            attribute->nelems = *(uint32_t *) (b->buff + b->offset);
+            if(b->change_endianness == adios_flag_yes) {
+                swap_32(attribute->nelems);
+            }
+            b->offset += 4;
+
+            // 4 bytes nelems then nelems times: 4 bytes length + string
+            char ** p = malloc (attribute->nelems*sizeof(char*));
+            int k;
+            uint32_t len;
+            for (k=0; k < attribute->nelems; k++) {
+                // length of one string without terminating 0
+                len = *(uint32_t *) (b->buff + b->offset);
+                if(b->change_endianness == adios_flag_yes) {
+                    swap_32(len);
+                }
+                b->offset += 4;
+                p[k] = malloc (len*sizeof(char)+1);
+                if (p[k]) {
+                    p[k][len] = '\0';
+                    memcpy (p[k], (b->buff + b->offset), len);
+                }
+                b->offset += len;
+                attribute->length += len; 
+            }
+            attribute->value = p;
+
         }
-        b->offset += 4;
+        else if (attribute->type == adios_string) 
+        {
+            attribute->length = *(uint32_t *) (b->buff + b->offset);
+            if(b->change_endianness == adios_flag_yes) {
+                swap_32(attribute->length);
+            }
+            b->offset += 4;
 
-        attribute->value = malloc (attribute->length + 1);
-        ((char *) attribute->value) [attribute->length] = '\0';
-        memcpy (attribute->value, (b->buff + b->offset), attribute->length);
+            // terminating 0 is NOT included in the file
+            attribute->value = malloc (attribute->length + 1);
+            ((char *) attribute->value) [attribute->length] = '\0';
+            memcpy (attribute->value, (b->buff + b->offset), attribute->length);
+            attribute->nelems = 1;
+            b->offset += attribute->length;
+        } 
+        else 
+        {
+            attribute->length = *(uint32_t *) (b->buff + b->offset);
+            if(b->change_endianness == adios_flag_yes) {
+                swap_32(attribute->length);
+            }
+            b->offset += 4;
 
-        // TODO: do we need byte-swap here?
-        if(b->change_endianness == adios_flag_yes) {
-            swap_adios_type(attribute->value, attribute->type);
+            int elemsize = adios_get_type_size (attribute->type, NULL); 
+            attribute->nelems = attribute->length / elemsize;
+            attribute->value = malloc (attribute->length);
+            memcpy (attribute->value, (b->buff + b->offset), attribute->length);
+
+            // byte-swap here element by element
+            if(b->change_endianness == adios_flag_yes) {
+                int i;
+                char * p = (char *)attribute->value;
+                for (i=0; i<attribute->nelems; i++) {
+                    swap_adios_type(p, attribute->type);
+                    p = p + elemsize;
+                }
+            }
+            b->offset += attribute->length;
         }
-        b->offset += attribute->length;
     }
 
     return 0;
@@ -1995,7 +2129,10 @@ int adios_clear_attribute_v1 (struct adios_attribute_struct_v1 * attribute)
     attribute->length = 0;
     if (attribute->value)
     {
-        free (attribute->value);
+        if (attribute->type == adios_string_array)
+            free_string_array (attribute->value, attribute->nelems);
+        else
+            free (attribute->value);
         attribute->value = 0;
     }
     return 0;
@@ -2222,7 +2359,7 @@ void adios_posix_close_internal (struct adios_bp_buffer_struct_v1 * b)
     adios_buffer_struct_clear (b);
 }
 
-uint64_t adios_get_type_size (enum ADIOS_DATATYPES type, void * var)
+uint64_t adios_get_type_size (enum ADIOS_DATATYPES type, const void * var)
 {
     switch (type)
     {
@@ -2234,7 +2371,10 @@ uint64_t adios_get_type_size (enum ADIOS_DATATYPES type, void * var)
             if (!var)
                 return 0;
             else
-                return strlen ((char *) var);
+                return strlen ((const char *) var);
+
+        case adios_string_array:
+            return sizeof (char*);
 
         case adios_short:
         case adios_unsigned_short:
diff --git a/src/core/adios_bp_v1.h b/src/core/adios_bp_v1.h
index 06d5f6d..2ed623e 100644
--- a/src/core/adios_bp_v1.h
+++ b/src/core/adios_bp_v1.h
@@ -13,7 +13,8 @@
 #include "core/adios_transport_hooks.h"
 #include "core/qhashtbl.h"
 
-#define ADIOS_VERSION_BP_FORMAT                      2
+#include "public/adios_version.h" // ADIOS_VERSION_BP_FORMAT
+
 #define ADIOS_VERSION_NUM_MASK                       0x000000FF
 #define ADIOS_VERSION_HAVE_SUBFILE                   0x00000100
 #define ADIOS_VERSION_HAVE_TIME_INDEX_CHARACTERISTIC 0x00000200
@@ -169,6 +170,7 @@ struct adios_index_attribute_struct_v1
     char * attr_name;
     char * attr_path;
     enum ADIOS_DATATYPES type;
+    int    nelems; // number of elements of type 'type'
 
     uint64_t characteristics_count;
     uint64_t characteristics_allocated;
@@ -184,6 +186,7 @@ struct adios_index_attribute_struct_v1
 struct adios_index_struct_v1
 {
     struct adios_index_process_group_struct_v1 * pg_root;
+    struct adios_index_process_group_struct_v1 * pg_tail;
     struct adios_index_var_struct_v1           * vars_root;
     struct adios_index_var_struct_v1           * vars_tail;
     struct adios_index_attribute_struct_v1     * attrs_root;
@@ -204,7 +207,7 @@ struct adios_dimension_item_struct_v1
 {
     uint64_t rank;
     uint32_t var_id;
-    enum ADIOS_FLAG time_index;
+    enum ADIOS_FLAG is_time_index;
 };
 
 struct adios_dimension_struct_v1
@@ -266,7 +269,10 @@ struct adios_attribute_struct_v1
     uint32_t var_id;
 
     enum ADIOS_DATATYPES type;
-    uint32_t length;
+    int    nelems;     // number of elements of type 'type'
+    uint32_t length;   // length of attribute value  = nelems*sizeof(type)
+                       // does not include '\0' in a string attribute (so memory
+                       //    used by a string attribute is length+1)
     void * value;
 };
 
@@ -284,8 +290,9 @@ int adios_parse_version (struct adios_bp_buffer_struct_v1 * b
 // buff must be 16 bytes
 int adios_parse_index_offsets_v1 (struct adios_bp_buffer_struct_v1 * b);
 
-int adios_parse_process_group_index_v1 (struct adios_bp_buffer_struct_v1 * b
-                         ,struct adios_index_process_group_struct_v1 ** pg_root
+int adios_parse_process_group_index_v1 (struct adios_bp_buffer_struct_v1 * b,
+                         struct adios_index_process_group_struct_v1 ** pg_root,
+                         struct adios_index_process_group_struct_v1 ** pg_tail
                          );
 
 int adios_parse_vars_index_v1 (struct adios_bp_buffer_struct_v1 * b
diff --git a/src/core/adios_internals.c b/src/core/adios_internals.c
index 9c75359..6e897c1 100644
--- a/src/core/adios_internals.c
+++ b/src/core/adios_internals.c
@@ -248,13 +248,13 @@ int adios_parse_dimension (const char * dimension
     dim->dimension.var = NULL;
     dim->dimension.attr = NULL;
 
-    dim->dimension.time_index = adios_flag_no;
+    dim->dimension.is_time_index = adios_flag_no;
     if ( g->time_index_name &&
          !strcasecmp (g->time_index_name, dimension)
        )
     {
         /* this is time dimension */
-        dim->dimension.time_index = adios_flag_yes;
+        dim->dimension.is_time_index = adios_flag_yes;
     }
     else if (adios_int_is_var (dimension))
     {
@@ -283,6 +283,7 @@ int adios_parse_dimension (const char * dimension
                     switch (attr->var->type)
                     {
                         case adios_string:
+                        case adios_string_array:
                         case adios_real:
                         case adios_double:
                         case adios_long_double:
@@ -307,6 +308,7 @@ int adios_parse_dimension (const char * dimension
                     switch (attr->type)
                     {
                         case adios_string:
+                        case adios_string_array:
                         case adios_real:
                         case adios_double:
                         case adios_long_double:
@@ -333,6 +335,7 @@ int adios_parse_dimension (const char * dimension
             switch (var->type)
             {
                 case adios_string:
+                case adios_string_array:
                 case adios_real:
                 case adios_double:
                 case adios_long_double:
@@ -389,7 +392,7 @@ int adios_parse_dimension (const char * dimension
                         && !strcasecmp (g->time_index_name, global_dimension)
                    )
                 {
-                    dim->global_dimension.time_index = adios_flag_yes;
+                    dim->global_dimension.is_time_index = adios_flag_yes;
                 }
                 else
                 {
@@ -407,6 +410,7 @@ int adios_parse_dimension (const char * dimension
                     switch (attr->var->type)
                     {
                         case adios_string:
+                        case adios_string_array:
                         case adios_real:
                         case adios_double:
                         case adios_long_double:
@@ -431,6 +435,7 @@ int adios_parse_dimension (const char * dimension
                     switch (attr->type)
                     {
                         case adios_string:
+                        case adios_string_array:
                         case adios_real:
                         case adios_double:
                         case adios_long_double:
@@ -457,6 +462,7 @@ int adios_parse_dimension (const char * dimension
             switch (var->type)
             {
                 case adios_string:
+                case adios_string_array:
                 case adios_real:
                 case adios_double:
                 case adios_long_double:
@@ -512,7 +518,7 @@ int adios_parse_dimension (const char * dimension
                         && !strcasecmp (g->time_index_name, local_offset)
                    )
                 {
-                    dim->local_offset.time_index = adios_flag_yes;
+                    dim->local_offset.is_time_index = adios_flag_yes;
                 }
                 else
                 {
@@ -530,6 +536,7 @@ int adios_parse_dimension (const char * dimension
                     switch (attr->var->type)
                     {
                         case adios_string:
+                        case adios_string_array:
                         case adios_real:
                         case adios_double:
                         case adios_long_double:
@@ -554,6 +561,7 @@ int adios_parse_dimension (const char * dimension
                     switch (attr->type)
                     {
                         case adios_string:
+                        case adios_string_array:
                         case adios_real:
                         case adios_double:
                         case adios_long_double:
@@ -580,6 +588,7 @@ int adios_parse_dimension (const char * dimension
             switch (var->type)
             {
                 case adios_string:
+                case adios_string_array:
                 case adios_real:
                 case adios_double:
                 case adios_long_double:
@@ -892,6 +901,13 @@ int adios_parse_scalar_string (enum ADIOS_DATATYPES type, char * value, void **
                 return 1;
             }
 
+        case adios_string_array:
+            {
+            adios_error (err_unspecified,
+                    "adios_parse_scalar_string: string arrays cannot be processed yet\n");
+            return 1;
+            }
+
         case adios_unknown:
         default:
             adios_error (err_unspecified,
@@ -935,6 +951,7 @@ int adios_common_define_attribute (int64_t group, const char * name
             return 0;
         }
         attr->type = type;
+        attr->data_size = adios_get_type_size (type, (void *)value);
         if (adios_parse_scalar_string (type, (void *) value, &attr->value))
         {
             attr->var = 0;
@@ -957,6 +974,7 @@ int adios_common_define_attribute (int64_t group, const char * name
     else
     {
         attr->value = 0;
+        attr->data_size = 0;
         attr->type = adios_unknown;
         attr->var = adios_find_var_by_name (g, var);
 
@@ -975,6 +993,7 @@ int adios_common_define_attribute (int64_t group, const char * name
         }
     }
 
+    attr->nelems = 1;
     attr->next = 0;
     attr->write_offset = 0;
 
@@ -984,11 +1003,12 @@ int adios_common_define_attribute (int64_t group, const char * name
 }
 
 
-/* define an attribute by passing the value directly, not by a string */
+/* define an attribute by passing the values directly, not by a string */
 int adios_common_define_attribute_byvalue (int64_t group, const char * name
         ,const char * path
         ,enum ADIOS_DATATYPES type
-        ,void * value
+        ,int nelems
+        ,void * values
         )
 {
     struct adios_group_struct * g = (struct adios_group_struct *) group;
@@ -996,9 +1016,7 @@ int adios_common_define_attribute_byvalue (int64_t group, const char * name
         malloc (sizeof (struct adios_attribute_struct));
     uint64_t size;
 
-    attr->name = strdup (name);
-    attr->path = strdup (path);
-    if (value)
+    if (values)
     {
         if (type == adios_unknown)
         {
@@ -1006,19 +1024,32 @@ int adios_common_define_attribute_byvalue (int64_t group, const char * name
                     "config.xml: attribute element %s has invalid "
                     "type attribute\n",
                     name);
-
-            free (attr->name);
-            free (attr->path);
             free (attr);
-
             return 0;
         }
         attr->type = type;
-        size = adios_get_type_size (attr->type, value);
+        attr->nelems = nelems;
+        size = adios_get_type_size (attr->type, values);
         if (size > 0)
         {
-            attr->value = malloc (size);
-            memcpy (attr->value, value, size);
+            if (type == adios_string_array) {
+                // need to copy strings from a char** array
+                int total_length;
+                attr->value = dup_string_array ((char**)values, nelems, &total_length);
+                if (!attr->value) {
+                    adios_error (err_no_memory, 
+                            "Not enough memory to copy string array attribute %s/%s\n", 
+                            path, name);
+                    free (attr);
+                    return 0;
+                }
+                attr->data_size = total_length;
+
+            } else {
+                attr->value = malloc (nelems*size);
+                memcpy (attr->value, values, nelems*size);
+                attr->data_size = nelems*size;
+            }
             attr->var = 0;
         }
         else
@@ -1026,25 +1057,19 @@ int adios_common_define_attribute_byvalue (int64_t group, const char * name
             adios_error (err_invalid_value_attr,
                     "Attribute element %s has invalid "
                     "value attribute\n", name);
-
             free (attr->value);
-            free (attr->name);
-            free (attr->path);
             free (attr);
-
             return 0;
         }
+        attr->name = strdup (name);
+        attr->path = strdup (path);
     }
     else
     {
         adios_error (err_invalid_value_attr,
                 "Attribute element %s has invalid "
                 "value attribute\n", name);
-
-        free (attr->name);
-        free (attr->path);
         free (attr);
-
         return 0;
     }
 
@@ -1330,11 +1355,15 @@ int adios_common_delete_attrdefs (struct adios_group_struct * g)
     {
         struct adios_attribute_struct * attr = g->attributes;
         g->attributes = g->attributes->next;
-        free (attr->value);
+        if (attr->type == adios_string_array)
+            free_string_array (attr->value, attr->nelems);
+        else
+            free (attr->value);
         free (attr->name);
         free (attr->path);
         free (attr);
     }
+    return 0;
 }
 
 // Delete all variable (definitions) from a group
@@ -1397,8 +1426,8 @@ int adios_common_delete_vardefs (struct adios_group_struct * g)
         // NCSU ALACRITY-ADIOS - Clean transform metadata
         adios_transform_clear_transform_var(var);
 
-        if (var->data)
-            free (var->data);
+        if (var->adata) 
+            free (var->adata);
 
         free (var);
     }
@@ -1720,6 +1749,7 @@ int64_t adios_common_define_var (int64_t group_id, const char * name
     v->parent_var = NULL;
 
     v->data = 0;
+    v->adata = 0;
     v->write_offset = 0;
 
     v->data_size = 0;
@@ -1969,6 +1999,9 @@ static uint16_t adios_calc_var_characteristics_overhead(struct adios_var_struct
             //overhead += 2; // size
             break;
 
+        case adios_string_array: // not supported for variables
+            break;
+
         default:   // the 12 numeric types
             if (v->dimensions)
             {
@@ -2013,7 +2046,7 @@ uint16_t adios_calc_var_overhead_v1 (struct adios_var_struct * v)
         overhead += 1; // var flag
         if (    d->dimension.var == NULL
              && d->dimension.attr == NULL
-             && d->dimension.time_index == adios_flag_no
+             && d->dimension.is_time_index == adios_flag_no
            )
         {
             overhead += 8; // value
@@ -2026,7 +2059,7 @@ uint16_t adios_calc_var_overhead_v1 (struct adios_var_struct * v)
         overhead += 1; // var flag
         if (    d->global_dimension.var == NULL
              && d->global_dimension.attr == NULL
-             && d->global_dimension.time_index == adios_flag_no
+             && d->global_dimension.is_time_index == adios_flag_no
            )
         {
             overhead += 8; // value
@@ -2039,7 +2072,7 @@ uint16_t adios_calc_var_overhead_v1 (struct adios_var_struct * v)
         overhead += 1; // var flag
         if (    d->local_offset.var == NULL
              && d->local_offset.attr == NULL
-             && d->local_offset.time_index == adios_flag_no
+             && d->local_offset.is_time_index == adios_flag_no
            )
         {
             overhead += 8; // value
@@ -2072,8 +2105,12 @@ uint32_t adios_calc_attribute_overhead_v1 (struct adios_attribute_struct * a)
     else
     {
         overhead += 1; // datatype
-        overhead += 4; // length of value
-        overhead += adios_get_type_size (a->type, a->value); // value
+        overhead += 4; // length of value (or nelems for string array)
+        if (a->type == adios_string_array)
+            // strings + terminating 0s + individual lengths in 32bit
+            overhead += a->data_size + a->nelems + a->nelems*4; 
+        else
+            overhead += a->nelems * adios_get_type_size (a->type, a->value); // value
     }
 
     return overhead;
@@ -2216,28 +2253,30 @@ int adios_write_process_group_header_v1 (struct adios_file_struct * fd
     return 0;
 }
 
-static void index_append_process_group_v1 (
-        struct adios_index_process_group_struct_v1 ** root
-        ,struct adios_index_process_group_struct_v1 * item
+void index_append_process_group_v1 (
+        struct adios_index_struct_v1 * index,
+        struct adios_index_process_group_struct_v1 * item
         )
 {
-    while (root)
-    {
-        if (!*root)
-        {
-            *root = item;
-            root = 0;
-        }
-        else
-        {
-            root = &(*root)->next;
-        }
+    /* PG's are not merged, simply add to the end of the list */
+    if (index->pg_root) {
+        index->pg_tail->next = item;
+    } else {
+        // first element
+        index->pg_root = item;
     }
+    index->pg_tail = item;
+    /* item may be head of a long list of PGs 
+       (e.g. during global index aggregation in MPI_AGGREGATE)
+       So don't do this: 
+          item->next = 0; 
+    */
 }
 
-static void index_append_var_v1 (
+void index_append_var_v1 (
         struct adios_index_struct_v1 *index
         ,struct adios_index_var_struct_v1 * item
+        ,int do_sort
         )
 {
     struct adios_index_var_struct_v1 * olditem;
@@ -2291,39 +2330,110 @@ static void index_append_var_v1 (
             return;
         }
 
-        if (  olditem->characteristics_count
-              + item->characteristics_count
-              > olditem->characteristics_allocated
-           )
+        if (do_sort && item->characteristics_count > 0) 
         {
-            int new_items = (item->characteristics_count == 1)
-                ? 100 : item->characteristics_count;
-            olditem->characteristics_allocated =
-                olditem->characteristics_count + new_items;
-            void * ptr = realloc (
-                    olditem->characteristics,
-                    olditem->characteristics_allocated *
-                        sizeof (struct adios_index_characteristic_struct_v1)
-                    );
-
-            if (ptr)
-            {
-                olditem->characteristics = ptr;
-            }
-            else
+            log_debug ("  ----------- Append index with merging --------------\n");
+            struct adios_index_characteristic_struct_v1 * c;
+            int count = olditem->characteristics_count + item->characteristics_count;
+            c = malloc ( count * sizeof (struct adios_index_characteristic_struct_v1));
+            if (!c)
             {
                 adios_error (err_no_memory, "error allocating memory to build "
                         "var index.  Index aborted\n");
                 return;
             }
-        }
-        memcpy (&olditem->characteristics [olditem->characteristics_count],
-                item->characteristics,
-                item->characteristics_count *
+            /* Merge the characteristics sorted with time_index */
+            struct adios_index_characteristic_struct_v1 * c1 = olditem->characteristics;
+            struct adios_index_characteristic_struct_v1 * c2 = item->characteristics;
+            uint64_t k1 = 0;
+            uint64_t k2 = 0;
+            struct adios_index_characteristic_struct_v1 * cend = c;
+            log_debug ("  old count=%llu item count=%llu\n", olditem->characteristics_count, item->characteristics_count);
+            while (k1 < olditem->characteristics_count || k2 < item->characteristics_count)
+            {
+                log_debug ("  k1=%llu k2=%llu", k1, k2);
+                /*
+                if (k2 >= item->characteristics_count || c1->time_index <= c2->time_index) {
+                    memcpy (cend, c1, sizeof(struct adios_index_characteristic_struct_v1)); 
+                    log_debug_cont ("  -> choose c1, time_index=%u", c1->time_index);
+                    c1++;
+                    k1++;
+                }
+                else if (k1 >= olditem->characteristics_count || c1->time_index > c2->time_index) {
+                    memcpy (cend, c2, sizeof(struct adios_index_characteristic_struct_v1)); 
+                    log_debug_cont ("  -> choose c2, time_index=%u", c2->time_index);
+                    c2++;
+                    k2++;
+                }*/
+                if (k2 >= item->characteristics_count) {
+                    memcpy (cend, c1, sizeof(struct adios_index_characteristic_struct_v1)); 
+                    log_debug_cont ("  -> only c1, time_index=%u", c1->time_index);
+                    c1++;
+                    k1++;
+                }
+                else if (k1 >= olditem->characteristics_count) {
+                    memcpy (cend, c2, sizeof(struct adios_index_characteristic_struct_v1)); 
+                    log_debug_cont ("  -> only c2, time_index=%u", c2->time_index);
+                    c2++;
+                    k2++;
+                }
+                else if (c1->time_index <= c2->time_index) {
+                    memcpy (cend, c1, sizeof(struct adios_index_characteristic_struct_v1)); 
+                    log_debug_cont ("  -> choose c1, time_index=%u", c1->time_index);
+                    c1++;
+                    k1++;
+                }
+                else {
+                    memcpy (cend, c2, sizeof(struct adios_index_characteristic_struct_v1)); 
+                    log_debug_cont ("  -> choose c2, time_index=%u", c2->time_index);
+                    c2++;
+                    k2++;
+                }
+                cend++;
+                log_debug_cont ("\n");
+            }
+            free (olditem->characteristics);
+            olditem->characteristics = c;
+            olditem->characteristics_allocated = count;
+            olditem->characteristics_count = count;
+             
+        } 
+        else 
+        {
+            if (  olditem->characteristics_count
+                    + item->characteristics_count
+                    > olditem->characteristics_allocated
+               )
+            {
+                int new_items = (item->characteristics_count == 1)
+                    ? 100 : item->characteristics_count;
+                olditem->characteristics_allocated =
+                    olditem->characteristics_count + new_items;
+                void * ptr = realloc (
+                        olditem->characteristics,
+                        olditem->characteristics_allocated *
+                        sizeof (struct adios_index_characteristic_struct_v1)
+                        );
+
+                if (ptr)
+                {
+                    olditem->characteristics = ptr;
+                }
+                else
+                {
+                    adios_error (err_no_memory, "error allocating memory to build "
+                            "var index.  Index aborted\n");
+                    return;
+                }
+            }
+            memcpy (&olditem->characteristics [olditem->characteristics_count],
+                    item->characteristics,
+                    item->characteristics_count *
                     sizeof (struct adios_index_characteristic_struct_v1)
-               );
+                   );
 
-        olditem->characteristics_count += item->characteristics_count;
+            olditem->characteristics_count += item->characteristics_count;
+        }
 
         free (item->characteristics);
         free (item->group_name);
@@ -2404,15 +2514,18 @@ static void index_append_attribute_v1
 }
 
 // lists in new_index will be destroyed as part of the merge operation...
+// needs_sorting: use 1 if the the inserted new list has multiple timesteps
+//                it will merge sort the characteristics to keep the time in order
 void adios_merge_index_v1 (
                    struct adios_index_struct_v1 * main_index
                   ,struct adios_index_process_group_struct_v1 * new_pg_root
                   ,struct adios_index_var_struct_v1 * new_vars_root
                   ,struct adios_index_attribute_struct_v1 * new_attrs_root
+                  ,int needs_sorting
                   )
 {
     // this will just add it on to the end and all should work fine
-    index_append_process_group_v1 (&main_index->pg_root, new_pg_root);
+    index_append_process_group_v1 (main_index, new_pg_root);
 
     // need to do vars attrs one at a time to merge them properly
     struct adios_index_var_struct_v1 * v = new_vars_root;
@@ -2425,7 +2538,7 @@ void adios_merge_index_v1 (
         v_temp = v->next;
         v->next = 0;
         log_debug ("merge index var %s/%s\n", v->var_path, v->var_name);
-        index_append_var_v1 (main_index, v);
+        index_append_var_v1 (main_index, v, needs_sorting);
         v = v_temp;
     }
 
@@ -2438,6 +2551,8 @@ void adios_merge_index_v1 (
     }
 }
 
+#if 0
+// obsolete, merge the index with sorting
 // sort pg/var indexes by time index
 void adios_sort_index_v1 (struct adios_index_process_group_struct_v1 ** p1
         ,struct adios_index_var_struct_v1 ** v1
@@ -2554,6 +2669,7 @@ void adios_sort_index_v1 (struct adios_index_process_group_struct_v1 ** p1
 
     // no need to sort attributes
 }
+#endif 
 
 static void adios_clear_process_groups_index_v1 (
         struct adios_index_process_group_struct_v1 * root
@@ -2689,8 +2805,12 @@ static void adios_clear_vars_index_v1 (struct adios_index_var_struct_v1 * root)
             // NCSU ALACRITY-ADIOS - Clear the transform metadata
             adios_transform_clear_transform_characteristic(&root->characteristics[i].transform);
 
-            if (root->characteristics [i].value)
-                free (root->characteristics [i].value);
+            /*if (root->characteristics [i].value) {
+                if (root->type == adios_string_array)
+                    free_string_array (root->characteristics [i].value, root->nelems);
+                else
+                    free (root->characteristics [i].value);
+            }*/
         }
 
         if (root->characteristics)
@@ -2708,6 +2828,7 @@ struct adios_index_struct_v1 * adios_alloc_index_v1 (int alloc_hashtables)
                 malloc (sizeof(struct adios_index_struct_v1));
     assert (index);
     index->pg_root = NULL;
+    index->pg_tail = NULL;
     index->vars_root = NULL;
     index->vars_tail = NULL;
     index->attrs_root = NULL;
@@ -2746,6 +2867,7 @@ void adios_clear_index_v1 (struct adios_index_struct_v1 * index)
     adios_clear_vars_index_v1 (index->vars_root);
     adios_clear_attributes_index_v1 (index->attrs_root);
     index->pg_root = NULL;
+    index->pg_tail = NULL;
     index->vars_root = NULL;
     index->vars_tail = NULL;
     index->attrs_root = NULL;
@@ -2818,6 +2940,7 @@ static uint64_t cast_var_data_as_uint64 (const char * parent_name
             return (uint64_t) *(long double *) data;
 
         case adios_string:
+        case adios_string_array:
         case adios_complex:
         case adios_double_complex:
         default:
@@ -2836,9 +2959,9 @@ uint64_t adios_get_dim_value (struct adios_dimension_item_struct * dimension)
     if (dimension->var != 0)
     {
         struct adios_var_struct * var = dimension->var;
-        if (var->data)
+        if (var->adata)
         {
-            dim = cast_var_data_as_uint64 (var->name, var->type, var->data);
+            dim = cast_var_data_as_uint64 (var->name, var->type, var->adata);
         }
         else
         {
@@ -2850,9 +2973,9 @@ uint64_t adios_get_dim_value (struct adios_dimension_item_struct * dimension)
         struct adios_attribute_struct * attr = dimension->attr;
         if (attr->var)
         {
-            if (attr->var->data)
+            if (attr->var->adata)
             {
-                dim = cast_var_data_as_uint64 (attr->var->name,attr->var->type,attr->var->data);
+                dim = cast_var_data_as_uint64 (attr->var->name,attr->var->type,attr->var->adata);
             }
             else
             {
@@ -2866,7 +2989,7 @@ uint64_t adios_get_dim_value (struct adios_dimension_item_struct * dimension)
     }
     else
     {
-        if (dimension->time_index == adios_flag_yes)
+        if (dimension->is_time_index == adios_flag_yes)
             dim = 1;
         else
             dim = dimension->rank;
@@ -2894,6 +3017,7 @@ void adios_copy_var_written (struct adios_group_struct * g, struct adios_var_str
     var_new->stats = 0;
     var_new->free_data = var->free_data;
     var_new->data = 0;
+    var_new->adata = 0;
     var_new->data_size = var->data_size;
             var_new->write_count = var->write_count;
     var_new->next = 0;
@@ -2988,15 +3112,15 @@ void adios_copy_var_written (struct adios_group_struct * g, struct adios_var_str
                     d_new->dimension.var = NULL;
                     d_new->dimension.attr = NULL;
                     d_new->dimension.rank = adios_get_dim_value (&d->dimension);
-                    d_new->dimension.time_index = d->dimension.time_index;
+                    d_new->dimension.is_time_index = d->dimension.is_time_index;
                     d_new->global_dimension.var = NULL;
                     d_new->global_dimension.attr = NULL;
                     d_new->global_dimension.rank = adios_get_dim_value (&d->global_dimension);
-                    d_new->global_dimension.time_index = d->global_dimension.time_index;
+                    d_new->global_dimension.is_time_index = d->global_dimension.is_time_index;
                     d_new->local_offset.var = NULL;
                     d_new->local_offset.attr = NULL;
                     d_new->local_offset.rank = adios_get_dim_value (&d->local_offset);
-                    d_new->local_offset.time_index = d->local_offset.time_index;
+                    d_new->local_offset.is_time_index = d->local_offset.is_time_index;
                     d_new->next = 0;
 
                     adios_append_dimension (&var_new->dimensions, d_new);
@@ -3008,8 +3132,9 @@ void adios_copy_var_written (struct adios_group_struct * g, struct adios_var_str
             {
                 adios_transform_init_transform_var(var_new);
                 var_new->stats = 0;
-                var_new->data = malloc (size);
-                memcpy (var_new->data, var->data, size);
+                var_new->adata = malloc (size);
+                memcpy (var_new->adata, var->data, size);
+                var_new->data = var_new->adata;
             }
 
             break;
@@ -3017,12 +3142,18 @@ void adios_copy_var_written (struct adios_group_struct * g, struct adios_var_str
         case adios_string:
             {
                 adios_transform_init_transform_var(var_new);
-                var_new->data = malloc (size + 1);
-                memcpy (var_new->data, var->data, size);
-                ((char *) (var_new->data)) [size] = 0;
+                var_new->adata = malloc (size + 1);
+                memcpy (var_new->adata, var->data, size);
+                ((char *) (var_new->adata)) [size] = 0;
+                var_new->data = var_new->adata;
 
                 break;
             }
+        case adios_string_array:
+            {
+                adios_error (err_unspecified, "String arrays are not supported for variables %s:%s:%d\n",
+                        __FILE__,__func__, __LINE__);
+            }
         default:
             {
                 adios_error (err_unspecified, "Reached unexpected branch in %s:%s:%d\n",
@@ -3175,15 +3306,15 @@ void adios_copy_var_written (struct adios_var_struct ** root
                             d_new->dimension.var = NULL;
                             d_new->dimension.attr = NULL;
                             d_new->dimension.rank = adios_get_dim_value (&d->dimension);
-                            d_new->dimension.time_index = d->dimension.time_index;
+                            d_new->dimension.is_time_index = d->dimension.is_time_index;
                             d_new->global_dimension.var = NULL;
                             d_new->global_dimension.attr = NULL;
                             d_new->global_dimension.rank = adios_get_dim_value (&d->global_dimension);
-                            d_new->global_dimension.time_index = d->global_dimension.time_index;
+                            d_new->global_dimension.is_time_index = d->global_dimension.is_time_index;
                             d_new->local_offset.var = NULL;
                             d_new->local_offset.attr = NULL;
                             d_new->local_offset.rank = adios_get_dim_value (&d->local_offset);
-                            d_new->local_offset.time_index = d->local_offset.time_index;
+                            d_new->local_offset.is_time_index = d->local_offset.is_time_index;
                             d_new->next = 0;
 
                             adios_append_dimension (&var_new->dimensions, d_new);
@@ -3240,7 +3371,7 @@ void adios_build_index_v1 (struct adios_file_struct * fd,
     g_item->next = 0;
 
     // build the groups and vars index
-    index_append_process_group_v1 (&index->pg_root, g_item);
+    index_append_process_group_v1 (index, g_item);
 
     while (v)
     {
@@ -3407,6 +3538,11 @@ void adios_build_index_v1 (struct adios_file_struct * fd,
 
                         break;
                     }
+                case adios_string_array:
+                    {
+                        adios_error (err_unspecified, "String arrays are not supported for variables %s:%s:%d\n",
+                                __FILE__,__func__, __LINE__);
+                    }
                 default:
                     {
                         adios_error (err_unspecified, "Reached unexpected branch in %s:%s:%d\n",
@@ -3417,7 +3553,7 @@ void adios_build_index_v1 (struct adios_file_struct * fd,
 
             // this fn will either take ownership for free
             log_debug ("build index var %s/%s\n", v_index->var_path, v_index->var_name);
-            index_append_var_v1 (index, v_index);
+            index_append_var_v1 (index, v_index, 0);
         }
 
         v = v->next;
@@ -3439,11 +3575,15 @@ void adios_build_index_v1 (struct adios_file_struct * fd,
             a_index->attr_name = (a->name ? strdup (a->name) : 0L);
             a_index->attr_path = (a->path ? strdup (a->path) : 0L);
             a_index->type = a->type;
+            a_index->nelems = a->nelems;
             a_index->characteristics_count = 1;
             a_index->characteristics_allocated = 1;
-            uint64_t size = adios_get_type_size (a->type, a->value);
+            uint64_t size = a_index->nelems * adios_get_type_size (a->type, a->value);
 
             a_index->characteristics [0].offset = a->write_offset;
+            /*FIXME: this below cannot be correct, calc includes the data size 
+                     itself and the payload offset should point to the beginning 
+                     of the actual data. ADIOS never accesses this data though */
             a_index->characteristics [0].payload_offset = a->write_offset + adios_calc_attribute_overhead_v1 (a);
             a_index->characteristics [0].file_index = fd->subfile_index;
             a_index->characteristics [0].time_index = 0;
@@ -3455,18 +3595,38 @@ void adios_build_index_v1 (struct adios_file_struct * fd,
             adios_transform_init_transform_characteristic(&a_index->characteristics[0].transform);
             //a_index->characteristics[0].transform_type = adios_transform_none;
 
+            a_index->characteristics [0].value = a->value;
+            /* Do not copy the attributes to index, since they don't change */
+            /*
             if (a->value)
             {
-                a_index->characteristics [0].value = malloc (size + 1);
-                ((char *) (a_index->characteristics [0].value)) [size] = 0;
+                if (a->type == adios_string) 
+                    size++;
+                a_index->characteristics [0].value = malloc (size);
+                if (a->type == adios_string) 
+                    ((char *) (a_index->characteristics [0].value)) [size] = 0;
                 memcpy (a_index->characteristics [0].value, a->value, size);
+
             }
             else
             {
                 a_index->characteristics [0].value = 0;
             }
-            a_index->characteristics [0].dims.count = 0;
-            a_index->characteristics [0].dims.dims = 0;
+            */
+
+            if (a_index->nelems > 1) {
+                // for array attributes, save nelems as a dimension characteristic
+                a_index->characteristics [0].dims.count = 1; // 1D array allowed only
+                a_index->characteristics [0].dims.dims = malloc (3*sizeof(uint64_t));
+                a_index->characteristics [0].dims.dims[0] = a_index->nelems; // "local dim"
+                a_index->characteristics [0].dims.dims[1] = a_index->nelems; // "global dim"
+                a_index->characteristics [0].dims.dims[2] = 0;               // "offset"
+            } else {
+                // old attributes up to version 1.8 never had dimensions
+                a_index->characteristics [0].dims.count = 0;
+                a_index->characteristics [0].dims.dims = 0;
+            }
+
             if (a->var)
                 a_index->characteristics [0].var_id = a->var->id;
             else
@@ -4106,9 +4266,33 @@ int adios_write_index_v1 (char ** buffer
             attr_size += 4;
             characteristic_set_length += 4;
 
-            size = adios_get_type_size (attrs_root->type
-                    ,attrs_root->characteristics [i].value
-                    );
+            if (attrs_root->characteristics [i].dims.count)
+            {
+                // add a dimensions characteristic
+                characteristic_set_count++;
+                flag = (uint8_t) adios_characteristic_dimensions;
+                buffer_write (buffer, buffer_size, buffer_offset, &flag, 1);
+                index_size += 1;
+                attr_size += 1;
+                characteristic_set_length += 1;
+
+                buffer_write (buffer, buffer_size, buffer_offset, 
+                              &attrs_root->characteristics [i].dims.count, 1);
+                index_size += 1;
+                attr_size += 1;
+                characteristic_set_length += 1;
+
+                len = 3 * sizeof(uint64_t) * attrs_root->characteristics [i].dims.count;
+                buffer_write (buffer, buffer_size, buffer_offset, &len, 2);
+                index_size += 2;
+                attr_size += 2;
+                characteristic_set_length += 2;
+                buffer_write (buffer, buffer_size, buffer_offset,
+                        attrs_root->characteristics [i].dims.dims, len);
+                index_size += len;
+                attr_size += len;
+                characteristic_set_length += len;
+            }
 
             if (attrs_root->characteristics [i].value != 0)
             {
@@ -4121,19 +4305,44 @@ int adios_write_index_v1 (char ** buffer
                 index_size += 1;
                 attr_size += 1;
                 characteristic_set_length += 1;
-                if (attrs_root->type == adios_string)
+
+                if (attrs_root->type == adios_string_array)
+                {
+
+                    // need to copy each string one by one
+                    // 16bit length + the strings without 0 in a continuous byte array
+                    char **v = attrs_root->characteristics [i].value;
+                    uint16_t len;
+                    int k;
+                    for (k=0; k < attrs_root->nelems; k++) {
+                        len = strlen (v[k]);
+                        buffer_write (buffer, buffer_size, buffer_offset, &len, 2);
+                        buffer_write (buffer, buffer_size, buffer_offset, v[k], len);
+                        index_size += len+2;
+                        attr_size += len+2;
+                        characteristic_set_length += len+2;
+                    }
+
+                } 
+                else 
                 {
-                    uint16_t len = (uint16_t) size;
+                    size = attrs_root->nelems * adios_get_type_size (
+                            attrs_root->type, attrs_root->characteristics [i].value);
+
+                    if (attrs_root->type == adios_string)
+                    {
+                        uint16_t len = (uint16_t) size;
+                        buffer_write (buffer, buffer_size, buffer_offset
+                                ,&len, 2
+                                );
+                        index_size += 2;
+                        attr_size += 2;
+                        characteristic_set_length += 2;
+                    }
                     buffer_write (buffer, buffer_size, buffer_offset
-                            ,&len, 2
+                            ,attrs_root->characteristics [i].value, size
                             );
-                    index_size += 2;
-                    attr_size += 2;
-                    characteristic_set_length += 2;
                 }
-                buffer_write (buffer, buffer_size, buffer_offset
-                        ,attrs_root->characteristics [i].value, size
-                        );
                 index_size += size;
                 attr_size += size;
                 characteristic_set_length += size;
@@ -4189,11 +4398,11 @@ int adios_write_index_v1 (char ** buffer
         unsigned char ver;
         snprintf (verstr, 25, "ADIOS-BP v%-14.14s", VERSION);
         buffer_write (buffer, buffer_size, buffer_offset, verstr, 24);
-        ver = VERSION_MAJOR;
+        ver = ADIOS_VERSION_MAJOR;
         buffer_write (buffer, buffer_size, buffer_offset, &ver, 1);
-        ver = VERSION_MINOR;
+        ver = ADIOS_VERSION_MINOR;
         buffer_write (buffer, buffer_size, buffer_offset, &ver, 1);
-        ver = VERSION_MICRO;
+        ver = ADIOS_VERSION_PATCH;
         buffer_write (buffer, buffer_size, buffer_offset, &ver, 1);
         ver = 0;
         buffer_write (buffer, buffer_size, buffer_offset, &ver, 1);
@@ -4268,7 +4477,7 @@ static uint16_t calc_dimension_size (struct adios_dimension_struct * dimension)
 
     if (    dimension->dimension.var == NULL
          && dimension->dimension.attr == NULL
-         && dimension->dimension.time_index == adios_flag_no
+         && dimension->dimension.is_time_index == adios_flag_no
        )  // it is a number
     {
         size += 8;  // size of value
@@ -4282,7 +4491,7 @@ static uint16_t calc_dimension_size (struct adios_dimension_struct * dimension)
 
     if (    dimension->global_dimension.var == NULL
          && dimension->global_dimension.attr == NULL
-         && dimension->global_dimension.time_index == adios_flag_no
+         && dimension->global_dimension.is_time_index == adios_flag_no
        )  // it is a number
     {
         size += 8; // default to a rank
@@ -4296,7 +4505,7 @@ static uint16_t calc_dimension_size (struct adios_dimension_struct * dimension)
 
     if (    dimension->local_offset.var == NULL
          && dimension->local_offset.var == NULL
-         && dimension->local_offset.time_index == adios_flag_no
+         && dimension->local_offset.is_time_index == adios_flag_no
        )  // it is a number
     {
         size += 8;  // default to a rank
@@ -4334,7 +4543,7 @@ uint64_t adios_write_dimension_v1 (struct adios_file_struct * fd
 
     if (    dimension->dimension.var == NULL
          && dimension->dimension.attr == NULL
-         && dimension->dimension.time_index == adios_flag_no
+         && dimension->dimension.is_time_index == adios_flag_no
        )
     {
         var = 'n';
@@ -4362,7 +4571,7 @@ uint64_t adios_write_dimension_v1 (struct adios_file_struct * fd
 
     if (    dimension->global_dimension.var == NULL
          && dimension->global_dimension.attr == NULL
-         && dimension->global_dimension.time_index == adios_flag_no
+         && dimension->global_dimension.is_time_index == adios_flag_no
        )
     {
         var = 'n';
@@ -4390,7 +4599,7 @@ uint64_t adios_write_dimension_v1 (struct adios_file_struct * fd
 
     if (    dimension->local_offset.var == NULL
          && dimension->local_offset.attr == NULL
-         && dimension->local_offset.time_index == adios_flag_no
+         && dimension->local_offset.is_time_index == adios_flag_no
        )
     {
         var = 'n';
@@ -4842,7 +5051,7 @@ int adios_generate_var_characteristics_v1 (struct adios_file_struct * fd, struct
         {
             int i, j, c, count = 3;
             struct adios_stat_struct ** stats = var->stats;
-            float * data = var->data;
+            const float * data = var->data;
             i = j = 0;
 
             while (var->bitmap >> j) {
@@ -4971,7 +5180,7 @@ int adios_generate_var_characteristics_v1 (struct adios_file_struct * fd, struct
         {
             int i, j, c, count = 3;
             struct adios_stat_struct ** stats = var->stats;
-            double * data = var->data;
+            const double * data = var->data;
             i = j = 0;
 
             while (var->bitmap >> j) {
@@ -5234,14 +5443,36 @@ int adios_write_attribute_v1 (struct adios_file_struct * fd
         buffer_write (&fd->buffer, &fd->buffer_size, &fd->offset, &flag, 1);
         size += 1;
 
-        uint32_t t = adios_get_type_size (a->type, a->value);
-        buffer_write (&fd->buffer, &fd->buffer_size, &fd->offset, &t, 4);
-        size += 4;
+        if (a->type == adios_string_array)
+        {
+            buffer_write (&fd->buffer, &fd->buffer_size, &fd->offset, &a->nelems, 4);
+            size += 4;
+            uint32_t t = a->data_size + 5*a->nelems;
+            /* t = for all strings, sum of 
+                   length of string + terminating 0 + 16bit length info */
+            char ** v = (char**) a->value;
+            int k;
+            uint32_t len;
+            for (k=0; k<a->nelems; k++) {
+                len = strlen (v[k])+1; // include the terminating 0
+                buffer_write (&fd->buffer, &fd->buffer_size, &fd->offset, &len, 4);
+                buffer_write (&fd->buffer, &fd->buffer_size, &fd->offset, v[k], len);
+                size += len+4;
+            }
 
-        buffer_write (&fd->buffer, &fd->buffer_size, &fd->offset
-                ,a->value, t
-                );
-        size += t;
+        }
+        else 
+        {
+            uint32_t t = a->nelems * adios_get_type_size (a->type, a->value);
+            buffer_write (&fd->buffer, &fd->buffer_size, &fd->offset, &t, 4);
+            size += 4;
+
+            // terminating 0 of a string is not written here!
+            buffer_write (&fd->buffer, &fd->buffer_size, &fd->offset
+                    ,a->value, t
+                    );
+            size += t;
+        }
     }
 
     // put in the size we have put in for this attribute
@@ -5309,41 +5540,41 @@ int adios_write_close_attributes_v1 (struct adios_file_struct * fd)
 int adios_multiply_dimensions (uint64_t * size
         ,struct adios_var_struct * var
         ,enum ADIOS_DATATYPES type
-        ,void * data
+        ,const void * data
         )
 {
     switch (type)
     {
         case adios_unsigned_byte:
-            *size *= (*(uint8_t *) data);
+            *size *= (*(const uint8_t *) data);
             return 1;
 
         case adios_byte:
-            *size *= (*(int8_t *) data);
+            *size *= (*(const int8_t *) data);
             return 1;
 
         case adios_unsigned_short:
-            *size *= (*(uint16_t *) data);
+            *size *= (*(const uint16_t *) data);
             return 1;
 
         case adios_short:
-            *size *= (*(int16_t *) data);
+            *size *= (*(const int16_t *) data);
             return 1;
 
         case adios_unsigned_integer:
-            *size *= (*(uint32_t *) data);
+            *size *= (*(const uint32_t *) data);
             return 1;
 
         case adios_integer:
-            *size *= (*(int32_t *) data);
+            *size *= (*(const int32_t *) data);
             return 1;
 
         case adios_unsigned_long:
-            *size *= (*(uint64_t *) data);
+            *size *= (*(const uint64_t *) data);
             return 1;
 
         case adios_long:
-            *size *= (*(int64_t *) data);
+            *size *= (*(const int64_t *) data);
             return 1;
 
         default:
@@ -5432,7 +5663,7 @@ uint64_t adios_get_dimension_space_size (struct adios_var_struct *var
         }
         else
         {
-            if (d->dimension.time_index == adios_flag_no)
+            if (d->dimension.is_time_index == adios_flag_no)
             {
                 size *= d->dimension.rank;
             }
@@ -5446,7 +5677,7 @@ uint64_t adios_get_dimension_space_size (struct adios_var_struct *var
 }
 
 // NCSU ALACRITY-ADIOS: Refactored to call the above dimension space compute code
-uint64_t adios_get_var_size (struct adios_var_struct * var, void * data)
+uint64_t adios_get_var_size (struct adios_var_struct * var, const void * data)
 {
     uint64_t size = adios_get_type_size (var->type, data);
     if (var->dimensions)
@@ -5474,6 +5705,7 @@ const char * adios_type_to_string_int (int type)
         case adios_long_double:      return "long double";
 
         case adios_string:           return "string";
+        case adios_string_array:     return "string array";
         case adios_complex:          return "complex";
         case adios_double_complex:   return "double complex";
 
@@ -6299,12 +6531,9 @@ void adios_conca_mesh_att_nam(char ** returnstr, const char * meshname, char * a
 }
 
 // concat link attribute name strings
-void adios_conca_link_att_nam(char ** returnstr, const char * name, char * att_nam) {
+void adios_conca_link_att_nam(char ** returnstr, const char * name, char * att_nam, char counterstr[5]) {
     int slength = 0;
-    slength = strlen("adios_link/")+1;
-    slength = slength + strlen(name);
-    slength = slength + 1;
-    slength = slength + strlen(att_nam);
+    slength = strlen("adios_link/") + strlen(name) + strlen(att_nam) + strlen(counterstr) + 2;
 
     *returnstr = malloc (slength);
 
@@ -6312,6 +6541,7 @@ void adios_conca_link_att_nam(char ** returnstr, const char * name, char * att_n
     strcat(*returnstr,name);
     strcat(*returnstr,"/");
     strcat(*returnstr,att_nam);
+    strcat(*returnstr,counterstr);
 }
 
 // concat var attribute name strings
diff --git a/src/core/adios_internals.h b/src/core/adios_internals.h
index b15bf30..e38faad 100644
--- a/src/core/adios_internals.h
+++ b/src/core/adios_internals.h
@@ -63,7 +63,8 @@ struct adios_var_struct
     uint64_t write_offset;  // offset this var was written at  [for writes]
 
     enum ADIOS_FLAG free_data;    // primarily used for writing
-    void * data;                  // primarily used for reading
+    const void * data;           // user data pointer 
+    void * adata;                // data field if allocated inside adios (then, data->adata)
     uint64_t data_size;           // primarily used for reading
     uint32_t write_count; // added to support multiple writes for transform layer.
                           // Might needed for other things in the future.
@@ -100,10 +101,13 @@ struct adios_attribute_struct
     char * name;
     char * path;
     enum ADIOS_DATATYPES type;
+    int    nelems; // number of elements of 'type' in the attribute
     void * value;
     struct adios_var_struct * var;
     uint64_t write_offset;  // offset this var was written at  [for writes]
 
+    uint32_t data_size; // data size for an array of strings (type==adios_string_array)
+
     struct adios_attribute_struct * next;
 };
 
@@ -204,7 +208,7 @@ struct adios_dimension_item_struct
     uint64_t rank;                 // for numerical value
     struct adios_var_struct * var; // for value stored in variable
     struct adios_attribute_struct * attr; // for value stored in attribute
-    enum ADIOS_FLAG time_index;
+    enum ADIOS_FLAG is_time_index;
 };
 
 struct adios_dimension_struct
@@ -323,7 +327,7 @@ typedef enum ADIOS_FLAG (* ADIOS_SHOULD_BUFFER_FN)
                                        );
 typedef void (* ADIOS_WRITE_FN) (struct adios_file_struct * fd
                                 ,struct adios_var_struct * v
-                                ,void * data
+                                ,const void * data
                                 ,struct adios_method_struct * method
                                 );
 typedef void (* ADIOS_GET_WRITE_BUFFER_FN) (struct adios_file_struct * fd
@@ -435,7 +439,8 @@ int adios_common_define_attribute (int64_t group, const char * name
 int adios_common_define_attribute_byvalue (int64_t group, const char * name
                                   ,const char * path
                                   ,enum ADIOS_DATATYPES type
-                                  ,void * value
+                                  ,int nelems
+                                  ,void * values
                                   );
 
 void adios_append_method (struct adios_method_struct * method);
@@ -461,7 +466,7 @@ int adios_common_declare_group (int64_t * id, const char * name
                                ,enum ADIOS_FLAG host_language_fortran
                                ,const char * coordination_comm
                                ,const char * coordination_var
-                               ,const char * time_index
+                               ,const char * time_index_name
                                ,enum ADIOS_FLAG stats
                                );
 
@@ -550,26 +555,40 @@ void adios_merge_index_v1 (
                   ,struct adios_index_process_group_struct_v1 * new_pg_root
                   ,struct adios_index_var_struct_v1 * new_vars_root
                   ,struct adios_index_attribute_struct_v1 * new_attrs_root
+                  ,int needs_sorting // merge-sort the characteristics to keep the time in order
                   );
 
+/* obsolete, merge the index with sorting
 void adios_sort_index_v1 (struct adios_index_process_group_struct_v1 ** p1
                          ,struct adios_index_var_struct_v1 ** v1
                          ,struct adios_index_attribute_struct_v1 ** a1
                          );
+*/
  
 void adios_clear_index_v1 (struct adios_index_struct_v1 * index); // in each adios_<method>_close()
 void adios_free_index_v1 (struct adios_index_struct_v1 * index);  // in adios_<method>_finalize()
 
+/* Other index operations made visible for the recovery tool */
+void index_append_process_group_v1 ( 
+            struct adios_index_struct_v1 * index, 
+            struct adios_index_process_group_struct_v1 * item
+            );
+void index_append_var_v1 (
+        struct adios_index_struct_v1 *index,
+        struct adios_index_var_struct_v1 * item,
+        int do_sort
+        );
+
 int adios_parse_scalar_string (enum ADIOS_DATATYPES type, char * value, void ** out);
 
 // NCSU ALACRITY-ADIOS - This function was static, but is now needed in adios_transforms_*.c
 uint8_t count_dimensions (const struct adios_dimension_struct * dimensions);
 
-uint64_t adios_get_type_size (enum ADIOS_DATATYPES type, void * var);
+uint64_t adios_get_type_size (enum ADIOS_DATATYPES type, const void * var);
 // NCSU ALACRITY-ADIOS - added this for use in the transform layer
 uint64_t adios_get_dimension_space_size (struct adios_var_struct * var
                                         ,struct adios_dimension_struct * d);
-uint64_t adios_get_var_size (struct adios_var_struct * var, void * data);
+uint64_t adios_get_var_size (struct adios_var_struct * var, const void * data);
 uint64_t adios_get_dim_value (struct adios_dimension_item_struct * dimension);
 uint64_t adios_get_stat_size (void * data, enum ADIOS_DATATYPES type, enum ADIOS_STAT stat_id);
 uint8_t adios_get_stat_set_count (enum ADIOS_DATATYPES type);
diff --git a/src/core/adios_internals_mxml.c b/src/core/adios_internals_mxml.c
index 5dd42cd..19da816 100644
--- a/src/core/adios_internals_mxml.c
+++ b/src/core/adios_internals_mxml.c
@@ -1694,65 +1694,114 @@ static int parseGroup (mxml_node_t * node, char * schema_version)
                     free (meshtime);
                     free (meshfile);
                     free (meshgroup);
-                } else if (!strcasecmp (n->value.element.name, "link"))
+                } else if (!strcasecmp (n->value.element.name, "multilink"))
                 {
-                    const char * ref;
-                    const char * type;
-                    const char * objref;
-                    const char * extref;
-                    // Get the var name
-                    ref = mxmlElementGetAttr (n, "ref");
-                    // Get the ref type
-                    type = mxmlElementGetAttr (n, "type");
-                    // Get the ref var name in external file
-                    objref = mxmlElementGetAttr(n, "objref");
-                    // Get the ref link
-                    extref = mxmlElementGetAttr(n, "extref");
-                    if (!ref)
-                        ref = ""; 
-                    if (!type)
-                        type = "var";
-                    if (!objref)
-                        objref = "";
-                    if (!extref)
-                        extref = "";
-                        
-                    const char * linkvar = 0;
-                    const char * linktype = 0;
-                    const char * linkobjref = 0;
-                    const char * linkextref = 0;
-
-                    if ( ref[0]=='\0' && objref[0]=='\0' )
-                    {
-                        log_warn ("config.xml: invalid var link, "
-                                "requires either ref OR objref.\n"
-                                );
-                        return 0;
-                    }
-                    else if ( ref[0]=='\0')
-                        ref = objref; //strcpy (ref, objref);
-                     
-                    if (ref)
-                    {
-                        adios_conca_link_att_nam (&linkvar, ref, "ref");
-                        adios_common_define_attribute (ptr_new_group, linkvar, "/",adios_string, ref, "");
-                    }
-                    if (objref)
-                    {
-                        adios_conca_link_att_nam (&linkobjref, ref, "objref");
-                        adios_common_define_attribute (ptr_new_group, linkobjref, "/",adios_string, objref,  "");
-                    }
-                    if (type)
-                    {
-                        adios_conca_link_att_nam (&linktype, ref, "type");
-                        adios_common_define_attribute (ptr_new_group, linktype, "/",adios_string, type,  "");
-                    }
-                    if (extref)
+                    mxml_node_t * n1;   // uesed for multilink
+                    char * ref_prev = "";
+                    char * link_num = 0;
+                    int ref_num = 0;
+                    char tmp_num[5];
+
+                    for (n1 = mxmlWalkNext (n, n, MXML_DESCEND)
+                        ;n1
+                        ;n1 = mxmlWalkNext (n1, n, MXML_DESCEND)
+                    )
                     {
-                        adios_conca_link_att_nam (&linkextref, ref, "extref");
-                        adios_common_define_attribute (ptr_new_group, linkextref, "/",adios_string, extref,  "");
-                    }
+                        if (n1->type != MXML_ELEMENT)
+                        {
+                            continue;
+                        }
+                        if (!strcasecmp (n1->value.element.name, "link"))
+                        {
+                            const char * ref = 0;
+                            const char * type = 0;
+                            const char * objref = 0;
+                            const char * extref = 0;
+                            for (i = 0; i < n1->value.element.num_attrs; i++)
+                            {
+                                mxml_attr_t * attr = &n1->value.element.attrs [i];
+
+                                GET_ATTR("ref",attr,ref,"link")
+                                GET_ATTR("type",attr,type,"link")
+                                GET_ATTR("objref",attr,objref,"link")
+                                GET_ATTR("extref",attr,extref,"link")
+                            }
+                            if (!ref)
+                                ref = "";
+                            if (!type)
+                                type = "var";
+                            if (!objref)
+                                objref = "";
+                            if (!extref)
+                                extref = "";
+//TODO 
+                            char * linkvar = 0;
+                            char * linktype = 0;
+                            char * linkobjref = 0;
+                            char * linkextref = 0;
+
+                            if ( ref[0]=='\0' && objref[0]=='\0' )
+                            {
+                                log_warn ("config.xml: invalid var link, "
+                                          "requires either ref OR objref.\n");
+                                return 0;
+                            }
+                            else if ( ref[0]=='\0')
+                                ref = strdup (objref);
 
+                            if (ref_num == 0 && ref[0]!='\0')
+                            {
+                                ref_prev = strdup (ref);
+                                ref_num++;
+                            }
+                            else
+                            {
+                                int res_cmp = strcmp (ref_prev, ref);
+                                if (res_cmp == 0)
+                                    ref_num++;
+                                else
+                                {
+                                    adios_conca_link_att_nam (&link_num, ref_prev, "ref", "-num");
+                                    snprintf(tmp_num, 5, "%d",ref_num);
+                                    adios_common_define_attribute (ptr_new_group, link_num, "/",adios_integer, tmp_num, "");
+                                    link_num = 0;
+                                    tmp_num[0] = '\0';
+                                    ref_num = 0;
+                                }
+                                if (ref_num == 0 && ref[0]!='\0')
+                                {
+                                    ref_prev = strdup (ref);
+                                    ref_num++;
+                                }
+                            }
+                            snprintf(tmp_num, 5, "%d",ref_num-1);
+                            if (ref)
+                            {
+                                adios_conca_link_att_nam (&linkvar, ref, "ref", tmp_num);
+                                adios_common_define_attribute (ptr_new_group, linkvar, "/",adios_string, ref, "");
+                            }
+                            if (objref)
+                            {
+                                adios_conca_link_att_nam (&linkobjref, ref, "objref", tmp_num);
+                                adios_common_define_attribute (ptr_new_group, linkobjref, "/",adios_string, objref,  "");
+                            }
+                            if (type)
+                            {
+                                adios_conca_link_att_nam (&linktype, ref, "type", tmp_num);
+                                adios_common_define_attribute (ptr_new_group, linktype, "/",adios_string, type,  "");
+                            }
+                            if (extref)
+                            {
+                                adios_conca_link_att_nam (&linkextref, ref, "extref", tmp_num);
+                                adios_common_define_attribute (ptr_new_group, linkextref, "/",adios_string, extref,  "");
+                            }
+                            tmp_num[0] = '\0';
+                        }
+                    }
+                    adios_conca_link_att_nam (&link_num, ref_prev, "ref", "-num");
+                    snprintf(tmp_num, 5, "%d",ref_num);
+                    adios_common_define_attribute (ptr_new_group, link_num, "/",adios_integer, tmp_num, "");
+                    ref_num = 0;
                 } else if (!strcasecmp (n->value.element.name, "gwrite"))
                 {
                     const char * src = 0;
@@ -2674,8 +2723,8 @@ void adios_cleanup ()
             // NCSU ALACRITY-ADIOS - Clean transform metadata
             adios_transform_clear_transform_var(adios_groups->group->vars);
 
-            if (adios_groups->group->vars->data)
-                free (adios_groups->group->vars->data);
+            if (adios_groups->group->vars->adata)
+                free (adios_groups->group->vars->adata);
 
             free (adios_groups->group->vars);
             adios_groups->group->vars = vars;
diff --git a/src/core/adios_logger.h b/src/core/adios_logger.h
index 69af559..e7fe818 100644
--- a/src/core/adios_logger.h
+++ b/src/core/adios_logger.h
@@ -38,4 +38,12 @@ void adios_logger_close();
 #define log_info_cont(...) adios_logger(3, 0, __VA_ARGS__)
 #define log_debug_cont(...) adios_logger(4, 0, __VA_ARGS__)
 
+/* Simple printf for programs in the test suite, that log into separate 
+ * files per process 
+ */ 
+#define  log_test(...) { \
+    if (!adios_logf) adios_logf=stderr; \
+    fprintf (adios_logf, __VA_ARGS__); \
+}
+
 #endif
diff --git a/src/core/adios_read.c b/src/core/adios_read.c
index 3d155bc..ac91f18 100644
--- a/src/core/adios_read.c
+++ b/src/core/adios_read.c
@@ -98,6 +98,16 @@ int adios_complete_meshinfo (ADIOS_FILE *datafile, ADIOS_FILE *meshfile, ADIOS_M
     return common_read_complete_meshinfo (datafile, meshfile, meshinfo);
 }
 
+ADIOS_LINK * adios_inq_link_byid (ADIOS_FILE *fp, int linkid)
+{
+    return common_read_inq_link_byid (fp, linkid);
+}
+
+void adios_free_linkinfo (ADIOS_LINK * linkinfo)
+{
+    common_read_free_linkinfo (linkinfo);
+}
+
 void adios_free_meshinfo (ADIOS_MESH *meshinfo)
 {
     common_read_free_meshinfo (meshinfo);
diff --git a/src/core/adios_read_hooks.c b/src/core/adios_read_hooks.c
index 8cbb1f1..a6d7b97 100644
--- a/src/core/adios_read_hooks.c
+++ b/src/core/adios_read_hooks.c
@@ -53,19 +53,20 @@ void adios_read_hooks_init (struct adios_read_hooks_struct ** t)
 #ifndef __MPI_DUMMY_H__
         ASSIGN_FNS(bp_staged,ADIOS_READ_METHOD_BP_AGGREGATE)
 #endif
-#if HAVE_DATASPACES
+
+#ifndef _NOMPI
+#  if HAVE_DATASPACES
         ASSIGN_FNS(dataspaces,ADIOS_READ_METHOD_DATASPACES)
-#endif
+#  endif
 
-#if HAVE_DIMES
+#  if HAVE_DIMES
         ASSIGN_FNS(dimes,ADIOS_READ_METHOD_DIMES)
+#  endif
 #endif
 
-#  ifndef _NOMPI
-#if HAVE_FLEXPATH
+#  if HAVE_FLEXPATH
        ASSIGN_FNS(flexpath, ADIOS_READ_METHOD_FLEXPATH);
-#endif
-#endif
+#  endif
 
 #if HAVE_ICEE
        ASSIGN_FNS(icee, ADIOS_READ_METHOD_ICEE);
diff --git a/src/core/adios_transport_hooks.c b/src/core/adios_transport_hooks.c
index 1eb3588..efca3d7 100644
--- a/src/core/adios_transport_hooks.c
+++ b/src/core/adios_transport_hooks.c
@@ -90,8 +90,17 @@ void adios_init_transports (struct adios_transport_struct ** t)
     ASSIGN_FNS(nssi_filter,ADIOS_METHOD_NSSI_FILTER,"NSSI_FILTER")
 #    endif
 
+#    if HAVE_DATASPACES
+    ASSIGN_FNS(dataspaces,ADIOS_METHOD_DATASPACES,"DATASPACES")
+#    endif
+
+#    if HAVE_DIMES
+    ASSIGN_FNS(dimes,ADIOS_METHOD_DIMES,"DIMES")
+#    endif
+
 #  endif /* _NOMPI */
 
+
 #  if HAVE_DATATAP
     ASSIGN_FNS(datatap,ADIOS_METHOD_DATATAP,"DATATAP")
 #  endif
@@ -106,14 +115,6 @@ void adios_init_transports (struct adios_transport_struct ** t)
     ASSIGN_FNS(posix,ADIOS_METHOD_POSIX,"POSIX")
     ASSIGN_FNS(posix1,ADIOS_METHOD_POSIX1,"POSIX1")
 
-#  if HAVE_DATASPACES
-    ASSIGN_FNS(dataspaces,ADIOS_METHOD_DATASPACES,"DATASPACES")
-#  endif
-
-#  if HAVE_DIMES
-    ASSIGN_FNS(dimes,ADIOS_METHOD_DIMES,"DIMES")
-#  endif
-
 #  ifndef NO_RESEARCH_TRANSPORTS
     //ASSIGN_FNS(provenance,ADIOS_METHOD_PROVENANCE)
 #  endif
diff --git a/src/core/adios_transport_hooks.h b/src/core/adios_transport_hooks.h
index 8161dc5..929c8b5 100644
--- a/src/core/adios_transport_hooks.h
+++ b/src/core/adios_transport_hooks.h
@@ -26,7 +26,7 @@ enum ADIOS_FLAG adios_##a##_should_buffer (struct adios_file_struct * fd \
                                           ) {return 0;} \
 void adios_##a##_write (struct adios_file_struct * fd \
                        ,struct adios_var_struct * v \
-                       ,void * data \
+                       ,const void * data \
                        ,struct adios_method_struct * method \
                        ) {} \
 void adios_##a##_get_write_buffer (struct adios_file_struct * fd \
@@ -61,7 +61,7 @@ enum ADIOS_FLAG adios_##a##_should_buffer (struct adios_file_struct * fd \
                                           ); \
 void adios_##a##_write (struct adios_file_struct * fd \
                        ,struct adios_var_struct * v \
-                       ,void * data \
+                       ,const void * data \
                        ,struct adios_method_struct * method \
                        ); \
 void adios_##a##_get_write_buffer (struct adios_file_struct * fd \
diff --git a/src/core/adiosf.c b/src/core/adiosf.c
index b73a66b..d062186 100644
--- a/src/core/adiosf.c
+++ b/src/core/adiosf.c
@@ -238,10 +238,10 @@ void FC_FUNC_(adios_write, ADIOS_WRITE)
     }
     */
 
-    if (v->data)
+    if (v->adata)
     {
-        free (v->data);
-        v->data = 0;
+        free (v->adata);
+        v->adata = 0;
     }
 
     // Q.L. 10-2010. To fix a memory leak problem.
@@ -305,8 +305,8 @@ void FC_FUNC_(adios_write, ADIOS_WRITE)
             case adios_long_double:
             case adios_complex:
             case adios_double_complex:
-                v->data = malloc (element_size);
-                if (!v->data)
+                v->adata = malloc (element_size);
+                if (!v->adata)
                 {
                     adios_error (err_no_memory, 
                                  "In adios_write, cannot allocate %lld bytes to copy scalar %s\n",
@@ -316,11 +316,12 @@ void FC_FUNC_(adios_write, ADIOS_WRITE)
                     return;
                 }
 
-                memcpy ((char *) v->data, var, element_size);
+                memcpy ((char *) v->adata, var, element_size);
+                v->data = v->adata;
                 break;
             case adios_string:
-                v->data = futils_fstr_to_cstr (var, var_size);
-                if (!v->data)
+                v->adata = futils_fstr_to_cstr (var, var_size);
+                if (!v->adata)
                 {
                     adios_error (err_no_memory, 
                                  "In adios_write, cannot allocate %lld bytes to copy string %s\n",
@@ -329,6 +330,7 @@ void FC_FUNC_(adios_write, ADIOS_WRITE)
                     free (buf1);
                     return;
                 }
+                v->data = v->adata;
                 break;
 
             default:
@@ -338,7 +340,7 @@ void FC_FUNC_(adios_write, ADIOS_WRITE)
     }
 
     *err = common_adios_write (fd, v, var);
-    if (fd->mode == adios_mode_write || fd->mode == adios_mode_append)
+    if (fd->mode != adios_mode_read)
     {
         adios_copy_var_written (fd->group, v);
     }
@@ -614,6 +616,96 @@ void FC_FUNC_(adios_define_attribute, ADIOS_DEFINE_ATTRIBUTE)
     *err = adios_errno;
 }
 
+void FC_FUNC_(adios_define_attribute_byvalue, ADIOS_DEFINE_ATTRIBUTE_BYVALUE) 
+    (int64_t * group, const char * name, const char * path, int * type, int * nelems, 
+     void * values, int * err, int name_size, int path_size)
+{
+    char * buf1 = 0;
+    char * buf2 = 0;
+
+    adios_errno = err_no_error;
+    buf1 = futils_fstr_to_cstr (name, name_size);
+    buf2 = futils_fstr_to_cstr (path, path_size);
+
+    if (buf1 != 0 && buf2 != 0) {
+        adios_common_define_attribute_byvalue (*group, buf1, buf2
+                                      ,(enum ADIOS_DATATYPES) *type, *nelems, values);
+        free (buf1);
+        free (buf2);
+    }
+    *err = adios_errno;
+}
+
+/* Name clash resolution: Fortran adios_define_attribute_byvalue is an interface, and its 
+   subroutines cannot call adios_define_attribute_byvalue() in this file directly because 
+   the Fortran compiler interprets it as the call to the interface name. 
+   adios_define_attribute_byvalue_f2c provides the bridge to link the C function with
+   the subroutines. 
+*/
+void FC_FUNC_(adios_define_attribute_byvalue_f2c, ADIOS_DEFINE_ATTRIBUTE_BYVALUE_F2C) 
+    (int64_t * group, const char * name, const char * path, int * type, int * nelems, 
+     void * values, int * err, int name_size, int path_size)
+{
+    FC_FUNC_(adios_define_attribute_byvalue, ADIOS_DEFINE_ATTRIBUTE_BYVALUE) 
+         (group, name, path, type, nelems, values, err, name_size, path_size);
+}
+
+void FC_FUNC_(adios_define_attribute_byvalue_string, ADIOS_DEFINE_ATTRIBUTE_BYVALUE_STRING) 
+    (int64_t * group, const char * name, const char * path, int * nelems, 
+     char * values, int * err, int name_size, int path_size, int values_size)
+{
+    char * valuestr = futils_fstr_to_cstr (values, values_size);
+    int type = adios_string;
+
+    if (valuestr != 0 && *nelems == 1) {
+        FC_FUNC_(adios_define_attribute_byvalue, ADIOS_DEFINE_ATTRIBUTE_BYVALUE) 
+             (group, name, path, &type, nelems, valuestr, err, name_size, path_size);
+        free (valuestr);
+    } else {
+        if (*nelems != 1) {
+            adios_error (err_corrupted_attribute, 
+                    "String attributes can only store a single string. "
+                    "For multiple strings (nelems>1), use adios_string_array type\n");
+        } else {
+            adios_error (err_corrupted_attribute, 
+                    "adios_define_attribute_byvalue(string) called with a string "
+                    "that could not be processed in the C library\n");
+        }
+        *err = adios_errno;
+    }
+}
+
+void FC_FUNC_(adios_define_attribute_byvalue_string_array, ADIOS_DEFINE_ATTRIBUTE_BYVALUE_STRING_ARRAY) 
+    (int64_t * group, const char * name, const char * path, int * nelems, 
+     char * values, int * string_size, int * err, int name_size, int path_size, int values_size)
+{
+    /* *string_size = the size of each string in the string array,
+                      = i.e. XXX in  "character(len=XXX), dimension (YYY) :: values"
+       Probably with all compilers, or most, it is also true that values_size = *string_size.
+       'values'  here in the C code is a single byte array storing the strings contiguously 
+    */
+    int k;
+    int type = adios_string_array;
+
+    //printf ("C String Array: nelems=%d, size=%d\n", *nelems, *string_size);
+    char ** strings = (char**) malloc (*nelems * sizeof (char*));
+    char *p = values;
+    if (strings != 0) {
+        for (k=0; k < *nelems; k++) {
+            //printf ("  k=%d, ptr=%p size=%d\n", k, p, *string_size);
+            strings[k] = futils_fstr_to_cstr (p, *string_size);
+            p += *string_size;
+        }
+
+        FC_FUNC_(adios_define_attribute_byvalue, ADIOS_DEFINE_ATTRIBUTE_BYVALUE) 
+             (group, name, path, &type, nelems, strings, err, name_size, path_size);
+        free (strings);
+    } else {
+        adios_error (err_corrupted_attribute, "adios_define_attribute_byvalue(string) called with a string that could not be processed in the C library\n");
+        *err = adios_errno;
+    }
+}
+
 // delete all attribute definitions from a group
 // Use if you want to define a new set of attribute for the next output step.
 void FC_FUNC_(adios_delete_attrdefs, ADIOS_DELETE_VARDEFS) (int64_t *id, int *err)
diff --git a/src/core/adiosf_defs_mod.f90 b/src/core/adiosf_defs_mod.f90
index 67cd40e..39d8461 100644
--- a/src/core/adiosf_defs_mod.f90
+++ b/src/core/adiosf_defs_mod.f90
@@ -31,6 +31,8 @@ module adios_defs_mod
     integer, parameter :: adios_long_double = 7          ! (16) 
     integer, parameter :: adios_string = 9               ! C strings
     integer, parameter :: adios_complex = 10             ! (8) 
+    integer, parameter :: adios_double_complex = 11      ! (16) 
+    integer, parameter :: adios_string_array = 9         ! array of C strings
 
 
     !
diff --git a/src/core/adiosf_write_mod.f90 b/src/core/adiosf_write_mod.f90
index 47d3aae..ec979ef 100644
--- a/src/core/adiosf_write_mod.f90
+++ b/src/core/adiosf_write_mod.f90
@@ -605,16 +605,40 @@ module adios_write_mod
         module procedure adios_read_logical4_d6
         module procedure adios_read_logical8_d6
     end interface
-    contains
+
 
     !
     !
-    ! ADIOS_WRITE generic interface
+    ! ADIOS_DEFINE_ATTRIBUTE_BYVALUE generic interface
     !
-    ! Usage: call adios_write (fd, varname, data, err)
+    ! Usage: call adios_define_attrribute_byvalue (group_id, attrname, path, nelems, values, err)
     !
     !
-        !
+    interface adios_define_attribute_byvalue
+        module procedure adios_define_attribute_byvalue_int1_d0
+        module procedure adios_define_attribute_byvalue_int2_d0
+        module procedure adios_define_attribute_byvalue_int4_d0
+        module procedure adios_define_attribute_byvalue_int8_d0
+        module procedure adios_define_attribute_byvalue_real4_d0
+        module procedure adios_define_attribute_byvalue_real8_d0
+        module procedure adios_define_attribute_byvalue_complex8_d0
+        module procedure adios_define_attribute_byvalue_complex16_d0
+
+        module procedure adios_define_attribute_byvalue_char_d1
+        module procedure adios_define_attribute_byvalue_int1_d1
+        module procedure adios_define_attribute_byvalue_int2_d1
+        module procedure adios_define_attribute_byvalue_int4_d1
+        module procedure adios_define_attribute_byvalue_int8_d1
+        module procedure adios_define_attribute_byvalue_real4_d1
+        module procedure adios_define_attribute_byvalue_real8_d1
+        module procedure adios_define_attribute_byvalue_complex8_d1
+        module procedure adios_define_attribute_byvalue_complex16_d1
+        module procedure adios_define_attribute_byvalue_char_d2
+    end interface
+
+
+    contains
+
     !
     ! ADIOS_WRITE generic interface
     !
@@ -3826,5 +3850,263 @@ module adios_write_mod
 
     ! end of ADIOS_READ functions
 
+    !
+    !
+    ! ADIOS_DEFINE_ATTRIBUTE_BYVALUE generic interface
+    !
+    ! Usage: call adios_define_attrribute_byvalue (group_id, attrname, path, nelems, values, err)
+    !
+    !
+        ! Special case: CHARACTER*1 array
+        ! This calls a different function to keep the string length information within
+        subroutine adios_define_attribute_byvalue_char_d1 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            character(*),   intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_string (group_id, attrname, path, nelems, values, err)
+        end subroutine
+
+        ! Special case: CHARACTER*2 array
+        ! This calls a different function to keep the string length information within
+        subroutine adios_define_attribute_byvalue_char_d2 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            character(*), dimension(:), intent(in)  :: values
+            integer,        intent(out) :: err
+
+            !character(*) :: v1
+            !v1 = values(1)
+
+            if (nelems <= size(values)) then
+                !write (*,'("String Array: dims = ",i4, "string size=",i4)')  size(values,1), len(values)
+                !write (*,*)  shape(values)
+                call adios_define_attribute_byvalue_string_array (group_id, attrname, path, nelems, &
+                                                                  values, len(values), err)
+            else
+                write (*,'("ADIOS Attribute definition error: ",a,"/",a," string array size =",i4," nelems = ",i4)') &
+                    path, attrname, size(values), nelems
+            endif
+        end subroutine
+
+        ! INTEGER*1 scalar
+        subroutine adios_define_attribute_byvalue_int1_d0 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            integer*1,      intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_double_complex, adios_byte, values, err)
+        end subroutine
+
+        ! INTEGER*2 scalar
+        subroutine adios_define_attribute_byvalue_int2_d0 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            integer*2,      intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_short, nelems, values, err)
+        end subroutine
+
+
+        ! INTEGER*4 scalar
+        subroutine adios_define_attribute_byvalue_int4_d0 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            integer*4,      intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_integer, nelems, values, err)
+        end subroutine
+
+        ! INTEGER*8 scalar
+        subroutine adios_define_attribute_byvalue_int8_d0 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            integer*8,      intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_long, nelems, values, err)
+        end subroutine
+
+        ! REAL*4 scalar
+        subroutine adios_define_attribute_byvalue_real4_d0 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            real*4,         intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_real, nelems, values, err)
+        end subroutine
+
+        ! REAL*8 scalar
+        subroutine adios_define_attribute_byvalue_real8_d0 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            real*8,         intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_double, nelems, values, err)
+        end subroutine
+
+        ! COMPLEX*8 scalar
+        subroutine adios_define_attribute_byvalue_complex8_d0 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            complex*8,      intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_complex, nelems, values, err)
+        end subroutine
+
+        ! COMPLEX*16 scalar
+        subroutine adios_define_attribute_byvalue_complex16_d0 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            complex*16,     intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_double_complex, nelems, values, err)
+        end subroutine
+
+
+        ! INTEGER*1 array
+        subroutine adios_define_attribute_byvalue_int1_d1 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            integer*1, dimension(:), intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_byte, nelems, values, err)
+        end subroutine
+
+        ! INTEGER*2 array
+        subroutine adios_define_attribute_byvalue_int2_d1 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            integer*2, dimension(:), intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_short, nelems, values, err)
+        end subroutine
+
+        ! INTEGER*4 array
+        subroutine adios_define_attribute_byvalue_int4_d1 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            integer*4, dimension(:), intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_integer, nelems, values, err)
+        end subroutine
+
+        ! INTEGER*8 array
+        subroutine adios_define_attribute_byvalue_int8_d1 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            integer*8, dimension(:), intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_long, nelems, values, err)
+        end subroutine
+
+        ! REAL*4 array
+        subroutine adios_define_attribute_byvalue_real4_d1 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            real*4, dimension(:), intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_real, nelems, values, err)
+        end subroutine
+
+        ! REAL*8 array
+        subroutine adios_define_attribute_byvalue_real8_d1 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            real*8, dimension(:), intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_double, nelems, values, err)
+        end subroutine
+
+        ! COMPLEX*8 array
+        subroutine adios_define_attribute_byvalue_complex8_d1 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            complex*8, dimension(:), intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_complex, nelems, values, err)
+        end subroutine
+
+        ! COMPLEX*16 array
+        subroutine adios_define_attribute_byvalue_complex16_d1 (group_id, attrname, path, nelems, values, err)
+            implicit none
+            integer*8,      intent(in)  :: group_id
+            character(*),   intent(in)  :: attrname
+            character(*),   intent(in)  :: path
+            integer,        intent(in)  :: nelems
+            complex*16, dimension(:), intent(in)  :: values
+            integer,        intent(out) :: err
+
+            call adios_define_attribute_byvalue_f2c (group_id, attrname, path, adios_double_complex, nelems, values, err)
+        end subroutine
+
+    ! end of ADIOS_DEFINE_ATTRIBUTE_BYVALUE functions
+
 end module
 
diff --git a/src/core/bp_types.h b/src/core/bp_types.h
index b9d3b83..095e64d 100644
--- a/src/core/bp_types.h
+++ b/src/core/bp_types.h
@@ -48,14 +48,23 @@ struct BP_file_handle
     uint32_t file_index;
     MPI_File fh;
     struct BP_file_handle * next;
+    struct BP_file_handle * prev;
 };
 
-typedef struct BP_file_handle BP_file_handle_list;
+struct BP_file_handle_header
+{
+    uint32_t n_handles; // number of handles open
+    struct BP_file_handle * head;
+    struct BP_file_handle * tail; 
+    int warning_printed; // 1 if already printed the warning
+};
+
+typedef struct BP_file_handle_header BP_file_handle_list;
 
 typedef struct BP_FILE {
     MPI_File mpi_fh;
     char * fname; // Main file name is needed to calculate subfile names
-    BP_file_handle_list * sfh; // This list links all the subfiles handle together
+    BP_file_handle_list subfile_handles; // This list links all the subfiles handle together
     MPI_Comm comm;
     struct adios_bp_buffer_struct_v1 * b;
     struct bp_index_pg_struct_v1 * pgs_root;
diff --git a/src/core/bp_utils.c b/src/core/bp_utils.c
index 529869f..6aaa173 100644
--- a/src/core/bp_utils.c
+++ b/src/core/bp_utils.c
@@ -59,7 +59,7 @@ inline BP_FILE * GET_BP_FILE (const ADIOS_FILE * fp)
 }
 
 /* prototypes */
-void * bp_read_data_from_buffer(struct adios_bp_buffer_struct_v1 *b, enum ADIOS_DATATYPES type);
+void * bp_read_data_from_buffer(struct adios_bp_buffer_struct_v1 *b, enum ADIOS_DATATYPES type, int nelems);
 int bp_parse_characteristics (struct adios_bp_buffer_struct_v1 * b, struct adios_index_var_struct_v1 ** root, uint64_t j);
 
 
@@ -372,11 +372,15 @@ thod returns.
     return varinfo;
 }
 
-MPI_File * get_BP_file_handle(struct BP_file_handle * l, uint32_t file_index)
+MPI_File * get_BP_subfile_handle(BP_FILE *fh, uint32_t file_index)
 {
-    if (!l)
+    BP_file_handle_list *lst = &fh->subfile_handles; //just for simplifying typing
+    //printf ("%s # of handles=%d, search for file_index=%d, fh=%p\n", __func__, lst->n_handles, file_index, fh);
+    if (!lst->head)
         return 0;
 
+    struct BP_file_handle *l = lst->head;
+    
     while (l)
     {
         if (l->file_index == file_index)
@@ -388,17 +392,87 @@ MPI_File * get_BP_file_handle(struct BP_file_handle * l, uint32_t file_index)
     return 0;
 }
 
-void add_BP_file_handle (struct BP_file_handle ** l, struct BP_file_handle * n)
+void init_subfile_handle (BP_FILE *fh)
+{
+    BP_file_handle_list *lst = &fh->subfile_handles; //just for simplifying typing
+    lst->n_handles = 0;
+    lst->warning_printed = 0;
+}
+
+BP_FILE * BP_FILE_alloc (const char * fname, MPI_Comm comm)
+{
+    BP_FILE *fh = (BP_FILE *) malloc (sizeof (BP_FILE));
+    assert (fh);
+
+    fh->fname = (fname ? strdup (fname) : 0L);
+    fh->comm = comm;
+    fh->gvar_h = 0;
+    fh->pgs_root = 0;
+    fh->vars_root = 0;
+    fh->attrs_root = 0;
+    fh->vars_table = 0;
+    fh->b = malloc (sizeof (struct adios_bp_buffer_struct_v1));
+    assert (fh->b);
+    BP_file_handle_list *lst = &fh->subfile_handles; //just for simplifying typing
+    fh->subfile_handles.n_handles = 0;
+    fh->subfile_handles.warning_printed = 0;
+    fh->subfile_handles.head = NULL;
+    fh->subfile_handles.tail = NULL;
+    return fh;
+}
+
+static const int MAX_HANDLES = 512;
+static void close_BP_subfile (struct BP_file_handle * sfh)
+{
+    if (sfh)
+        MPI_File_close (&sfh->fh);
+}
+
+void add_BP_subfile_handle (BP_FILE * fh, struct BP_file_handle * n)
 {
     if (!n)
         return;
 
-    n->next = *l;
-    *l = n;
+    BP_file_handle_list *lst = &fh->subfile_handles; //just for simplifying typing
+
+    // link the newcomer as first (head)
+    n->next = lst->head;
+    if (lst->head) {
+        lst->head->prev = n;
+    }
+    lst->head = n;
+
+    // set tail if this is first element
+    if (!lst->tail) {
+        lst->tail = n;
+    }
+    lst->n_handles++;
+    
+    //printf ("%s # of handles=%d, now added file_index=%d, fh=%p\n", __func__, lst->n_handles, n->file_index, fh);
+    
+    // Don't run out of file descriptiors by keeping the number in check
+    if (lst->n_handles > MAX_HANDLES)
+    {
+        if (!lst->warning_printed) {
+            log_warn ("Number of subfiles of file %s opened in a single process reached %d "
+            "which indicates an inefficient reading pattern.\n", fh->fname, lst->n_handles);
+            lst->warning_printed = 1;
+        }
+        // remove the tail
+        lst->tail->prev->next = NULL;
+        struct BP_file_handle * oldest = lst->tail;
+        lst->tail = lst->tail->prev;
+        close_BP_subfile (oldest);
+        free (oldest);
+        lst->n_handles--;
+    }
 }
 
-void close_all_BP_files (struct BP_file_handle * l)
+void close_all_BP_subfiles (BP_FILE * fh)
 {
+    BP_file_handle_list * lst = &fh->subfile_handles;
+
+    struct BP_file_handle *l = lst->head;
     struct BP_file_handle * n;
 
     while (l)
@@ -410,6 +484,10 @@ void close_all_BP_files (struct BP_file_handle * l)
 
         l = n;
     }
+
+    lst->n_handles = 0;
+    lst->head = NULL;
+    lst->tail = NULL;
 }
 
 int bp_close (BP_FILE * fh)
@@ -426,8 +504,7 @@ int bp_close (BP_FILE * fh)
     if (fh->mpi_fh)
         MPI_File_close (&mpi_fh);
 
-    if (fh->sfh)
-        close_all_BP_files (fh->sfh);
+    close_all_BP_subfiles (fh);
 
     if (fh->b) {
         adios_posix_close_internal (fh->b);
@@ -645,7 +722,8 @@ int bp_read_minifooter (BP_FILE * bp_struct)
     if ((mh->version & ADIOS_VERSION_NUM_MASK) > ADIOS_VERSION_BP_FORMAT) {
         adios_error (err_file_open_error, 
            "Invalid BP file detected. Format version of file seems to be %d, "
-           "which is greater than the highest supported version %d.\n", 
+           "which is greater than the highest supported version %d. "
+           "Maybe try a newer version of ADIOS?\n", 
            (mh->version & ADIOS_VERSION_NUM_MASK), ADIOS_VERSION_BP_FORMAT);
         return 1;
     }
@@ -998,6 +1076,7 @@ int bp_parse_attrs (BP_FILE * fh)
                       malloc (sizeof (struct adios_index_attribute_struct_v1));
             (*root)->next = 0;
         }
+        (*root)->nelems = 1; // initialize to 1 in case there will be no dimension characteristic
         uint8_t flag;
         uint32_t attr_entry_length;
         uint16_t len;
@@ -1040,7 +1119,6 @@ int bp_parse_attrs (BP_FILE * fh)
             (*root)->type = adios_unknown;
         }
 
-
         BUFREAD64(b, characteristics_sets_count)
         (*root)->characteristics_count = characteristics_sets_count;
         (*root)->characteristics_allocated = characteristics_sets_count;
@@ -1075,7 +1153,8 @@ int bp_parse_attrs (BP_FILE * fh)
                 switch (c)
                 {
                     case adios_characteristic_value:
-                        (*root)->characteristics [j].value = bp_read_data_from_buffer(b, (*root)->type);
+                        (*root)->characteristics [j].value = 
+                            bp_read_data_from_buffer(b, (*root)->type, (*root)->nelems);
                         break;
 
                     case adios_characteristic_offset:
@@ -1100,6 +1179,23 @@ int bp_parse_attrs (BP_FILE * fh)
                             BUFREAD16(b, (*root)->characteristics [j].var_id)
                         }
                         break;
+
+                    case adios_characteristic_dimensions:
+                        {
+                            uint16_t dims_length;
+                            BUFREAD8(b,  (*root)->characteristics [j].dims.count);
+                            BUFREAD16(b, dims_length);
+                            (*root)->characteristics [j].dims.dims = (uint64_t *) malloc (dims_length);
+                            int di = 0;
+                            int dims_num = dims_length / sizeof(uint64_t);
+                            for (di = 0; di < dims_num; di ++) {
+                                BUFREAD64(b, ((*root)->characteristics [j].dims.dims)[di]);
+                            }
+                            (*root)->nelems  =  (*root)->characteristics [j].dims.dims[0];
+
+                            break;
+                        }
+
                     default:
                         break;
                 }
@@ -1429,7 +1525,7 @@ int bp_parse_characteristics (struct adios_bp_buffer_struct_v1 * b,
             uint8_t count = adios_get_stat_set_count (original_var_type);
             uint16_t characteristic_size;
 
-            (*root)->characteristics [j].value = bp_read_data_from_buffer(b, original_var_type);
+            (*root)->characteristics [j].value = bp_read_data_from_buffer(b, original_var_type, 1);
             if (!((*root)->characteristics [j].stats))
             {
                 (*root)->characteristics [j].stats = malloc (count*sizeof(struct adios_index_characteristics_stat_struct *));
@@ -1647,8 +1743,8 @@ SET_DATA_3(t) \
             }
 
             (*root)->characteristics [j].bitmap |= (1 << adios_statistic_max);
-            // (*root)->characteristics [j].stats[0][adios_statistic_max].data = bp_read_data_from_buffer(b, (*root)->type);
-            (*root)->characteristics [j].stats[0][adios_statistic_max].data = bp_read_data_from_buffer(b, original_var_type);
+            // (*root)->characteristics [j].stats[0][adios_statistic_max].data = bp_read_data_from_buffer(b, (*root)->type, 1);
+            (*root)->characteristics [j].stats[0][adios_statistic_max].data = bp_read_data_from_buffer(b, original_var_type, 1);
             break;
         }
 
@@ -1662,8 +1758,8 @@ SET_DATA_3(t) \
                 (*root)->characteristics [j].bitmap = 0;
             }
             (*root)->characteristics [j].bitmap |= (1 << adios_statistic_min);
-            // (*root)->characteristics [j].stats[0][adios_statistic_min].data = bp_read_data_from_buffer(b, (*root)->type);
-            (*root)->characteristics [j].stats[0][adios_statistic_min].data = bp_read_data_from_buffer(b, original_var_type);
+            // (*root)->characteristics [j].stats[0][adios_statistic_min].data = bp_read_data_from_buffer(b, (*root)->type, 1);
+            (*root)->characteristics [j].stats[0][adios_statistic_min].data = bp_read_data_from_buffer(b, original_var_type, 1);
             break;
         }
 
@@ -1694,8 +1790,8 @@ SET_DATA_3(t) \
                             struct adios_index_characteristics_hist_struct * hist = (*root)->characteristics [j].stats[c][idx].data;
 
                             BUFREAD32(b, hist->num_breaks)
-                            hist->min = * (double *) bp_read_data_from_buffer(b, adios_double);
-                            hist->max = * (double *) bp_read_data_from_buffer(b, adios_double);
+                            hist->min = * (double *) bp_read_data_from_buffer(b, adios_double, 1);
+                            hist->max = * (double *) bp_read_data_from_buffer(b, adios_double, 1);
 
                             hist->frequencies = malloc((hist->num_breaks + 1) * adios_get_type_size(adios_unsigned_integer, ""));
                             for (bi = 0; bi <= hist->num_breaks; bi ++)
@@ -1706,7 +1802,7 @@ SET_DATA_3(t) \
                             hist->breaks = malloc(hist->num_breaks * adios_get_type_size(adios_double, ""));
                             for (bi = 0; bi < hist->num_breaks; bi ++)
                             {
-                                hist->breaks[bi] = * (double *) bp_read_data_from_buffer(b, adios_double);
+                                hist->breaks[bi] = * (double *) bp_read_data_from_buffer(b, adios_double, 1);
                             }
                         }
                         else
@@ -2428,22 +2524,27 @@ int * get_var_nblocks (struct adios_index_var_struct_v1 * var_root, int nsteps)
     return nblocks;
 }
 
-void * bp_read_data_from_buffer(struct adios_bp_buffer_struct_v1 *b, enum ADIOS_DATATYPES type)
+void * bp_read_data_from_buffer(struct adios_bp_buffer_struct_v1 *b, enum ADIOS_DATATYPES type, int nelems)
 {
     int16_t data_size;
     void * data = 0;
+    int k;
+    char *p;
 
-    if (type == adios_string) {
+    if (type == adios_string_array) {
+        data_size = 0;
+        data = malloc (nelems * sizeof(char*));
+    } else if (type == adios_string) {
         BUFREAD16(b, data_size)
         data = malloc (data_size + 1);
     } else {
         data_size = bp_get_type_size (type, "");
-        data = malloc (data_size);
+        data = malloc (nelems * data_size);
     }
 
     if (!data) {
         adios_error (err_no_memory,
-                     "bp_read_data_from_buffer: cannot allocate %d bytes\n",data_size);
+                     "bp_read_data_from_buffer: cannot allocate %d bytes\n",nelems*data_size);
         return 0;
     }
 
@@ -2460,42 +2561,57 @@ void * bp_read_data_from_buffer(struct adios_bp_buffer_struct_v1 *b, enum ADIOS_
         case adios_real:
         case adios_double:
         case adios_long_double:
-            memcpy (data, (b->buff + b->offset), data_size);
-            b->offset += data_size;
-            if(b->change_endianness == adios_flag_yes) {
-                switch (data_size) {
-                    case 2:
-                        swap_16_ptr(data);
-                        break;
-                    case 4:
-                        swap_32_ptr(data);
-                        break;
-                    case 8:
-                        swap_64_ptr(data);
-                        break;
-                    case 16:
-                        swap_128_ptr(data);
-                        break;
+            memcpy (data, (b->buff + b->offset), nelems*data_size);
+            if(b->change_endianness == adios_flag_yes && data_size>1) {
+                p = (char *)data;
+                for (k=0; k<nelems; k++) 
+                {
+                    switch (data_size) {
+                        case 2:
+                            swap_16_ptr(p);
+                            break;
+                        case 4:
+                            swap_32_ptr(p);
+                            break;
+                        case 8:
+                            swap_64_ptr(p);
+                            break;
+                        case 16:
+                            swap_128_ptr(p);
+                            break;
+                    }
+                    p += data_size;
                 }
             }
+            b->offset += nelems*data_size;
             break;
 
         case adios_complex:
-            memcpy (data, (b->buff + b->offset), data_size);
+            memcpy (data, (b->buff + b->offset), nelems*data_size);
             if(b->change_endianness == adios_flag_yes) {
-                swap_32_ptr(data); // swap REAL part 4 bytes
-                swap_32_ptr( ((char *)data) + 4); // swap IMG part 4 bytes
+                p = (char *)data;
+                for (k=0; k<nelems; k++) 
+                {
+                    swap_32_ptr(p);   // swap REAL part 4 bytes
+                    swap_32_ptr(p+4); // swap IMG part 4 bytes
+                    p += data_size;
+                }
             }
-            b->offset += data_size;
+            b->offset += nelems*data_size;
             break;
 
         case adios_double_complex:
-            memcpy (data, (b->buff + b->offset), data_size);
+            memcpy (data, (b->buff + b->offset), nelems*data_size);
             if(b->change_endianness == adios_flag_yes) {
-                swap_64_ptr(data); // swap REAL part 8 bytes
-                swap_64_ptr( ((char *)data) + 8); // swap IMG part 8 bytes
+                p = (char *)data;
+                for (k=0; k<nelems; k++) 
+                {
+                    swap_64_ptr(p);   // swap REAL part 8 bytes
+                    swap_64_ptr(p+8); // swap IMG part 8 bytes
+                    p += data_size;
+                }
             }
-            b->offset += data_size;
+            b->offset += nelems*data_size;
             break;
 
         case adios_string:
@@ -2504,6 +2620,20 @@ void * bp_read_data_from_buffer(struct adios_bp_buffer_struct_v1 *b, enum ADIOS_
             ((char *) data) [data_size] = '\0';
             break;
 
+        case adios_string_array:
+            {
+                char ** p = (char**)data;
+                for (k=0; k < nelems; k++) {
+                    BUFREAD16(b, data_size)
+                    p[k] = malloc (data_size + 1);
+                    p[k] [data_size] = '\0';
+                    memcpy (p[k], (b->buff + b->offset), data_size);
+                    b->offset += data_size;
+                }
+            }
+            break;
+
+
         default:
             free (data);
             data = 0;
@@ -2513,7 +2643,7 @@ void * bp_read_data_from_buffer(struct adios_bp_buffer_struct_v1 *b, enum ADIOS_
 }
 
 /*
-void bp_grouping ( BP_FILE * fh_p,
+   void bp_grouping ( BP_FILE * fh_p,
            uint64_t * gh_p)
 {
     BP_FILE * fh = (BP_FILE *) fh_p;
@@ -2902,7 +3032,12 @@ const char * bp_value_to_string (enum ADIOS_DATATYPES type, void * data)
             break;
 
         case adios_string:
-            sprintf (s, "%s", ((char *) data));
+            sprintf (s, "\"%s\"", ((char *) data));
+            break;
+
+        case adios_string_array:
+            // we expect here one of the array elements, which has char * type 
+            sprintf (s, "\"%s\"", ( *(char **)data) );
             break;
 
         case adios_complex:
@@ -3014,6 +3149,9 @@ int bp_get_type_size (enum ADIOS_DATATYPES type, void * var)
             else
                 return strlen ((char *) var) + 1;
 
+        case adios_string_array:
+            return sizeof(char*);
+
         case adios_short:
         case adios_unsigned_short:
             return 2;
diff --git a/src/core/bp_utils.h b/src/core/bp_utils.h
index c7261e1..8df8ba2 100644
--- a/src/core/bp_utils.h
+++ b/src/core/bp_utils.h
@@ -14,6 +14,7 @@
 #include "core/bp_types.h"
 #define VARS_MINIHEADER_SIZE 10
 
+BP_FILE * BP_FILE_alloc (const char * fname, MPI_Comm comm);
 BP_PROC * GET_BP_PROC (const ADIOS_FILE * fp);
 BP_FILE * GET_BP_FILE (const ADIOS_FILE * fp);
 void bp_alloc_aligned (struct adios_bp_buffer_struct_v1 * b, uint64_t size);
@@ -30,9 +31,9 @@ int bp_read_close (struct adios_bp_buffer_struct_v1 * b);
 int bp_read_open (const char * filename,
         MPI_Comm comm,
         BP_FILE * fh);
-MPI_File * get_BP_file_handle(struct BP_file_handle * l, uint32_t file_index);
-void add_BP_file_handle (struct BP_file_handle ** l, struct BP_file_handle * n);
-void close_all_BP_files (struct BP_file_handle * l);
+MPI_File * get_BP_subfile_handle(BP_FILE *fh, uint32_t file_index);
+void add_BP_subfile_handle (struct BP_FILE *fh, struct BP_file_handle * n);
+void close_all_BP_subfiles (BP_FILE * fh);
 int get_time (struct adios_index_var_struct_v1 * v, int step);
 int bp_open (const char * fname,
              MPI_Comm comm,
diff --git a/src/core/common_adios.c b/src/core/common_adios.c
index 3d622c1..0f11d4f 100644
--- a/src/core/common_adios.c
+++ b/src/core/common_adios.c
@@ -127,6 +127,13 @@ int common_adios_open (int64_t * fd, const char * group_name
     adios_errno = err_no_error;
     adios_common_get_group (&group_id, group_name);
     g = (struct adios_group_struct *) group_id;
+    if (!g) {
+        adios_error(err_invalid_group, 
+                "adios_open: try to open file %s with undefined group: %s\n", 
+                name, group_name);
+        *fd = 0;
+        return adios_errno;
+    }
     methods = g->methods;
 
     if (!strcasecmp (file_mode, "r"))
@@ -181,11 +188,14 @@ int common_adios_open (int64_t * fd, const char * group_name
         */
         g->time_index++;
     }
+    /* FIXME: the time_index is updated in the actual method in case of append/update
+       so this code below is useless */
+#  if 0 
     else if (mode == adios_mode_append)
     {
         g->time_index++;
     }
-    else if (mode == adios_mode_update && g->time_index > 1)
+    else if (mode == adios_mode_update && g->time_index > 0)
     {
         /* Update from Append differs only in the time index. All methods had
            code for Append, now for Update we decrease the counter by one,
@@ -193,6 +203,7 @@ int common_adios_open (int64_t * fd, const char * group_name
         */
         g->time_index--;
     }
+#  endif
     /* time starts from 1 not from 0 (traditionally; now no one cares */
     if (g->time_index == 0)
         g->time_index = 1;
@@ -434,89 +445,6 @@ int common_adios_group_size (int64_t fd_p
     return adios_errno;
 }
 
-int common_adios_write_byid (struct adios_file_struct * fd, struct adios_var_struct * v, void * var)
-{
-    struct adios_method_list_struct * m = fd->group->methods;
-
-    adios_errno = err_no_error;
-    if (m && m->next == NULL && m->method->m == ADIOS_METHOD_NULL)
-    {
-        return adios_errno;
-    }
-
-    if (v->data)
-    {
-        free (v->data);
-        v->data = 0;
-    }
-
-    if (v->dimensions)
-    {
-        v->data = var;
-    }
-    else
-    {
-        uint64_t element_size = adios_get_type_size (v->type, var);
-
-        switch (v->type)
-        {
-            case adios_byte:
-            case adios_short:
-            case adios_integer:
-            case adios_long:
-            case adios_unsigned_byte:
-            case adios_unsigned_short:
-            case adios_unsigned_integer:
-            case adios_unsigned_long:
-            case adios_real:
-            case adios_double:
-            case adios_long_double:
-            case adios_complex:
-            case adios_double_complex:
-                v->data = malloc (element_size);
-                if (!v->data)
-                {
-                    adios_error (err_no_memory,
-                                 "In adios_write, cannot allocate %lld bytes to copy scalar %s\n",
-                                 element_size, v->name);
-                    return adios_errno;
-                }
-
-                memcpy ((char *) v->data, var, element_size);
-                break;
-
-            case adios_string:
-                v->data = malloc (element_size + 1);
-                if (!v->data)
-                {
-                    adios_error (err_no_memory,
-                                 "In adios_write, cannot allocate %lld bytes to copy string %s\n",
-                                 element_size, v->name);
-                    return adios_errno;
-                }
-                ((char *) v->data) [element_size] = 0;
-                memcpy ((char *) v->data, var, element_size);
-                break;
-
-            default:
-                v->data = 0;
-                break;
-        }
-    }
-
-    common_adios_write (fd, v, var);
-    // v->data is set to NULL in the above call
-
-    if (!adios_errno) {
-        if (fd->mode == adios_mode_write || fd->mode == adios_mode_append)
-        {
-            adios_copy_var_written (fd->group, v);
-        }
-    }
-
-    return adios_errno;
-}
-
 static int common_adios_write_transform_helper(struct adios_file_struct * fd, struct adios_var_struct * v) {
     int use_shared_buffer = (fd->shared_buffer == adios_flag_yes);
     int wrote_to_shared_buffer = 0;
@@ -563,13 +491,19 @@ static int common_adios_write_transform_helper(struct adios_file_struct * fd, st
         // v->data_size and v->free_data. Else, write the payload to the shared
         // buffer (the other v->* fields have already been updated)
         if (wrote_to_shared_buffer) {
-            v->data = fd->buffer + payload_offset;
+            v->adata = fd->buffer + payload_offset;
             v->data_size = end_offset - payload_offset;
             v->free_data = adios_flag_no;
+            v->data = v->adata;
 
             // Update the buffer back to the end of the header+payload
             fd->offset = end_offset;
         } else {
+            // either no transformation happened (original data is in v->data), or
+            // data was transformed into v->adata
+            if (v->adata) {
+                v->data = v->adata;
+            }
             // write payload
             adios_write_var_payload_v1 (fd, v);
 
@@ -593,7 +527,7 @@ static int common_adios_write_transform_helper(struct adios_file_struct * fd, st
  * structures. This is because C and Fortran implementations of adios_write are
  * different for some part and this is the common part.
  */
-int common_adios_write (struct adios_file_struct * fd, struct adios_var_struct * v, void * var)
+int common_adios_write (struct adios_file_struct * fd, struct adios_var_struct * v, const void * var)
 {
 #if defined(WITH_NCSU_TIMER) && defined(TIMER_LEVEL) && (TIMER_LEVEL <= 0)
     timer_start ("adios_write");
@@ -664,9 +598,9 @@ int common_adios_write (struct adios_file_struct * fd, struct adios_var_struct *
         //   as this flag is hardly ever used, I don't know whether this is
         //   using the flag correctly or not. Need verification with
         //   Gary/Norbert/someone knowledgable about ADIOS internals.
-        if (v->transform_type != adios_transform_none && v->free_data == adios_flag_yes && v->data)
-            free(v->data);
-        v->data = 0;
+        if (v->transform_type != adios_transform_none && v->free_data == adios_flag_yes && v->adata)
+            free(v->adata);
+        v->data = v->adata = 0;
     }
 
     v->write_count++;
@@ -677,6 +611,95 @@ int common_adios_write (struct adios_file_struct * fd, struct adios_var_struct *
     return adios_errno;
 }
 
+
+///////////////////////////////////////////////////////////////////////////////
+int common_adios_write_byid (struct adios_file_struct * fd, struct adios_var_struct * v, const void * var)
+{
+    struct adios_method_list_struct * m = fd->group->methods;
+
+    adios_errno = err_no_error;
+    if (m && m->next == NULL && m->method->m == ADIOS_METHOD_NULL)
+    {
+        return adios_errno;
+    }
+
+    if (v->adata)
+    {
+        free (v->adata);
+        v->adata = 0;
+    }
+
+    if (v->dimensions)
+    {
+        v->data = var;
+    }
+    else
+    {
+        uint64_t element_size = adios_get_type_size (v->type, var);
+
+        switch (v->type)
+        {
+            case adios_byte:
+            case adios_short:
+            case adios_integer:
+            case adios_long:
+            case adios_unsigned_byte:
+            case adios_unsigned_short:
+            case adios_unsigned_integer:
+            case adios_unsigned_long:
+            case adios_real:
+            case adios_double:
+            case adios_long_double:
+            case adios_complex:
+            case adios_double_complex:
+                v->adata = malloc (element_size);
+                if (!v->adata)
+                {
+                    adios_error (err_no_memory,
+                                 "In adios_write, cannot allocate %lld bytes to copy scalar %s\n",
+                                 element_size, v->name);
+                    return adios_errno;
+                }
+
+                memcpy ((char *) v->adata, var, element_size);
+                v->data = v->adata;
+                break;
+
+            case adios_string:
+                v->adata = malloc (element_size + 1);
+                if (!v->adata)
+                {
+                    adios_error (err_no_memory,
+                                 "In adios_write, cannot allocate %lld bytes to copy string %s\n",
+                                 element_size, v->name);
+                    return adios_errno;
+                }
+                ((char *) v->adata) [element_size] = 0;
+                memcpy ((char *) v->adata, var, element_size);
+                v->data = v->adata;
+                break;
+
+            default:
+                v->data = 0;
+                break;
+        }
+    }
+
+    common_adios_write (fd, v, var);
+    // v->data is set to NULL in the above call for arrays, 
+    // but it's pointing to v->adata, which is allocated in ADIOS, for scalars
+    // to remember their value if used as dimension in forthcoming writes of arrays.
+
+    if (!adios_errno) {
+        if (fd->mode != adios_mode_read)
+        {
+            adios_copy_var_written (fd->group, v);
+        }
+    }
+
+    return adios_errno;
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 int common_adios_get_write_buffer (int64_t fd_p, const char * name
                            ,uint64_t * size
@@ -1045,10 +1068,10 @@ int common_adios_close (int64_t fd_p)
     while (v)
     {
         v->write_offset = 0;
-        if (v->data)
+        if (v->adata)
         {
-            free (v->data);
-            v->data = 0;
+            free (v->adata);
+            v->data = v->adata = 0;
         }
 
         v = v->next;
@@ -1104,8 +1127,10 @@ int common_adios_close (int64_t fd_p)
         // NCSU ALACRITY-ADIOS - Clear transform metadata
         adios_transform_clear_transform_var(fd->group->vars_written);
 
-        if (fd->group->vars_written->data)
-            free (fd->group->vars_written->data);
+        if (fd->group->vars_written->adata) {
+            free (fd->group->vars_written->adata);
+            fd->group->vars_written->data = fd->group->vars_written->adata = 0;
+        }
 
         v = fd->group->vars_written->next;
         free (fd->group->vars_written);
diff --git a/src/core/common_adios.h b/src/core/common_adios.h
index 32b63cf..0cb7f78 100644
--- a/src/core/common_adios.h
+++ b/src/core/common_adios.h
@@ -40,9 +40,8 @@ int common_adios_group_size (int64_t fd_p, uint64_t data_size
                      ,uint64_t * total_size
                      );
 
-//int common_adios_write (int64_t fd_p, const char * name, void * var);
-int common_adios_write (struct adios_file_struct * fd, struct adios_var_struct * v, void * var);
-int common_adios_write_byid (struct adios_file_struct * fd, struct adios_var_struct * v, void * var);
+int common_adios_write (struct adios_file_struct * fd, struct adios_var_struct * v, const void * var);
+int common_adios_write_byid (struct adios_file_struct * fd, struct adios_var_struct * v, const void * var);
 
 int common_adios_get_write_buffer (int64_t fd_p, const char * name
                            ,uint64_t * size
diff --git a/src/core/common_read.c b/src/core/common_read.c
index 835812a..c064321 100644
--- a/src/core/common_read.c
+++ b/src/core/common_read.c
@@ -206,6 +206,61 @@ int common_read_finalize_method(enum ADIOS_READ_METHOD method)
     return retval;
 }
 
+static ADIOS_FILE * common_read_link (ADIOS_FILE * fp)
+{
+    int i;
+    fp->nlinks = 0;
+    fp->link_namelist = NULL;
+
+    if (fp->attr_namelist)
+    {
+        char ** tmp = (char **) malloc (sizeof(char*) * fp->nattrs);
+        for (i=0; i<fp->nattrs; i++)
+        {
+            // find "/adios_link/***/ref-num" attributes for getting the names of links
+            if (strstr (fp->attr_namelist[i], "/adios_link/") == fp->attr_namelist[i])   //// starts with /adios_link/
+            {
+                char *s = fp->attr_namelist[i]+strlen("/adios_link/");
+                char *p = strchr (s, '/');
+                if ( p &&
+                     strstr (p, "/ref-num") == p)
+                {
+                    // retrieve the name of the link
+                    int samelink = 0;
+                    int ilink;
+                    if (fp->nlinks > 0)
+                    {
+                        char * linkname = NULL;
+                        linkname = (char *) malloc (sizeof(char*) * (size_t)(p-s)+1);
+                        memcpy ( linkname, s, (size_t)(p-s) );
+                        for (ilink=0; ilink<fp->nlinks; ilink++)
+                        {
+                            if (!strcmp (linkname, tmp[ilink]))
+                                samelink = 1;
+                        }
+                        free (linkname);
+                    }
+                    if (!fp->nlinks || !samelink)
+                    {
+                        tmp [ fp->nlinks ] = (char *) malloc (sizeof(char*) * (size_t)(p-s)+1);
+                        memcpy ( tmp[ fp->nlinks ], s, (size_t)(p-s) );
+                        tmp[ fp->nlinks ][(p-s)] = '\0';
+                        fp->nlinks++;
+                    }
+                }
+            }
+        }
+        if (fp->nlinks)
+        {
+            fp->link_namelist = (char **) realloc (tmp, sizeof (char *) * fp->nlinks);
+            assert (fp->link_namelist);
+        } else {
+            free (tmp);
+        }
+    }
+    return fp;
+}
+
 static ADIOS_FILE * common_read_mesh (ADIOS_FILE * fp)
 {
     int i;
@@ -373,6 +428,8 @@ ADIOS_FILE * common_read_open (const char * fname,
 
     common_read_mesh (fp);
 
+    common_read_link (fp);
+
     return fp;
 }
 
@@ -443,6 +500,8 @@ ADIOS_FILE * common_read_open_file (const char * fname,
     
     common_read_mesh (fp);
 
+    common_read_link (fp);
+
     return fp;
 }
 
@@ -474,6 +533,11 @@ int common_read_close (ADIOS_FILE *fp)
                 free(fp->mesh_namelist[i]);
             free(fp->mesh_namelist);
         }
+        if (fp->nlinks) {
+            for (i=0; i<fp->nlinks; i++)
+                free(fp->link_namelist[i]);
+            free(fp->link_namelist);
+        }
                 
         retval = internals->read_hooks[internals->method].adios_read_close_fn (fp);
         free_namelist (internals->group_namelist, internals->ngroups);
@@ -633,7 +697,7 @@ static int common_read_find_var (const ADIOS_FILE *fp, const char *name, int qui
         // Double cast makes the compiler happy...
         varid = (int)(int64_t)internals->hashtbl_vars->get (internals->hashtbl_vars, name);
         // varid=0 is "not found", otherwise +1 bigger than actual varid
-        varid--;
+        varid--; // we added varid+1 originally to avoid double meanings of 0 (value and not-found)
     }
 
     if (varid == -1) {
@@ -642,6 +706,9 @@ static int common_read_find_var (const ADIOS_FILE *fp, const char *name, int qui
         else
             adios_errno = err_invalid_varname;
     }
+
+    // map the global varid back to the current group view's varid
+    varid -= internals->group_varid_offset;
     return varid;
 }
 
@@ -1301,6 +1368,116 @@ static int common_check_var_type_to_int (enum ADIOS_DATATYPES * type, void * val
     }
     return data;
 }
+
+ADIOS_LINK * common_read_inq_link_byid (ADIOS_FILE *fp, int linkid)
+{
+    enum ADIOS_DATATYPES attr_type;
+    int attr_size;
+    void * data = NULL;
+    int  read_fail = 0;
+    int i;
+
+    ADIOS_LINK * linkinfo = (ADIOS_LINK *) malloc (sizeof(ADIOS_LINK));
+    //link id
+    linkinfo->id = linkid;
+    //link name
+    linkinfo->name = strdup(fp->link_namelist[linkinfo->id]);
+
+    //check /adios_link/linkinfo->name/ref-num
+    char * attribute = malloc (strlen("/adios_link/")+strlen(linkinfo->name)+strlen("/ref-num")+1 );
+    strcpy (attribute, "/adios_link/");
+    strcat (attribute, linkinfo->name);
+    strcat (attribute, "/ref-num");
+    read_fail = common_read_get_attr_mesh (fp, attribute, &attr_type, &attr_size, &data);
+    free (attribute);
+    if (!read_fail)
+        linkinfo->nrefs = *(int *)data;
+    else
+    {
+        linkinfo->nrefs = 1;
+        log_warn ("Cannot find /adios_link/%s/ref-num. "
+                  "We assume the ref-num is 1.", linkinfo->name);
+    }
+
+    int i_digits;
+    char i_buffer[5];     // support no more than 5 digits
+    linkinfo->type = (enum ADIOS_LINK_TYPE *) malloc (linkinfo->nrefs*sizeof(enum ADIOS_LINK_TYPE));
+    linkinfo->ref_names = (char **)malloc(linkinfo->nrefs*sizeof(char *));
+    linkinfo->ref_files = (char **)malloc(linkinfo->nrefs*sizeof(char *));
+    for (i=0; i<linkinfo->nrefs; i++)
+    {
+        i_digits = sprintf (i_buffer, "%d", i);
+        // start looking for /adios_link/linkinfo->name/objref* according to linkinfo->nrefs
+        attribute = malloc (strlen("/adios_link/")+strlen(linkinfo->name)+strlen("/objref")+i_digits+1 );
+        strcpy (attribute, "/adios_link/");
+        strcat (attribute, linkinfo->name);
+        strcat (attribute, "/objref");
+        strcat (attribute, i_buffer);
+        read_fail = common_read_get_attr_mesh (fp, attribute, &attr_type, &attr_size, &data);
+        if (!read_fail)
+            linkinfo->ref_names[i] = strdup((char *)data);
+        else
+            log_warn("Cannot find objref for %s. "
+                     "It requreis /adios_link/%s/objref%d\n", linkinfo->name, linkinfo->name, i);
+        free (attribute);
+
+        // start looking for /adios_link/linkinfo->name/extref* according to linkinfo->nrefs
+        attribute = malloc (strlen("/adios_link/")+strlen(linkinfo->name)+strlen("/extref")+i_digits+1 );
+        strcpy (attribute, "/adios_link/");
+        strcat (attribute, linkinfo->name);
+        strcat (attribute, "/extref");
+        strcat (attribute, i_buffer);
+        read_fail = common_read_get_attr_mesh (fp, attribute, &attr_type, &attr_size, &data);
+        if (!read_fail)
+        {
+            if(*(char *)data == '\0')
+            {
+                // if the string has no information, we assue it is in the same file
+                log_warn ("attribute /adios_link/%s/extref%d is an empty string. "
+                          "Assume extref%d file is the current file.\n", linkinfo->name, i, i);
+                BP_FILE * fh = GET_BP_FILE (fp);
+                linkinfo->ref_files[i] = strdup (fh->fname);
+            }
+            else
+                linkinfo->ref_files[i] = strdup((char *)data);
+        }
+        else
+        {
+            log_warn("Cannot find extref for %s. It requreis /adios_link/%s/extref%d.\n"
+                     "Assume the extref file is the current file.\n", linkinfo->name, linkinfo->name, i);
+            BP_FILE * fh = GET_BP_FILE (fp);
+            linkinfo->ref_files[i] = strdup (fh->fname);
+        }
+        free (attribute);
+
+        //check /adios_link/linkinfo->name/type* according to linkinfo->nrefs
+        attribute = malloc (strlen("/adios_link/")+strlen(linkinfo->name)+strlen("/type")+i_digits+1 );
+        strcpy (attribute, "/adios_link/");
+        strcat (attribute, linkinfo->name);
+        strcat (attribute, "/type");
+        strcat (attribute, i_buffer);
+        read_fail = common_read_get_attr_mesh (fp, attribute, &attr_type, &attr_size, &data);
+        if (!read_fail)
+        {
+            if ( !strcmp((char *)data, "var") || !strcmp((char *)data, "variable") ||
+                 !strcmp((char *)data, "VAR") || !strcmp((char *)data, "VARIABLE"))
+                linkinfo->type[i] = LINK_VAR;
+            else if ( !strcmp((char *)data, "image") || !strcmp((char *)data, "IMAGE"))
+                linkinfo->type[i] = LINK_IMAGE;
+            else
+                log_warn("The provided type %s is not supported. Please use var OR image.\n", (char *)data);
+        }
+        else
+        {
+            log_warn("Cannot find type for %s. It requreis /adios_link/%s/type%d.\n"
+                     "Assume the type is var.\n", linkinfo->name, linkinfo->name, i);
+            linkinfo->type[i] = LINK_VAR;
+        }
+        free (attribute);
+    }
+    return linkinfo;
+}
+
 int adios_get_uniform_mesh_attr (ADIOS_FILE * fp, ADIOS_MESH *meshinfo, char * attrs)      //attr for origins-num(origins), spacings-num(spacings), maximums-num(maximums)
 {
     int i;
@@ -2708,7 +2885,7 @@ int common_read_complete_meshinfo (ADIOS_FILE *fp, ADIOS_FILE *mp, ADIOS_MESH *
                     if (!read_fail)
                     {
                         adios_errno = err_no_error;
-                        meshinfo->unstructured->npoints = common_check_var_type_to_uint64 (&attr_size, data);
+                        meshinfo->unstructured->npoints = common_check_var_type_to_uint64 (&attr_type, data);
                         if (adios_errno < 0)
                         {
                             log_warn ("Unstructured mesh %s var type of npoints is not supported. "
@@ -2780,7 +2957,7 @@ int common_read_complete_meshinfo (ADIOS_FILE *fp, ADIOS_FILE *mp, ADIOS_MESH *
                     if (!read_fail)
                     {
                         adios_errno = err_no_error;
-                        meshinfo->unstructured->nspaces = common_check_var_type_to_int (&attr_size, data);
+                        meshinfo->unstructured->nspaces = common_check_var_type_to_int (&attr_type, data);
                         if (adios_errno < 0)
                             log_warn ("Unstructured mesh %s var type of nspaces is not suported, "
                                       "use points dim %d for nspaces\n",
@@ -3167,6 +3344,36 @@ int common_read_complete_meshinfo (ADIOS_FILE *fp, ADIOS_FILE *mp, ADIOS_MESH *
     return err_no_error;
 }
 
+void common_read_free_linkinfo (ADIOS_LINK * linkinfo)
+{
+    if (linkinfo)
+    {
+        int i;
+        if (linkinfo->name)
+        {
+            free (linkinfo->name);
+            linkinfo->name = NULL;
+        }
+        if (linkinfo->ref_names)
+        {
+            for (i=0; i<linkinfo->nrefs; i++)
+            {
+                free (linkinfo->ref_names[i]);
+                linkinfo->ref_names[i] = NULL;
+            }
+        }
+        if (linkinfo->ref_files)
+        {
+            for (i=0; i<linkinfo->nrefs; i++)
+            {
+                free (linkinfo->ref_files[i]);
+                linkinfo->ref_files[i] = NULL;
+            }
+        }
+        free (linkinfo);
+    }
+}
+
 void common_read_free_meshinfo (ADIOS_MESH * meshinfo)
 {
     if(meshinfo)
@@ -3520,6 +3727,7 @@ const char * common_read_type_to_string (enum ADIOS_DATATYPES type)
         case adios_complex:          return "complex";
         case adios_double_complex:   return "double complex";
 
+        case adios_string_array:     return "char*[]";
         default:
         {
             static char buf [50];
diff --git a/src/core/common_read.h b/src/core/common_read.h
index 189d259..7a0b59d 100644
--- a/src/core/common_read.h
+++ b/src/core/common_read.h
@@ -56,6 +56,9 @@ ADIOS_TRANSINFO * common_read_inq_transinfo(const ADIOS_FILE *fp, const ADIOS_VA
 int common_read_inq_var_stat (const ADIOS_FILE *fp, ADIOS_VARINFO * varinfo,
                              int per_step_stat, int per_block_stat);
 
+ADIOS_LINK * common_read_inq_link_byid (ADIOS_FILE *fp, int linkid);
+void common_read_free_linkinfo (ADIOS_LINK * linkinfo);
+
 int common_read_inq_trans_blockinfo(const ADIOS_FILE *fp, const ADIOS_VARINFO *vi, ADIOS_TRANSINFO * ti);
 int common_read_inq_var_blockinfo_raw (const ADIOS_FILE *fp, ADIOS_VARINFO * varinfo);
 int common_read_inq_var_blockinfo (const ADIOS_FILE *fp, ADIOS_VARINFO * varinfo);
diff --git a/src/core/transforms/adios_transforms_common.c b/src/core/transforms/adios_transforms_common.c
index 1815645..126d826 100644
--- a/src/core/transforms/adios_transforms_common.c
+++ b/src/core/transforms/adios_transforms_common.c
@@ -294,7 +294,9 @@ int adios_transform_deserialize_transform_characteristic(struct adios_index_char
     //BUFREAD8(b, transform->transform_type);
     transform->transform_type = deserialize_transform_type(b);
 
-    BUFREAD8(b, transform->pre_transform_type);
+    uint8_t flag; // type represented as single byte in file/buffer
+    BUFREAD8(b, flag);
+    transform->pre_transform_type = (enum ADIOS_DATATYPES) flag;
     BUFREAD8(b, transform->pre_transform_dimensions.count);
 
     BUFREAD16(b, len);
diff --git a/src/core/transforms/adios_transforms_write.c b/src/core/transforms/adios_transforms_write.c
index afc285b..72b3b80 100644
--- a/src/core/transforms/adios_transforms_write.c
+++ b/src/core/transforms/adios_transforms_write.c
@@ -90,7 +90,7 @@ static void init_dimension_item(struct adios_dimension_item_struct *dimitem) {
     dimitem->rank = 0;
     dimitem->var = NULL;
     dimitem->attr = NULL;
-    dimitem->time_index = adios_flag_no;
+    dimitem->is_time_index = adios_flag_no;
 }
 
 static struct adios_dimension_struct * new_dimension() {
@@ -109,7 +109,7 @@ static int find_time_dimension_old(struct adios_dimension_struct *dim, struct ad
     struct adios_dimension_struct *cur_dim;
     int i;
     for (i = 0, cur_dim = dim; cur_dim; cur_dim = cur_dim->next, i++ ) {
-        if (cur_dim->dimension.time_index == adios_flag_yes) {
+        if (cur_dim->dimension.is_time_index == adios_flag_yes) {
             if (time_dim) *time_dim = cur_dim;
             return i;
         }
@@ -141,9 +141,9 @@ static int is_dimension_item_zero(struct adios_dimension_item_struct *dim_item)
 }
 
 static int is_time_dimension(struct adios_dimension_struct *dim) {
-    return dim->dimension.time_index == adios_flag_yes ||
-           dim->global_dimension.time_index == adios_flag_yes ||
-           dim->local_offset.time_index == adios_flag_yes;
+    return dim->dimension.is_time_index == adios_flag_yes ||
+           dim->global_dimension.is_time_index == adios_flag_yes ||
+           dim->local_offset.is_time_index == adios_flag_yes;
 }
 
 #if 0 
@@ -230,7 +230,7 @@ static void adios_transform_attach_byte_array_dimensions_old(struct adios_group_
     // Construct the dimension linked list
     for (i = 0; i < new_ndim; i++) {
         struct adios_dimension_struct *new_dim = new_dimension();
-        new_dim->dimension.time_index = (i == new_time_dim_pos) ? adios_flag_yes : adios_flag_no;
+        new_dim->dimension.is_time_index = (i == new_time_dim_pos) ? adios_flag_yes : adios_flag_no;
         new_dim->dimension.rank = ldims[i];
         new_dim->global_dimension.rank = gdims[i];
         new_dim->local_offset.rank = odims[i];
@@ -258,7 +258,7 @@ static void adios_transform_attach_byte_array_dimensions(struct adios_var_struct
     for (i = 0; i < new_ndim; i++) {
         struct adios_dimension_struct *new_dim = new_dimension();
 
-        new_dim->dimension.time_index = (new_has_time && i == new_time_dim_pos) ? adios_flag_yes : adios_flag_no;
+        new_dim->dimension.is_time_index = (new_has_time && i == new_time_dim_pos) ? adios_flag_yes : adios_flag_no;
 
         // Clear global dimension/local offset arrays to all 0 to indicate a local array
         // For local dimensions, set the time dimension to 1, and the non-time dimension to 0 as a placeholder
@@ -378,7 +378,7 @@ static int adios_transform_store_transformed_length(struct adios_file_struct * f
     assert(dim1);
     dim2 = dim1->next;
 
-    if (dim1->dimension.time_index == adios_flag_yes) {
+    if (dim1->dimension.is_time_index == adios_flag_yes) {
         // If the first dimension is a time dimension, then the byte array dimension must be the second one
         assert(dim2);
         byte_length_ldim = &dim2->dimension;
@@ -510,7 +510,7 @@ static void dereference_dimension_item(struct adios_dimension_item_struct *dst_d
     dst_dim_item->var = NULL;
     dst_dim_item->attr = NULL;
     dst_dim_item->rank = adios_get_dim_value((struct adios_dimension_item_struct *)src_dim_item);
-    dst_dim_item->time_index = src_dim_item->time_index;
+    dst_dim_item->is_time_index = src_dim_item->is_time_index;
 }
 
 /*
@@ -589,7 +589,8 @@ static uint8_t adios_transform_serialize_transform(enum ADIOS_TRANSFORM_TYPE tra
     serialize_transform_type(transform_type, write_length, buffer, buffer_size, buffer_offset);
 
     // Write the pre-transform datatype
-    buffer_write(buffer, buffer_size, buffer_offset, &pre_transform_type, 1);
+    flag = (uint8_t) pre_transform_type; // convert down to a single byte
+    buffer_write(buffer, buffer_size, buffer_offset, &flag, 1);
     *write_length += 1;
 
     // Write the number of pre-transform dimensions
diff --git a/src/core/util.c b/src/core/util.c
index 7b48a9e..00152c3 100644
--- a/src/core/util.c
+++ b/src/core/util.c
@@ -103,12 +103,50 @@ void change_endianness( void *data, uint64_t slice_size, enum ADIOS_DATATYPES ty
             break;
 
         case adios_string:
+        case adios_string_array:
         default:
             /* nothing to do */
             break;
     }
 }
 
+// copy an array of strings with allocation, return pointer
+// also return the sum of string lengths in 'total_length'
+char ** dup_string_array (char ** v, int nelems, int * total_length) 
+{
+    *total_length = 0;
+
+    if (!v || nelems < 1)
+        return NULL;
+
+    char ** p = malloc (nelems*sizeof(char*));
+    if (!p) return NULL;
+
+    int i, len;
+    for (i=0; i<nelems; i++) {
+        if (v[i]) {
+            len = strlen (v[i]) + 1;
+            p[i] = malloc (len*sizeof(char));
+            if (p[i])
+                memcpy (p[i], v[i], len);
+            *total_length += len;
+        } else {
+            p[i] = NULL;
+        }
+    }
+    return p;
+}
+
+void free_string_array (char ** v, int nelems) 
+{
+    int i;
+    for (i=0; i<nelems; i++) {
+        if (v[i]) free (v[i]);
+        v[i] = 0;
+    }
+    free (v);
+}
+
 void copy_data (void *dst, void *src,
         int idim,
         int ndim,
diff --git a/src/core/util.h b/src/core/util.h
index ebedfad..71d2d43 100644
--- a/src/core/util.h
+++ b/src/core/util.h
@@ -24,6 +24,12 @@ typedef struct read_request
 */
 void swap_order(int n, uint64_t *array, int *timedim);
 void change_endianness( void *data, uint64_t slice_size, enum ADIOS_DATATYPES type);
+
+// copy an array of strings with allocation, return pointer
+// also return the sum of string lengths in 'total_length'
+char ** dup_string_array (char ** v, int nelems, int * total_length);
+void free_string_array (char ** v, int nelems);
+
 void copy_data (void *dst, void *src,
                 int idim,
                 int ndim,
diff --git a/src/public/adios.h b/src/public/adios.h
index 2d9957f..3977505 100644
--- a/src/public/adios.h
+++ b/src/public/adios.h
@@ -10,6 +10,7 @@
 
 #include <stdint.h>
 
+#include "adios_version.h"
 #include "adios_mpi.h"
 #include "adios_types.h"
 #include "adios_error.h"
@@ -49,7 +50,7 @@ int adios_group_size (int64_t fd_p,
                       uint64_t * total_size
                      ); 
 
-int adios_write (int64_t fd_p, const char * name, void * var);
+int adios_write (int64_t fd_p, const char * name, const void * var);
 
 int adios_get_write_buffer (int64_t fd_p, 
                             const char * name,
@@ -136,6 +137,17 @@ int adios_define_attribute (int64_t group,
                             const char * var
                            );
 
+// define an attribute with values. 
+// it can define an (1D) array of scalars, 'nelems' elements
+// 'values' should point to the array of 'nelems' number of values of the specified type
+int adios_define_attribute_byvalue (int64_t group, 
+                            const char * name,
+                            const char * path, 
+                            enum ADIOS_DATATYPES type,
+                            int  nelems,
+                            void * values
+                           );
+
 int adios_delete_attrdefs (int64_t id);
 
 /** This function does similar function as adios_write. It is, however, used
@@ -143,7 +155,7 @@ int adios_delete_attrdefs (int64_t id);
  * 1. numbers, instead of a variable, are used to annotate array dimensions, and
  * 2. a variable is written mutiple times on a processor (e.g., AMR codes)
  */
-int adios_write_byid (int64_t fd_p, int64_t id, void * var);
+int adios_write_byid (int64_t fd_p, int64_t id, const void * var);
 
 /** Set the application's ID for adios_read_init()
  *  when using a staging method (DATASPACES, DIMES, NSSI or DATATAP).
diff --git a/src/public/adios_link.h b/src/public/adios_link.h
new file mode 100644
index 0000000..ff2f42f
--- /dev/null
+++ b/src/public/adios_link.h
@@ -0,0 +1,28 @@
+#ifndef ADIOS_LINK_H
+#define ADIOS_LINK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum ADIOS_LINK_TYPE {
+    LINK_VAR = 1,
+    LINK_IMAGE = 2
+    /* expand supported link types here */
+};
+
+typedef struct
+{
+    int id;
+    char * name;
+    int nrefs;
+    enum ADIOS_LINK_TYPE * type;
+    char ** ref_names;    /* the linked variable name referred from this var */
+    char ** ref_files;    /* full path, 0 means link from the same file, otherwise link from externel file */
+} ADIOS_LINK;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/public/adios_read_ext.h b/src/public/adios_read_ext.h
index f1cfaaa..22e14d8 100644
--- a/src/public/adios_read_ext.h
+++ b/src/public/adios_read_ext.h
@@ -16,40 +16,44 @@
 #include "adios_read_v2.h"
 #include "adios_selection.h"
 
-// An opaque type defining a particular view of the data.
-// Currently, there are only two possible values: LOGICAL_DATA_VIEW and PHYSICAL_DATA_VIEW
+/* An opaque type defining a particular view of the data.
+ * Currently, there are only two possible values: LOGICAL_DATA_VIEW and PHYSICAL_DATA_VIEW 
+ */
 typedef const void* data_view_t;
 
-// LOGICAL_DATA_VIEW: the default, ADIOS presents the same view of the data as it was written to the
-//   file (e.g., if processes wrote to a 3D global array of doubles, the user API will present a 3D global
-//   array of doubles to the user when in this view mode).
+/* LOGICAL_DATA_VIEW: the default, ADIOS presents the same view of the data as it was written to the
+ *   file (e.g., if processes wrote to a 3D global array of doubles, the user API will present a 3D global
+ *   array of doubles to the user when in this view mode).
+ */
 extern const data_view_t LOGICAL_DATA_VIEW;
 
-// PHYSICAL_DATA_VIEW: ADIOS will present the raw transport layer view of the data. If a variable is not
-//   transformed, its presentation is equivalent to that under LOGICAL_DATA_VIEW. If a variable is
-//   transformed, it will be presented as a 1D byte array, and reads will be answered directly from the
-//   transformed data with out any de-transformation applied.
+/* PHYSICAL_DATA_VIEW: ADIOS will present the raw transport layer view of the data. If a variable is not
+ *   transformed, its presentation is equivalent to that under LOGICAL_DATA_VIEW. If a variable is
+ *   transformed, it will be presented as a 1D byte array, and reads will be answered directly from the
+ *   transformed data with out any de-transformation applied.
+ */
 extern const data_view_t PHYSICAL_DATA_VIEW;
 
-// An identifier for a particular transform type (e.g., identity, zlib, etc.)
-// constant NO_TRANSFORM indicates the absence of any data transform being applied.
+/* An identifier for a particular transform type (e.g., identity, zlib, etc.)
+ * constant NO_TRANSFORM indicates the absence of any data transform being applied.
+ */
 typedef int adios_transform_type_t;
 
 extern const adios_transform_type_t NO_TRANSFORM;
 
 typedef struct {
 	const void *content;
-	uint64_t length;   // in bytes
+	uint64_t length;   /* in bytes */
 } ADIOS_TRANSFORM_METADATA;
 
-// A transform information structure describing how a particular variable has been transformed
+/* A transform information structure describing how a particular variable has been transformed */
 typedef struct {
-	int varid;       // Copied from ADIOS_VARINFO, since it is needed for some ADIOS_VARTRANSFORM operations
-	int sum_nblocks; // ...
+	int varid;       /* Copied from ADIOS_VARINFO, since it is needed for some ADIOS_VARTRANSFORM operations */
+	int sum_nblocks; /* ... */
 
 	adios_transform_type_t transform_type; /* The data transform applied to this variable */
 
-	int should_free_transform_metadata; // Used internally for free
+	int should_free_transform_metadata; /* Used internally for free */
 
 	/* An array of transform plugin-specific metadata buffers, one for each
        varblock in this file (number of varblocks == ADIOS_VARINFO.sum_nblocks).
@@ -64,8 +68,8 @@ typedef struct {
 	int timestep;
 	int blockidx;
 	int blockidx_in_timestep;
-	ADIOS_SELECTION *pg_bounds_sel;    // it is a global box (offset/start is global)
-	ADIOS_SELECTION *intersection_sel; // it is a global box (offset/start is global)
+	ADIOS_SELECTION *pg_bounds_sel;    /* it is a global box (offset/start is global) */
+	ADIOS_SELECTION *intersection_sel; /* it is a global box (offset/start is global) */
 } ADIOS_PG_INTERSECTION ;
 
 
@@ -76,36 +80,39 @@ typedef struct {
 
 #ifndef __INCLUDED_FROM_FORTRAN_API__
 
-// Sets the "data view" for this ADIOS file, which determines how ADIOS presents variables through
-// adios_inq_var*, and how reads are evaluated in adios_schedule_reads/adios_check_reads calls.
-// Currently, the choice is between a logical and physical view of the data, which only differ for
-// transformed variables; a logical view of a transformed variable presents the data as it was
-// originally written (this is the default), whereas a physical view presents the transformed data
-// as it actually exists on disk.
-// Returns the previous view that was set
+/* Sets the "data view" for this ADIOS file, which determines how ADIOS presents variables through
+ * adios_inq_var*, and how reads are evaluated in adios_schedule_reads/adios_check_reads calls.
+ * Currently, the choice is between a logical and physical view of the data, which only differ for
+ * transformed variables; a logical view of a transformed variable presents the data as it was
+ * originally written (this is the default), whereas a physical view presents the transformed data
+ * as it actually exists on disk.
+ * Returns the previous view that was set
+ */
 data_view_t adios_read_set_data_view(ADIOS_FILE *fp, data_view_t vt);
 
-// Populates data transform information about a given variable into an ADIOS_VARTRANSFORM struct
-// Return NULL if failed
+/* Populates data transform information about a given variable into an ADIOS_VARTRANSFORM struct
+ * Return NULL if failed
+ */
 ADIOS_VARTRANSFORM *  adios_inq_var_transform(const ADIOS_FILE *fp, const ADIOS_VARINFO *varinfo);
 
-// Frees an ADIOS_VARTRANSFORM previous received from a call to adios_inq_var_transform
+/* Frees an ADIOS_VARTRANSFORM previous received from a call to adios_inq_var_transform */
 void adios_free_var_transform(ADIOS_VARTRANSFORM *vartransform);
 
-// Returns the adios_transform_type_t constant for a data transformation method specified
-// by its unique ID, corresponding to the third argument in transforms/transform_plugins.h.
-// For example, to get ISOBAR's type constant:
-//
-// In transforms/transform_plugin.h:
-//   REGISTER_TRANSFORM_PLUGIN(isobar, "isobar", "ncsu-isobar", "ISOBAR compression")
-//                                               ^^^^^^^^^^^^^
-// const adios_transform_type_t ISOBAR_TTYPE = adios_get_transform_type_by_uid("ncsu-isobar");
-//
+/* Returns the adios_transform_type_t constant for a data transformation method specified
+ * by its unique ID, corresponding to the third argument in transforms/transform_plugins.h.
+ * For example, to get ISOBAR's type constant:
+ *
+ * In transforms/transform_plugin.h:
+ *   REGISTER_TRANSFORM_PLUGIN(isobar, "isobar", "ncsu-isobar", "ISOBAR compression")
+ *                                               ^^^^^^^^^^^^^
+ * const adios_transform_type_t ISOBAR_TTYPE = adios_get_transform_type_by_uid("ncsu-isobar");
+ */
 adios_transform_type_t adios_get_transform_type_by_uid(const char *transform_uid);
 
-// Creates a writeblock selection that only retrieves elements [start_elem, start_elem + num_elems)
-// within a variable. An element is a single value of whatever the varaible's datatype is (i.e.,
-// 1 element = 1 double if the variable type is double, 1 byte if the variable type is byte, etc.)
+/* Creates a writeblock selection that only retrieves elements [start_elem, start_elem + num_elems)
+ * within a variable. An element is a single value of whatever the varaible's datatype is (i.e.,
+ * 1 element = 1 double if the variable type is double, 1 byte if the variable type is byte, etc.)
+ */
 ADIOS_SELECTION * adios_selection_writeblock_bounded(int index, uint64_t start_elem, uint64_t num_elems, int is_timestep_relative);
 
 ADIOS_PG_INTERSECTIONS * adios_find_intersecting_pgs(
@@ -116,9 +123,10 @@ int adios_get_absolute_writeblock_index(const ADIOS_VARINFO *varinfo, int timest
 
 void adios_free_pg_intersections(ADIOS_PG_INTERSECTIONS **intersections);
 
-// What is the dimension order of arrays in the file?
-// 0: C ordering (row-major), last dimension is the fastest dimension
-// 1: Fortran ordering (column-major), first dimension is the fastest dimension
+/* What is the dimension order of arrays in the file?
+ * 0: C ordering (row-major), last dimension is the fastest dimension
+ * 1: Fortran ordering (column-major), first dimension is the fastest dimension
+ */
 int adios_read_get_dimension_order (ADIOS_FILE *);
 
 #endif  /*__INCLUDED_FROM_FORTRAN_API__*/
diff --git a/src/public/adios_read_v1.h b/src/public/adios_read_v1.h
index 74ed45e..98287c6 100644
--- a/src/public/adios_read_v1.h
+++ b/src/public/adios_read_v1.h
@@ -15,6 +15,7 @@
 
 #include <stdint.h>
 
+#include "adios_version.h"
 #include "adios_mpi.h"
 #include "adios_read_v1_defs.h"
 #include "adios_types.h"
diff --git a/src/public/adios_read_v2.h b/src/public/adios_read_v2.h
index ad4abc7..6f2f4a9 100644
--- a/src/public/adios_read_v2.h
+++ b/src/public/adios_read_v2.h
@@ -13,10 +13,12 @@
 
 #include <stdint.h>
 
+#include "adios_version.h"
 #include "adios_mpi.h"
 #include "adios_types.h"
 #include "adios_selection.h"
 #include "adios_schema.h"
+#include "adios_link.h"
 #include "adios_read_v2_fwd.h"
 #include "adios_read_ext.h"
 
@@ -56,25 +58,25 @@ struct _ADIOS_FILE {
 };
 
 struct _ADIOS_VARSTAT {
-        void     * min;            /* minimum value in an array variable, = value for a scalar       */
-        void     * max;            /* maximum value of an array variable (over all steps)            */
-        double   * avg;            /* average value of an array variable (over all steps)            */
-        double   * std_dev;        /* standard deviation value of an array variable (over all steps) */
+        void     * min;            /* minimum value in an array variable, = value for a scalar        */
+        void     * max;            /* maximum value of an array variable (over all steps)             */
+        double   * avg;            /* average value of an array variable (over all steps)             */
+        double   * std_dev;        /* standard deviation value of an array variable (over all steps)  */
 
-        struct ADIOS_STAT_STEP     /* per step statistics (if requested and recorded at writing) */
+        struct ADIOS_STAT_STEP     /* per step statistics (if requested and recorded at writing)      */
         {
-            void     ** mins;      /* minimum per each step (array of 'nsteps' elements)             */
-            void     ** maxs;      /* maximum per each step (array of 'nsteps' elements)             */
-            double   ** avgs;      /* average per each step (array of 'nsteps' elements)             */
-            double   ** std_devs;  /* standard deviation per each step (array of 'nsteps' elements)  */
+            void     ** mins;      /* minimum per each step (array of 'nsteps' elements)              */
+            void     ** maxs;      /* maximum per each step (array of 'nsteps' elements)              */
+            double   ** avgs;      /* average per each step (array of 'nsteps' elements)              */
+            double   ** std_devs;  /* standard deviation per each step (array of 'nsteps' elements)   */
         } *steps;
 
-        struct ADIOS_STAT_BLOCK    /* per block statistics (if requested and recorded at writing) */
+        struct ADIOS_STAT_BLOCK    /* per block statistics (if requested and recorded at writing)     */
         {
-            void     ** mins;      /* minimum per each block (array of 'nblocks' elements)         */
-            void     ** maxs;      /* maximum per each block (array of 'nblocks' elements)         */
-            double   ** avgs;      /* average per each block (array of 'nblocks' elements)         */
-            double   ** std_devs;  /* std deviation per each block (array of 'nblocks' elements)   */
+            void     ** mins;      /* minimum per each block (array of 'sum_nblocks' elements)        */
+            void     ** maxs;      /* maximum per each block (array of 'sum_nblocks' elements)        */
+            double   ** avgs;      /* average per each block (array of 'sum_nblocks' elements)        */
+            double   ** std_devs;  /* std deviation per each block (array of 'sum_nblocks' elements)  */
         } *blocks;
 
         struct ADIOS_HIST           /* Histogram if recorded at writing */
@@ -89,14 +91,16 @@ struct _ADIOS_VARSTAT {
 };
 
 struct _ADIOS_VARBLOCK {
-    uint64_t * start;      /* offset start point in global array ('ndim' elements)         */
-    uint64_t * count;      /* local sizes in global array ('ndim' elements)                */
+    uint64_t * start;      /* offset start point in global array ('ndim' elements)                    */
+    uint64_t * count;      /* local sizes in global array ('ndim' elements)                           */
+    uint32_t process_id;   /* a kind of ID of the writing process (likely MPI rank)                   */
+    uint32_t time_index;   /* a kind of timestep info of the writing process >= step of variable      */
 };
 
 enum var_centering
 {
-    point = 1,            // unstructured mesh point centering
-    cell = 2              // unstructured mesh cell centering
+    point = 1,            /* unstructured mesh point centering */
+    cell = 2              /* unstructured mesh cell centering */
 };
 
 struct _ADIOS_VARMESH {
@@ -132,7 +136,7 @@ struct _ADIOS_VARINFO {
 struct _ADIOS_VARCHUNK {
         int                   varid;    /* variable index (0..ADIOS_FILE.nvars-1)              */
         enum ADIOS_DATATYPES  type;     /* type of variable                                    */
-        // NCSU ALACRITY-ADIOS - Added timestep information into varchunks
+        /* NCSU ALACRITY-ADIOS - Added timestep information into varchunks */
         int                   from_steps; /* the first timestep in the returned data             */
         int                   nsteps;     /* the number of timesteps in the returned data        */
         ADIOS_SELECTION     * sel;      /* sub-selection of requested selection                */
@@ -374,6 +378,15 @@ int adios_inq_var_stat (ADIOS_FILE *fp, ADIOS_VARINFO * varinfo,
  */
 int adios_inq_var_blockinfo (ADIOS_FILE *fp, ADIOS_VARINFO * varinfo);
 
+/** Inquiry a link by index
+*       linkid   index of link (0..fp->nlinks-1)
+*                in fp->link_namelist of ADIOS_FILE struct
+*/
+ADIOS_LINK * adios_inq_link_byid (ADIOS_FILE *fp, int linkid);
+
+/** Free memory used by an ADIOS_LINK struct */
+void adios_free_linkinfo (ADIOS_LINK *linkinfo);
+
 /** Inquiry a mesh by index
 *       meshid   index of mesh (0..fp->nmeshes-1)
 *                in fp->mesh_namelist of ADIOS_FILE struct
@@ -438,7 +451,7 @@ int adios_schedule_read_byid (const ADIOS_FILE * fp,
                               int                     nsteps,
                               void                  * data);
 
-// NCSU ALACRITY-ADIOS: Support for those transforms that can change reading behavior (e.g., level-of-detail)
+/* NCSU ALACRITY-ADIOS: Support for those transforms that can change reading behavior (e.g., level-of-detail) */
 int adios_schedule_read_param (const ADIOS_FILE * fp,
                                const ADIOS_SELECTION * sel,
                                const char            * varname,
diff --git a/src/public/adios_schema.h b/src/public/adios_schema.h
index d66d842..3da58dd 100644
--- a/src/public/adios_schema.h
+++ b/src/public/adios_schema.h
@@ -24,22 +24,22 @@ typedef struct
 
 typedef struct
 {
-    int use_single_var;        // 1 means coordinates-single-var,0 means coordinates-multi-var
+    int use_single_var;        /* 1 means coordinates-single-var,0 means coordinates-multi-var */
     int num_dimensions;
     uint64_t * dimensions;
-    char ** coordinates;       // name of the variable(s) containing the rectilinear spacing values
+    char ** coordinates;       /* name of the variable(s) containing the rectilinear spacing values */
 } MESH_RECTILINEAR;
 
 typedef struct
 {
-    int use_single_var;        // 1 means points-single-var, 0 mean points-multi-var
+    int use_single_var;        /* 1 means points-single-var, 0 mean points-multi-var */
     int num_dimensions;
     uint64_t * dimensions;
     int nspaces;
-    char ** points;            // name of the variable(s) containing the point coordinates 
+    char ** points;            /* name of the variable(s) containing the point coordinates  */
 } MESH_STRUCTURED;
 
-// ADIOS Schema: supported cell types
+/* ADIOS Schema: supported cell types */
 enum ADIOS_CELL_TYPE
 {
      ADIOS_CELL_PT         = 1
@@ -56,7 +56,7 @@ typedef struct
 {
     int nspaces;
     uint64_t npoints;
-    int nvar_points;           // how much vars for points-multi-var, 1 for points-single-var
+    int nvar_points;           /* how much vars for points-multi-var, 1 for points-single-var */
     char ** points;
     int ncsets;
     uint64_t * ccounts;
@@ -65,11 +65,11 @@ typedef struct
 } MESH_UNSTRUCTURED;
 
 
-typedef struct {   //type returned by adios_inq_mesh for read method
+typedef struct {   /*type returned by adios_inq_mesh for read method */
     int id;
     char * name;
-    char * file_name; // 0 means mesh struct from the same file, otherwise mesh struct from externel file 
-    int time_varying;           //0 means not time-varying, 1 means time-varying
+    char * file_name; /* 0 means mesh struct from the same file, otherwise mesh struct from externel file  */
+    int time_varying;           /*0 means not time-varying, 1 means time-varying */
     enum ADIOS_MESH_TYPE type;
     union
     {
diff --git a/src/public/adios_selection.h b/src/public/adios_selection.h
index 9564f68..98bbdde 100644
--- a/src/public/adios_selection.h
+++ b/src/public/adios_selection.h
@@ -70,16 +70,17 @@ typedef struct {
 typedef struct { 
     int index;
 
-    // NCSU ALACRITY-ADIOS:
-    //     Adding timestep-relative vs. absolute writeblock selections, as
-    //     well as sub-PG selection support. Both of these are currently only
-    //     used by the transform layer
-    int is_absolute_index;   // 0 if 'index' is relative to the current timestep, != 0
-                             // otherwie (i.e., absolute index)
-    int is_sub_pg_selection; // Whether this writeblock selection contains sub-PG bounds.
-                             // The following fields only matter if this is != 0
-
-    // Reads the linear range of elements in [element_offset, element_offset + nelements)
+    /* NCSU ALACRITY-ADIOS:
+     *     Adding timestep-relative vs. absolute writeblock selections, as
+     *     well as sub-PG selection support. Both of these are currently only
+     *     used by the transform layer
+     */
+    int is_absolute_index;   /* 0 if 'index' is relative to the current timestep, != 0
+                                otherwise (i.e., absolute index) */
+    int is_sub_pg_selection; /* Whether this writeblock selection contains sub-PG bounds.
+                                The following fields only matter if this is != 0 */
+
+    /* Reads the linear range of elements in [element_offset, element_offset + nelements) */
     uint64_t element_offset;
     uint64_t nelements;
 } ADIOS_SELECTION_WRITEBLOCK_STRUCT;
@@ -94,9 +95,9 @@ typedef struct {
 } ADIOS_SELECTION_AUTO_STRUCT;
 
 /** Selection for reading a subset of a variable. 
- *  // A selection is an additive list of bounding boxes and point-sets 
+ *   A selection is an additive list of bounding boxes and point-sets 
  */
-//typedef struct ADIOS_SELECTION_STRUCT  ADIOS_SELECTION;
+/*typedef struct ADIOS_SELECTION_STRUCT  ADIOS_SELECTION; */
 typedef struct { 
        enum ADIOS_SELECTION_TYPE    type; /* Type of selection */
        union {
diff --git a/src/public/adios_types.h b/src/public/adios_types.h
index 4052901..2c0676e 100644
--- a/src/public/adios_types.h
+++ b/src/public/adios_types.h
@@ -32,6 +32,10 @@ enum ADIOS_DATATYPES {adios_unknown = -1             /* (size) */
                      ,adios_string = 9               /* (?) */
                      ,adios_complex = 10             /* (8) */
                      ,adios_double_complex = 11      /* (16) */
+
+                     /* Only for attributes: char** array of strings.
+                        Number of elements must be known externally */
+                     ,adios_string_array = 12        /* (sizeof(char*)) usually 4 */
                      };
 
 enum ADIOS_FLAG {adios_flag_unknown = 0
diff --git a/src/public/adios_version.h b/src/public/adios_version.h
new file mode 100644
index 0000000..39ca8e3
--- /dev/null
+++ b/src/public/adios_version.h
@@ -0,0 +1,41 @@
+/*
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+#ifndef ADIOS_VERSION_H
+#define ADIOS_VERSION_H
+
+/* ADIOS Software release version */
+#define ADIOS_VERSION "1.9.0"
+#define ADIOS_VERSION_MAJOR 1
+#define ADIOS_VERSION_MINOR 9
+#define ADIOS_VERSION_PATCH 0
+
+/* macros for comparing the version */
+#define ADIOS_VERSION_GE(Maj,Min,Pat) \
+       (((ADIOS_VERSION_MAJOR==Maj) && (ADIOS_VERSION_MINOR==Min) && (ADIOS_VERSION_PATCH>=Pat)) || \
+        ((ADIOS_VERSION_MAJOR==Maj) && (ADIOS_VERSION_MINOR>Min)) || \
+        (ADIOS_VERSION_MAJOR>Maj))
+
+#define ADIOS_VERSION_LE(Maj,Min,Pat) \
+       (((ADIOS_VERSION_MAJOR==Maj) && (ADIOS_VERSION_MINOR==Min) && (ADIOS_VERSION_PATCH<=Pat)) || \
+        ((ADIOS_VERSION_MAJOR==Maj) && (ADIOS_VERSION_MINOR<Min)) || \
+        (ADIOS_VERSION_MAJOR<Maj))
+
+/* ADIOS Software release version as strings*/
+#define ADIOS_VERSION_MAJOR_STRING "1"
+#define ADIOS_VERSION_MINOR_STRING "9"
+#define ADIOS_VERSION_PATCH_STRING "0"
+
+/* BP File format version
+ * BP versions 
+ *   1 up until 1.6 release
+ *   2 from 1.7 release: 32 bit variable IDs
+ *   3 from 1.9 release: array attributes
+ */
+#define ADIOS_VERSION_BP_FORMAT 3
+
+#endif
diff --git a/src/public/adios_version.h.in b/src/public/adios_version.h.in
new file mode 100644
index 0000000..2dcbf69
--- /dev/null
+++ b/src/public/adios_version.h.in
@@ -0,0 +1,41 @@
+/*
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+#ifndef ADIOS_VERSION_H
+#define ADIOS_VERSION_H
+
+/* ADIOS Software release version */
+#define ADIOS_VERSION "@VERSION@"
+#define ADIOS_VERSION_MAJOR @VERSION_MAJOR@
+#define ADIOS_VERSION_MINOR @VERSION_MINOR@
+#define ADIOS_VERSION_PATCH @VERSION_MICRO@
+
+/* macros for comparing the version */
+#define ADIOS_VERSION_GE(Maj,Min,Pat) \
+       (((ADIOS_VERSION_MAJOR==Maj) && (ADIOS_VERSION_MINOR==Min) && (ADIOS_VERSION_PATCH>=Pat)) || \
+        ((ADIOS_VERSION_MAJOR==Maj) && (ADIOS_VERSION_MINOR>Min)) || \
+        (ADIOS_VERSION_MAJOR>Maj))
+
+#define ADIOS_VERSION_LE(Maj,Min,Pat) \
+       (((ADIOS_VERSION_MAJOR==Maj) && (ADIOS_VERSION_MINOR==Min) && (ADIOS_VERSION_PATCH<=Pat)) || \
+        ((ADIOS_VERSION_MAJOR==Maj) && (ADIOS_VERSION_MINOR<Min)) || \
+        (ADIOS_VERSION_MAJOR<Maj))
+
+/* ADIOS Software release version as strings*/
+#define ADIOS_VERSION_MAJOR_STRING "@VERSION_MAJOR@"
+#define ADIOS_VERSION_MINOR_STRING "@VERSION_MINOR@"
+#define ADIOS_VERSION_PATCH_STRING "@VERSION_MICRO@"
+
+/* BP File format version
+ * BP versions 
+ *   1 up until 1.6 release
+ *   2 from 1.7 release: 32 bit variable IDs
+ *   3 from 1.9 release: array attributes
+ */
+#define ADIOS_VERSION_BP_FORMAT 3
+
+#endif
diff --git a/src/query/common_query.c b/src/query/common_query.c
index c97ee05..e12ed98 100644
--- a/src/query/common_query.c
+++ b/src/query/common_query.c
@@ -9,7 +9,7 @@
 #include "public/adios_error.h"
 #include "core/common_read.h"
 #include "core/adios_logger.h"
-
+#include "query_utils.h"
 static struct adios_query_hooks_struct * query_hooks = 0;
 
 static int getTotalByteSize (ADIOS_FILE* f, ADIOS_VARINFO* v, ADIOS_SELECTION* sel, 
@@ -45,27 +45,27 @@ static ADIOS_SELECTION* getAdiosDefaultBoundingBox(ADIOS_VARINFO* v)
   return result;
 }
 
+static int query_hooks_initialized = 0;
 void common_query_init()
 {
-    static int did_init = 0;
-    if (!did_init) {
+    if (!query_hooks_initialized) {
         adios_query_hooks_init(&query_hooks);
-        did_init = 1;
+        query_hooks_initialized = 1;
     }
 }
 
 void common_query_finalize()
 {
-    static int did_finalize = 0;
-    if (!did_finalize) {
+    if (query_hooks_initialized) {
         enum ADIOS_QUERY_METHOD m;
         for (m=0; m < ADIOS_QUERY_METHOD_COUNT; m++) {
 	  if (query_hooks[m].adios_query_finalize_fn != NULL) {
 	    query_hooks[m].adios_query_finalize_fn();
 	  }
         }
-        free(query_hooks);
-        did_finalize = 1;
+        // Do not free query_hooks here because they are initialized only once
+        // in common_query_init ---> adios_query_hooks_init()
+        query_hooks_initialized = 0;
     }
 }
 
@@ -164,6 +164,12 @@ static int adios_check_query_at_timestep(ADIOS_QUERY* q, int timeStep)
 	  timeStep = q->file->current_step;
       }
 
+      if (q->varinfo != NULL) {
+	if (q->onTimeStep  == timeStep) {
+	  return timeStep; // returning call to get more values
+	}
+      }
+
       ADIOS_VARINFO* v = common_read_inq_var(q->file, q->varName);
       if (v == NULL) {
 	adios_error (err_invalid_varname, "Query Invalid variable '%s':\n%s",
@@ -184,8 +190,9 @@ static int adios_check_query_at_timestep(ADIOS_QUERY* q, int timeStep)
 	return -1;
       }
 
-      log_debug("%s, raw data size=%ld\n", q->condition, dataSize);
-      q->dataSlice = malloc(total_byte_size);
+      log_debug("%s, raw data size=%llu\n", q->condition, dataSize);
+      //q->dataSlice = malloc(total_byte_size);
+      q->dataSlice = 0;
       q->rawDataSize = dataSize;
 
       return timeStep;
@@ -202,6 +209,7 @@ static int adios_check_query_at_timestep(ADIOS_QUERY* q, int timeStep)
 
 	return -1;
       }
+      q->rawDataSize = ((ADIOS_QUERY*)(q->left))->rawDataSize;
       return leftTimeStep;
     }
 }
@@ -459,7 +467,7 @@ static int isSelectionCompatible(ADIOS_SELECTION* first, ADIOS_SELECTION* second
     const ADIOS_SELECTION_POINTS_STRUCT *pt2 = &(second->u.points);
     
     if (pt1 -> npoints != pt2->npoints) {
-      log_error("Error! point selections have different size. %ld != %ld\n", pt1->npoints, pt2->npoints);
+      log_error("Error! point selections have different size. %llu != %llu\n", pt1->npoints, pt2->npoints);
       return -1;
     }
     return 1;
@@ -547,6 +555,7 @@ ADIOS_QUERY* common_query_combine(ADIOS_QUERY* q1,
     result->right = q2;
     result->combineOp = operator;
 
+    result->rawDataSize = q1->rawDataSize;
     //initialize(result);
     return result;
 }
@@ -768,6 +777,10 @@ int common_query_evaluate(ADIOS_QUERY* q,
 			  uint64_t batchSize, // limited by maxResult
 			  ADIOS_SELECTION** result)
 {  
+	double start = 0, end = 0;
+#ifdef BREAKDOWN
+	start = dclock();
+#endif
   if (q == 0) {
     log_debug("Error: empty query will not be evaluated!");
     return -1;
@@ -816,9 +829,20 @@ int common_query_evaluate(ADIOS_QUERY* q,
     if (query_hooks[m].adios_query_evaluate_fn != NULL) {
       int retval = query_hooks[m].adios_query_evaluate_fn(q, timeStep, batchSize, outputBoundary, result);	      
       if (freeOutputBoundary) common_read_selection_delete(outputBoundary);
+
+#ifdef BREAKDOWN
+      end = dclock();
+      printf("total time [frame + plugin + adios] : %f \n", end - start);
+#endif
       return retval;
     } 
     log_debug ("No selection method is supported for method: %d\n", m);
+
+#ifdef BREAKDOWN
+      end = dclock();
+      printf("total time [frame + plugin + adios] : %f \n", end - start);
+#endif
+
     return -1;
 }
 
diff --git a/src/query/fastbit_adios.c b/src/query/fastbit_adios.c
index 1858646..742f937 100644
--- a/src/query/fastbit_adios.c
+++ b/src/query/fastbit_adios.c
@@ -7,6 +7,264 @@
 
 #include "fastbit_adios.h"
 
+const char* _prefix="";
+
+unsigned long _startMillis = 0;
+unsigned long _milestoneMillis = 0;
+
+//struct timespec _bmsVisits;
+//struct timespec _idxVisits;
+
+CollectionPoint _bmsPoint;
+CollectionPoint _idxPoint;
+CollectionPoint _proPoint; // fastbit_evaluate & getCoordinate
+CollectionPoint _framePoint;
+
+void casestudyLogger_initPoints(CollectionPoint* p) 
+{
+  p->_accumulator.tv_nsec = 0;
+  p->_accumulator.tv_sec = 0;
+
+  p->_counter = 0;
+}
+
+void casestudyLogger_init() 
+{
+  casestudyLogger_initPoints(&_bmsPoint);
+  casestudyLogger_initPoints(&_idxPoint);
+  casestudyLogger_initPoints(&_proPoint);
+  casestudyLogger_initPoints(&_framePoint);
+}
+
+extern void casestudyLogger_print(CollectionPoint* p, const char* msg)
+{
+#ifdef TIMESTUDY
+  printf("%s: %llu sec %llu millisec  accumulated, visited: %lu times \n",  msg,  (unsigned long long)p->_accumulator.tv_sec, (unsigned long long)p->_accumulator.tv_nsec/((unsigned long)1000000), p->_counter);
+#else
+  log_debug("%s: %llu sec %llu millisec  accumulated, visited: %lu times \n",  msg,  (unsigned long long)p->_accumulator.tv_sec, (unsigned long long)p->_accumulator.tv_nsec/((unsigned long)1000000), p->_counter);
+#endif
+}
+
+extern void casestudyLogger_starts(const char* ref)
+{
+  _startMillis = fastbit_adios_getCurrentTimeMillis();
+  _milestoneMillis = 0;
+
+  /*_bmsVisits.tv_nsec=0;
+  _bmsVisits.tv_sec=0;
+  _idxVisits.tv_nsec=0;
+  _idxVisits.tv_sec=0;
+  */
+#ifdef TIMESTUDY
+  printf("==> casestudy %s starts at: %llu sec\n", ref, _startMillis/1000);
+#endif
+}
+
+
+extern void casestudyLogger_bms_print()
+{
+  //printf("bitmap visit took: %llu sec %llu millisec  accumulated \n",  _bmsVisits.tv_sec, _bmsVisits.tv_nsec/((unsigned long)1000000));
+  casestudyLogger_print(&_bmsPoint, "bitmap visit took");
+}
+
+extern void casestudyLogger_idx_print()
+{
+  //printf("idx access took: %llu sec %llu millisec  accumulated \n",  _idxVisits.tv_sec, _idxVisits.tv_nsec/((unsigned long)1000000));
+  casestudyLogger_print(&_idxPoint, "idx access took:");
+}
+
+extern void casestudyLogger_pro_print()
+{
+  //printf("idx access took: %llu sec %llu millisec  accumulated \n",  _idxVisits.tv_sec, _idxVisits.tv_nsec/((unsigned long)1000000));
+  casestudyLogger_print(&_proPoint, "fastbit query process took:");
+}
+
+extern void casestudyLogger_frame_print()
+{
+  //printf("idx access took: %llu sec %llu millisec  accumulated \n",  _idxVisits.tv_sec, _idxVisits.tv_nsec/((unsigned long)1000000));
+  casestudyLogger_print(&_framePoint, "query frame took:");
+}
+
+extern void casestudyLogger_ends(const char* ref)
+{
+  unsigned long endMillis = fastbit_adios_getCurrentTimeMillis();
+  unsigned long diffmillis = endMillis - _startMillis;
+
+#ifdef TIMESTUDY
+  unsigned long diffsec = diffmillis/1000;
+  if (diffsec > 60) {
+    unsigned long diffmin = diffsec/60;
+    diffsec = diffsec - diffmin*60;
+    printf("%s took: %lu millisecs = %lu min & %lu sec \n", ref, diffmillis, diffmin, diffsec);
+  } else {
+    printf("%s took: %lu millisecs = %lu sec\n", ref, diffmillis, diffsec);
+  }
+#endif
+}
+
+extern void casestudyLogger_getRealtime(struct timespec* spec)
+{
+#ifdef CLOCK_MONOTONIC
+  clock_gettime(CLOCK_MONOTONIC, spec);
+#else
+  clock_gettime(CLOCK_REALTIME, spec);
+#endif
+}
+
+extern void casestudyLogger_setPrefix(const char* prefix)
+{
+  _prefix = prefix;
+
+  unsigned long currMillis = fastbit_adios_getCurrentTimeMillis();
+  unsigned long diffMillis = currMillis-_startMillis;
+  unsigned long diffsec = diffMillis/1000;
+
+  unsigned long ministepMillis = currMillis - _milestoneMillis;
+  if (_milestoneMillis == 0) {
+    ministepMillis = diffMillis;
+  } 
+    
+
+#ifdef TIMESTUDY
+  if (diffsec > 60) {
+    unsigned long diffmin = diffsec/60;
+    diffsec = diffsec - diffmin*60;
+    printf("on %s, time passed since start: %lu millisecs = %lu min & %lu sec, ministep=%lu milliseconds \n", prefix, diffMillis, diffmin, diffsec, ministepMillis);
+  } else {
+    printf("on %s, time passed since start: %lu millisecs = %lu sec, ministep=%lu milliseconds\n", prefix, diffMillis, diffsec, ministepMillis);
+  }
+#endif
+  _milestoneMillis = currMillis;
+}
+
+/*
+extern void casestudyLogger_idx_writeout(struct timespec* start, 
+					 //struct timespec* end,
+					 const char* desc)
+{
+  struct timespec end; 
+  casestudyLogger_getRealtime(&end);
+
+  struct timespec diff; 
+
+  diff.tv_nsec = end.tv_nsec - start->tv_nsec; 
+  diff.tv_sec = end.tv_sec - start->tv_sec; 
+
+  if(diff.tv_nsec < 0 ){
+    diff.tv_nsec += 1000000000; 
+    diff.tv_sec = diff.tv_sec - 1;
+  } 
+
+  //printf("%s %s %llu sec %llu nanosec \n", _prefix, desc, diff.tv_sec, diff.tv_nsec);
+
+  _idxVisits.tv_sec  += diff.tv_sec;
+  _idxVisits.tv_nsec += diff.tv_nsec;
+
+  unsigned long sec = _idxVisits.tv_nsec/(unsigned long)1000000000;
+  if (sec > 0) {
+    _idxVisits.tv_sec += sec;
+    _idxVisits.tv_nsec -= sec*((unsigned long)1000000000);
+  } 
+
+}
+
+
+extern void casestudyLogger_bms_writeout(struct timespec* start, 
+                              //struct timespec* end,
+			      const char* desc)
+{
+  struct timespec end; 
+  casestudyLogger_getRealtime(&end);
+
+  struct timespec diff; 
+
+  diff.tv_nsec = end.tv_nsec - start->tv_nsec; 
+  diff.tv_sec = end.tv_sec - start->tv_sec; 
+
+  if(diff.tv_nsec < 0 ){
+    diff.tv_nsec += 1000000000; 
+    diff.tv_sec = diff.tv_sec - 1;
+  } 
+
+  //printf("%s %s %llu sec %llu nanosec \n", _prefix, desc, diff.tv_sec, diff.tv_nsec);
+
+  _bmsVisits.tv_sec  += diff.tv_sec;
+  _bmsVisits.tv_nsec += diff.tv_nsec;
+
+  unsigned long sec = _bmsVisits.tv_nsec/(unsigned long)1000000000;
+  if (sec > 0) {
+    _bmsVisits.tv_sec += sec;
+    _bmsVisits.tv_nsec -= sec*((unsigned long)1000000000);
+  } 
+  //printf("%s %s %llu sec %llu millisec  accumulated \n", _prefix, desc, _bmsVisits.tv_sec, _bmsVisits.tv_nsec/((unsigned long)1000000));
+}
+*/
+
+extern void casestudyLogger_writeout(CollectionPoint* p,
+				     struct timespec* start, 
+				     const char* desc)
+{
+  struct timespec end; 
+  casestudyLogger_getRealtime(&end);
+
+  struct timespec diff; 
+
+  diff.tv_nsec = end.tv_nsec - start->tv_nsec; 
+  diff.tv_sec = end.tv_sec - start->tv_sec; 
+
+  if(diff.tv_nsec < 0 ){
+    diff.tv_nsec += 1000000000; 
+    diff.tv_sec = diff.tv_sec - 1;
+  } 
+
+  //printf("%s %s %llu sec %llu nanosec \n", _prefix, desc, diff.tv_sec, diff.tv_nsec);
+
+  p->_accumulator.tv_sec  += diff.tv_sec;
+  p->_accumulator.tv_nsec += diff.tv_nsec;
+
+  unsigned long sec = p->_accumulator.tv_nsec/(unsigned long)1000000000;
+  if (sec > 0) {
+    p->_accumulator.tv_sec += sec;
+    p->_accumulator.tv_nsec -= sec*((unsigned long)1000000000);
+  } 
+  //printf("%s %s %llu sec %llu millisec  accumulated \n", _prefix, desc, _bmsVisits.tv_sec, _bmsVisits.tv_nsec/((unsigned long)1000000));
+  
+  p->_counter ++;
+}
+
+extern void casestudyLogger_idx_writeout(struct timespec* start, 
+					 //struct timespec* end,
+					 const char* desc)
+{
+  casestudyLogger_writeout(&_idxPoint, start, desc);
+}
+
+extern void casestudyLogger_pro_writeout(struct timespec* start, 
+					 //struct timespec* end,
+					 const char* desc)
+{
+  casestudyLogger_writeout(&_proPoint, start, desc);
+}
+
+extern void casestudyLogger_frame_writeout(struct timespec* start, 
+					 //struct timespec* end,
+					 const char* desc)
+{
+  casestudyLogger_writeout(&_framePoint, start, desc);
+  //printf("%s %llu sec %llu millisec  accumulated \n", desc, _framePoint._accumulator.tv_sec, _framePoint._accumulator.tv_nsec/((unsigned long)1000000));
+}
+
+extern void casestudyLogger_bms_writeout(struct timespec* start, 
+					 //struct timespec* end,
+					 const char* desc)
+{
+  casestudyLogger_writeout(&_bmsPoint, start, desc);
+}
+
+
+//
+//
+//
 long fastbit_adios_getCurrentTimeMillis() 
 {
   time_t          s;  // Seconds
@@ -48,8 +306,8 @@ int fastbit_adios_util_getRelativeBlockNumForPoint(ADIOS_VARINFO* v,  uint64_t*
 	
       ADIOS_VARBLOCK curr = v->blockinfo[i];
       for (j=0; j<v->ndim; j++) {
-	int begin = curr.start[j];
-	int end   = curr.start[j]+curr.count[j];
+	uint64_t begin = curr.start[j];
+	uint64_t end   = curr.start[j]+curr.count[j];
 
 	if ((begin <= point[j]) && (point[j] < end)) {
 	  result = i; // relative to the timestep                                                                                                                                      
@@ -253,6 +511,10 @@ uint64_t fastbit_adios_util_getBlockSize(ADIOS_VARINFO* v, int timestep, int rel
 
   k += relativeBlockIdx;
   
+  if (k > v->sum_nblocks-1) {
+    return 0;
+  }
+
   log_debug("\n blockinfo[%d]: [ ", k);
   
   for (j=0; j<v->ndim; j++) 
@@ -339,6 +601,25 @@ static const char * value_to_string (enum ADIOS_DATATYPES type, void * data, int
   return s;
 }
 
+void getVarNames(char* bmsVarName, char* keyVarName, char* offsetName, ADIOS_VARINFO* v, int timestep, int blockNum) {
+
+  /*
+  sprintf(bmsVarName, "bms-%d-%d-block-%d", v->varid, timestep, blockNum);
+  sprintf(keyVarName, "key-%d-%d-block-%d", v->varid, timestep, blockNum);
+  sprintf(offsetName, "offset-%d-%d-block-%d", v->varid, timestep, blockNum);
+  */
+
+  sprintf(bmsVarName, "bms-%d-%d-box-%d", v->varid, timestep, blockNum);
+  sprintf(keyVarName, "key-%d-%d-box-%d", v->varid, timestep, blockNum);
+  sprintf(offsetName, "offset-%d-%d-box-%d", v->varid, timestep, blockNum);
+
+  /*
+  sprintf(bmsVarName, "bms-%d-%d-%d", v->varid, timestep, blockNum);
+  sprintf(keyVarName, "key-%d-%d-%d", v->varid, timestep, blockNum);
+  sprintf(offsetName, "offset-%d-%d-%d", v->varid, timestep, blockNum);
+  */
+
+}
 //
 //
 // caller frees keys, offsets and bms.
@@ -352,10 +633,14 @@ int fastbit_adios_util_readNoBMSFromIndexFile(ADIOS_FILE* idxFile, ADIOS_VARINFO
   char offsetName[100];
 
   *bmsVarName = malloc(100);
+
+  getVarNames(*bmsVarName, keyVarName, offsetName, v, timestep, blockNum);
+
+  /*
   sprintf(*bmsVarName, "bms-%d-%d-%d", v->varid, timestep, blockNum);
   sprintf(keyVarName, "key-%d-%d-%d", v->varid, timestep, blockNum);
   sprintf(offsetName, "offset-%d-%d-%d", v->varid, timestep, blockNum);
-
+  */
   log_debug("reading from index file: %s for variables: %s %s %s \n", idxFile->path, *bmsVarName, keyVarName, offsetName);
 
   ADIOS_VARINFO * keyV = common_read_inq_var (idxFile, keyVarName);
@@ -409,10 +694,12 @@ int fastbit_adios_util_readFromIndexFile(ADIOS_FILE* idxFile, ADIOS_VARINFO* v,
   char keyVarName[100];
   char offsetName[100];
 
+  getVarNames(bmsVarName, keyVarName,  offsetName, v, timestep, blockNum);
+  /*
   sprintf(bmsVarName, "bms-%d-%d-%d", v->varid, timestep, blockNum);
   sprintf(keyVarName, "key-%d-%d-%d", v->varid, timestep, blockNum);
   sprintf(offsetName, "offset-%d-%d-%d", v->varid, timestep, blockNum);
-
+  */
   log_debug("reading from index file: %s for variables: %s %s %s \n", idxFile->path, bmsVarName, keyVarName, offsetName);
 
   ADIOS_VARINFO * bmsV = common_read_inq_var (idxFile, bmsVarName);
diff --git a/src/query/fastbit_adios.h b/src/query/fastbit_adios.h
index c0cd85d..7008243 100644
--- a/src/query/fastbit_adios.h
+++ b/src/query/fastbit_adios.h
@@ -53,6 +53,12 @@ static int mybmreader(void *ctx, uint64_t start,uint64_t count, uint32_t *buf)
   return 0;
 }
 
+typedef struct {
+  struct timespec _accumulator; // accumate
+  unsigned long   _counter; // how many times collected
+} CollectionPoint; // for logger
+
+
 long fastbit_adios_getCurrentTimeMillis();
 
 int fastbit_adios_util_getRelativeBlockNumForPoint(ADIOS_VARINFO* v,  uint64_t* point, int timestep);
@@ -73,9 +79,26 @@ const char * fastbit_adios_util_value_to_string (enum ADIOS_DATATYPES type, void
 uint64_t fastbit_adios_util_getAdiosBlockSize(ADIOS_VARINFO* v, int k); // k = blockNumber;
 
   
-int fastbit_adio_util_readFromFastbitIndexFile(ADIOS_FILE* idxFile, ADIOS_VARINFO* v, int timestep, int blockNum, 
-					       double** keys, uint64_t* nkeys, int64_t** offsets, uint64_t* no,
-					       uint32_t** bms, uint64_t* nb);
+int fastbit_adios_util_readNoBMSFromIndexFile (ADIOS_FILE* idxFile, 
+                                               ADIOS_VARINFO* v, 
+                                               int timestep, 
+                                               int blockNum, 
+					       double** keys, 
+                                               uint64_t* nk, 
+                                               int64_t** offsets, 
+                                               uint64_t* no,
+					       char** bmsVarName);
+
+int fastbit_adios_util_readFromFastbitIndexFile (ADIOS_FILE* idxFile, 
+                                                 ADIOS_VARINFO* v, 
+                                                 int timestep, 
+                                                 int blockNum, 
+					         double** keys, 
+                                                 uint64_t* nkeys, 
+                                                 int64_t** offsets, 
+                                                 uint64_t* no,
+					         uint32_t** bms, 
+                                                 uint64_t* nb);
   
 #ifdef __cplusplus
 }
diff --git a/src/query/query_alac.c b/src/query/query_alac.c
index 31e7a1a..11e6ee8 100644
--- a/src/query/query_alac.c
+++ b/src/query/query_alac.c
@@ -17,6 +17,7 @@
 #include "transforms/adios_transform_alacrity_common.h"
 #include "core/common_read.h"
 #include "common_query.h"
+#include "query_utils.h"
 //#include <alacrity.h>
 
 
@@ -41,6 +42,12 @@ typedef struct{
 
 #define MAX_DIMS 32
 
+// This three variables are used for timing the transformer layer,
+// the reason of being global variables is because calling transformer layer APIs scatter
+// I have to sum every place that calls transformer layer
+#ifdef BREAKDOWN
+	double gTransformTime = 0.0, transStart =0, transEnd = 0;
+#endif
 
 /**** Funcs. that are internal funcs. ********/
 
@@ -147,16 +154,23 @@ bool isLastConvRidInit(const ADIOS_ALAC_BITMAP *b){
 
 
 /*since we are set data view is physical view, the element size is 1 byte */
-
+//this is a basic read function for other read functions , such as readIndex, readLowOrderBytes, readMeta.
 void readTransformedElms(ADIOS_FILE* fp,ADIOS_VARINFO* vi
 		, int startStep, int numStep
 		, int blockId, uint64_t start_elem, uint64_t num_elems, int is_timestep_relative, void * outputData/*out*/){
 	ADIOS_SELECTION *sel = adios_selection_writeblock_bounded(blockId, start_elem, num_elems, is_timestep_relative);
+#ifdef BREAKDOWN
+	transStart = dclock();
+#endif
+
 	common_read_schedule_read_byid(fp, sel, vi->varid, startStep, numStep, NULL, outputData);
 	common_read_perform_reads(fp, 1);
 	// adios_selection_writeblock_bounded internally malloc data for adios_selection
 	// so I need to free it before the next usage
 	common_read_selection_delete(sel);
+#ifdef BREAKDOWN
+	gTransformTime += (dclock() - transStart) ;
+#endif
 }
 
 void readBlockData(int gBlockId /*global block id */, ADIOS_QUERY * adiosQuery, int startStep,
@@ -166,7 +180,13 @@ void readBlockData(int gBlockId /*global block id */, ADIOS_QUERY * adiosQuery,
 	char * blockData = (char*) (*data);
 	blockData = (char *) malloc(sizeof(char) * dataElmSize * dataElmNum);
 	ADIOS_SELECTION *sel = adios_selection_writeblock_bounded(gBlockId, 0, dataElmNum, 0); // entire PG selection
+#ifdef BREAKDOWN
+	transStart = dclock();
+#endif
 	common_read_schedule_read_byid(adiosQuery->file, sel, varInfo->varid, startStep, 1, NULL, blockData);
+#ifdef BREAKDOWN
+	gTransformTime += (dclock() - transStart) ;
+#endif
 }
 void readIndexData(int blockId, uint64_t offsetSize /*in bytes*/
 		,uint64_t length /*in bytes*/, ADIOS_FILE* fp,ADIOS_VARINFO* vi
@@ -725,10 +745,17 @@ void proc_write_block(int gBlockId /*its a global block id*/, bool isPGCovered,
 	//	assert(tmeta->length == 24);
 
 	adios_transform_alacrity_metadata *alac_metadata = (adios_transform_alacrity_metadata *) malloc(sizeof(adios_transform_alacrity_metadata));
+
+#ifdef BREAKDOWN
+	transStart = dclock();
+#endif
+
 	//the metadata order is alacrity meta, alacrity index, alacrity LoB, raw data (original data)
 	read_alacrity_transform_metadata(tmeta.length, tmeta.content, alac_metadata);
 	//It now assumes LoB along with OD (original data)
-
+#ifdef BREAKDOWN
+	gTransformTime += (dclock() - transStart) ;
+#endif
 
 	//TODO: offset of each PG should be included
 //	printf("PG[%d] has meta size[ %" PRIu64 "], index size[ %" PRIu64 "], and data size[ %" PRIu64 "] \n", blockId, metaSize,  indexSize, dataSize);
@@ -739,6 +766,9 @@ void proc_write_block(int gBlockId /*its a global block id*/, bool isPGCovered,
 	ALMetadata partitionMeta;
 	readPartitionMeta(gBlockId, alac_metadata->meta_size,adiosQuery->file, varInfo
 					,startStep,numStep,&partitionMeta);
+
+
+
 	const uint8_t insigbytes = insigBytesCeil(&partitionMeta);
 
 	//2. find touched bin
@@ -901,6 +931,7 @@ void proc_write_block(int gBlockId /*its a global block id*/, bool isPGCovered,
  */
 ADIOS_ALAC_BITMAP* adios_alac_uniengine(ADIOS_QUERY * adiosQuery, int timeStep, bool estimate) {
 
+
 	if (checkUnsupportedDataType(adiosQuery->varinfo->type)){
 		printf("unsupported data type [%d] at this point \n", adiosQuery->varinfo->type);
 		exit(EXIT_FAILURE);
@@ -912,8 +943,17 @@ ADIOS_ALAC_BITMAP* adios_alac_uniengine(ADIOS_QUERY * adiosQuery, int timeStep,
 
 	ADIOS_VARINFO * varInfo = adiosQuery->varinfo;
 
+#ifdef BREAKDOWN
+	gTransformTime = 0;
+	transStart = dclock();
+#endif
 	adios_read_set_data_view(adiosQuery->file, LOGICAL_DATA_VIEW); // switch to the transform view,
  	ADIOS_VARTRANSFORM *ti = adios_inq_var_transform(adiosQuery->file, varInfo); // this func. will fill the blockinfo field
+
+#ifdef BREAKDOWN
+	gTransformTime += (dclock() - transStart) ;
+#endif
+
 	int startStep = timeStep, numStep = 1;
 	uint64_t totalElm = adiosQuery->rawDataSize; // no matter bounding box or writeblock selection, the rawDataSize has been calculated in the common query layer
 	ADIOS_ALAC_BITMAP *alacResultBitmap =  (ADIOS_ALAC_BITMAP *) malloc(sizeof(ADIOS_ALAC_BITMAP ));
@@ -952,6 +992,10 @@ ADIOS_ALAC_BITMAP* adios_alac_uniengine(ADIOS_QUERY * adiosQuery, int timeStep,
          static uint64_t ZERO[32] = { 0 };
 		 destcount = varInfo->dims;   deststart = ZERO;
 
+#ifdef BREAKDOWN
+	transStart = dclock();
+#endif
+
          if (varInfo->blockinfo == NULL) {
         	 adios_read_set_data_view(adiosQuery->file, LOGICAL_DATA_VIEW);
              common_read_inq_var_blockinfo(adiosQuery->file, varInfo);
@@ -960,6 +1004,10 @@ ADIOS_ALAC_BITMAP* adios_alac_uniengine(ADIOS_QUERY * adiosQuery, int timeStep,
 		adios_read_set_data_view(adiosQuery->file, PHYSICAL_DATA_VIEW);
 		ADIOS_VARTRANSFORM *ti = adios_inq_var_transform(adiosQuery->file, varInfo);
 
+#ifdef BREAKDOWN
+	gTransformTime += (dclock() - transStart) ;
+#endif
+
 		int totalPG = varInfo->nblocks[timeStep];
 		int blockId, j;
 
@@ -1013,9 +1061,19 @@ ADIOS_ALAC_BITMAP* adios_alac_uniengine(ADIOS_QUERY * adiosQuery, int timeStep,
 		printf("]\n");
 
 #endif
+
+
+#ifdef BREAKDOWN
+	transStart = dclock();
+#endif
 		adios_read_set_data_view(adiosQuery->file, PHYSICAL_DATA_VIEW);
 		ADIOS_VARTRANSFORM *ti = adios_inq_var_transform(adiosQuery->file, varInfo);
 		ADIOS_PG_INTERSECTIONS* intersectedPGs = adios_find_intersecting_pgs( adiosQuery->file, varInfo->varid, adiosQuery->sel, timeStep, numStep);
+
+#ifdef BREAKDOWN
+	gTransformTime += (dclock() - transStart) ;
+#endif
+
 		int totalPG = intersectedPGs->npg;
 		int blockId, j;
 
@@ -1067,8 +1125,16 @@ ADIOS_ALAC_BITMAP* adios_alac_uniengine(ADIOS_QUERY * adiosQuery, int timeStep,
 		bool isPGCovered = true; // because they are same bounding boxes, they are fully contained
 
 		if (ti->transform_type == adios_get_transform_type_by_uid("ncsu-alacrity")){
+
+#ifdef BREAKDOWN
+	transStart = dclock();
+#endif
 			adios_read_set_data_view(adiosQuery->file, PHYSICAL_DATA_VIEW); // switch to the transform view,
 			ADIOS_VARTRANSFORM *ti = adios_inq_var_transform(adiosQuery->file, varInfo); // this func. will fill the blockinfo field
+
+#ifdef BREAKDOWN
+	gTransformTime += (dclock() - transStart) ;
+#endif
 			proc_write_block(globalBlockId,isPGCovered,ti, adiosQuery,startStep,estimate,&alacQuery,lb,hb
 					,srcstart, srccount, deststart, destcount,alacResultBitmap,Corder	);
 		}else {
@@ -1095,6 +1161,10 @@ ADIOS_ALAC_BITMAP* adios_alac_uniengine(ADIOS_QUERY * adiosQuery, int timeStep,
 	}
 	// NOTE: this is for correctness of reading info later. We switch back to ensure the end-use are not affected
 	adios_read_set_data_view(adiosQuery->file, LOGICAL_DATA_VIEW);
+
+#ifdef BREAKDOWN
+	printf("ADIOS(transformer layer) read time: %f \n", gTransformTime);
+#endif
 	return alacResultBitmap;
 }
 
@@ -1338,7 +1408,11 @@ int adios_query_alac_evaluate(ADIOS_QUERY* q,
 			       ADIOS_SELECTION* outputBoundry,
 			       ADIOS_SELECTION** queryResult)
 {
+	double alacStart = 0, alacEnd = 0;
 
+#ifdef BREAKDOWN
+	alacStart = dclock();
+#endif
 	if (!isInitialized){ // if this is the very first time of calling the queries, we initialize the lookup tables
 		init_lookup();
 		isInitialized= 1;
@@ -1380,6 +1454,11 @@ int adios_query_alac_evaluate(ADIOS_QUERY* q,
 	FreeALACBITMAP(b);
 	q->resultsReadSoFar += retrievalSize;
 
+#ifdef BREAKDOWN
+	alacEnd= dclock();
+	printf("time [alac plugin + adios] : %f \n", alacEnd - alacStart);
+#endif
+
 	return q->resultsReadSoFar < q->maxResultsDesired;
 }
 
diff --git a/src/query/query_fastbit.c b/src/query/query_fastbit.c
index 40a24ba..16fd959 100644
--- a/src/query/query_fastbit.c
+++ b/src/query/query_fastbit.c
@@ -9,6 +9,476 @@
 #include <iapi.h>
 #include <math.h>
 
+#define BITARRAY
+#define INT_BIT 32
+
+#define BITMASK(b) (1 << ((b) % INT_BIT))
+#define BITSLOT(b) ((b) / INT_BIT)
+#define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b))
+#define BITCLEAR(a, b) ((a)[BITSLOT(b)] &= ~BITMASK(b))
+#define BITTEST(a, b) ((a)[BITSLOT(b)] & BITMASK(b))
+#define BITNSLOTS(nb) ((nb + INT_BIT - 1) / INT_BIT)
+
+
+int64_t getPosInBox(const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* sel, int n, uint64_t* spatialCoordinates, int fortran_order);
+int64_t getPosInVariable(const ADIOS_VARINFO* v, int n, uint64_t* spatialCoordinates, int fortran_order);
+
+void getHandleFromBlockAtLeafQuery(int timeStep, int blockIdx, ADIOS_FILE* idxFile, ADIOS_QUERY* q, uint64_t blockSize);
+
+FastBitSelectionHandle createHandle(ADIOS_QUERY* q, const char* registeredArrayName);
+
+static inline void scan_r2(int dim, const uint64_t* const dimSize, uint64_t pos,  uint64_t * const result, uint64_t* const scan_start, int d, uint64_t curr0, uint64_t base)
+{
+  uint64_t i=0;
+
+  if (d == dim-1) {
+    result[d] = pos - curr0;
+    return;
+  }
+
+  for (i=scan_start[d]; i<dimSize[d]; i++) {      
+    uint64_t curr = i*base+curr0;
+    uint64_t next = curr+base;
+
+    if (pos >= next) {
+      continue;
+    }
+      
+    result[d] = i;
+    if (i > scan_start[d]) {
+      scan_start[d+1] = 0;      
+    }
+    
+    if (d+1 == dim -2) {
+      uint64_t k = 0;
+      for (k=scan_start[dim-2]; k<dimSize[dim-2]; k++) {
+	uint64_t curr1 = k*dimSize[dim-1]+curr;
+	uint64_t next1 = curr1+dimSize[dim-1];
+	if (pos >= next1) {
+	  continue;
+	}
+	result[dim-2] = k;
+	result[dim-1] = pos-curr1;
+	return;
+      }
+    } else if (d+1 == dim-1)  { // save a recursive step
+      result[dim-1] = pos-curr; 
+      return;
+    } else if (d+1 < dim-2) {
+      uint64_t base2=base/dimSize[d+1];
+      scan_r2(dim, dimSize, pos, result, scan_start, d+1, curr, base2);
+    } 
+    break;
+  }  
+
+}
+
+
+static inline void scan3d(const uint64_t* const dimSize, uint64_t pos,  uint64_t * const result, uint64_t* const scan_start)
+{
+
+  int i,j,k;
+
+  int base=dimSize[1]*dimSize[2];
+
+  for (i=scan_start[0]; i<dimSize[0]; i++) {
+    int curr = i*base;
+    int next = curr+base;
+
+    if (pos >= next) {
+      continue;
+    }
+      
+    result[0] = i;
+    if (i > scan_start[0]) {
+      scan_start[1] = 0;
+    }
+
+    for (j=scan_start[1]; j<dimSize[1]; j++) {
+      int curr2 = curr+j*dimSize[2];
+      int next2 = curr2+dimSize[2];
+      if (pos >= next2) {
+	continue;
+      }
+      result[1] = j;
+      result[2] = pos-curr2;
+      return;
+    }
+  }
+}
+
+static inline void scan2d(const uint64_t* const dimSize, uint64_t pos,  uint64_t * const result, uint64_t* const scan_start)
+{
+
+  int i,j;
+
+  int base=dimSize[1];
+
+  for (i=scan_start[0]; i<dimSize[0]; i++) {
+    int curr = i*base;
+    int next = curr+base;
+
+    if (pos >= next) {
+      continue;
+    }
+      
+    result[0] = i;
+    result[1] = pos-curr;
+    return;
+  }
+}
+
+
+static void simple_scan(int64_t* coordinateArray, uint64_t start, uint64_t count, 
+			ADIOS_VARINFO* v, uint64_t* blockstart, uint64_t* blockcount,const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb)
+{
+  if (v->ndim == 1) { // to do: check
+      uint64_t i = 0;
+      uint64_t pos = 0; // pos in variable
+      for (i=0; i<count; i++) {
+	   pos = coordinateArray[i+start] + blockstart[0];
+	   if (bb == NULL) {
+	     coordinateArray[i+start] = pos;
+	   } else {
+	     coordinateArray[i+start] = pos - bb->start[0];
+	   }
+      }
+      return;
+  }
+
+  if (v->ndim == 2) {
+    uint64_t scan_start[2] = {0,0};
+    uint64_t result[2] = {0,0};
+    uint64_t pos = 0; // pos in variable
+    uint64_t i=0;
+    for (i=0; i<count; i++) {
+         pos = coordinateArray[i+start];     
+	 scan2d(blockcount, pos, result, scan_start) ;      
+	 scan_start[0] = result[0];
+	 
+	 result[0] += blockstart[0];
+	 result[1] += blockstart[1];
+	 if (bb != NULL) {
+	   coordinateArray[i+start] = getPosInBox(bb, bb->ndim, result, 0); 
+	 } else {
+	   coordinateArray[i+start] = getPosInVariable(v, v->ndim, result, 0); 
+	 }
+    }
+    return;
+  }
+
+  if (v->ndim == 3) {
+    uint64_t scan_start[3] = {0,0,0}; //{blockstart[0],blockstart[1], blockstart[2]};
+    uint64_t result[3] = {0,0,0};
+    uint64_t pos = 0; // pos in variable
+    uint64_t i=0;
+    for (i=0; i<count; i++) {
+         pos = coordinateArray[i+start];     
+	 scan3d(blockcount, pos, result, scan_start) ;      
+	 scan_start[0] = result[0];
+	 scan_start[1] = result[1];
+	 
+	 result[0] += blockstart[0];
+	 result[1] += blockstart[1];
+	 result[2] += blockstart[2];
+	 
+	 if (bb != NULL) { 
+	   coordinateArray[i+start] = getPosInBox(bb, bb->ndim, result, 0); 
+	 } else {
+	   coordinateArray[i+start] = getPosInVariable(v, v->ndim, result, 0); 
+	 }
+
+	 //printf(" %llu, %llu pos=%llu, (%llu, %llu, %llu) => [%lld] = %lld  \n", i, start, pos, result[0], result[1], result[2], i+start, coordinateArray[i+start]);
+    }
+  }
+}
+
+static void arraymath_assign(uint64_t* left, uint64_t* right, int size)
+{
+  int i;
+  for (i=0; i<size; i++) {
+    left[i] = right[i];
+  }
+}
+
+static void arraymath_pluseq(uint64_t* left, uint64_t* right, int size)
+{
+  int i;
+  for (i=0; i<size; i++) {
+    left[i] += right[i];
+  }
+}
+
+static void arraymath_init(uint64_t* left,  int size)
+{
+  int i;
+  for (i=0; i<size; i++) {
+    left[i] = 0;
+  }  
+}
+
+
+static void recursive_scan(int64_t* coordinateArray, uint64_t start, uint64_t count, ADIOS_VARINFO* v, 
+			   uint64_t* blockstart, uint64_t* blockcount,const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb)
+{
+
+  uint64_t scan_start[v->ndim]; 
+  uint64_t result[v->ndim];
+
+  arraymath_init(scan_start, v->ndim);
+  arraymath_init(result, v->ndim);
+
+  uint64_t i=0; 
+  uint64_t pos = 0;
+
+  uint64_t startBase=1;
+  for (i=1; i<v->ndim; i++) {
+    startBase *= blockcount[i];
+  }
+
+  for (i=0; i<count; i++) {
+      pos = coordinateArray[i+start];     
+      scan_r2(v->ndim, blockcount,  pos, result, scan_start, 0, 0, startBase) ;      
+
+      arraymath_assign(scan_start, result, v->ndim);	 
+      arraymath_pluseq(result, blockstart, v->ndim);
+
+      if (bb != NULL) { 
+	coordinateArray[i+start] = getPosInBox(bb, bb->ndim, result, 0); 
+      } else {
+	coordinateArray[i+start] = getPosInVariable(v, v->ndim, result, 0); 
+      }
+  } 
+}
+
+static void fastscan(int64_t* coordinateArray, uint64_t start, uint64_t count, ADIOS_VARINFO* v, uint64_t* blockstart, uint64_t* blockcount,
+		     const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb)
+{
+  if (v->ndim <= 3) {
+    simple_scan(coordinateArray, start, count, v, blockstart, blockcount, bb);
+  } else {
+    recursive_scan(coordinateArray, start, count, v, blockstart, blockcount, bb);
+  }
+}
+
+//
+// map pos back to coordinates
+//
+static inline void posToSpace(uint64_t pos, const int isFortranClient,  
+			     const uint64_t * const dimSize , uint64_t * const coordinates, const int dim,  const uint64_t* const start) {
+  uint32_t i;
+  uint64_t curr = pos;
+
+  if (isFortranClient) {  
+    for (i = 0; i < dim; i++) {
+       uint64_t temp0 = curr/dimSize[i];
+       uint64_t temp1 = curr-temp0*dimSize[i];
+
+       coordinates[i] = temp1 + start[i];
+       curr = temp0;
+       //coordinates[i] = curr % dimSize[i]+start[i];
+       //curr /= dimSize[i];
+    }
+  } else {    
+    // note using i from dim to 1 b/c i is uint32, will not be -1 for 0--.
+    // use unsigned to save compute time on div
+    for (i = dim ; i >= 1; i--) {
+       uint64_t temp0 = curr/dimSize[i-1];
+       uint64_t temp1 = curr-temp0*dimSize[i-1];
+       coordinates[i-1] = temp1 + start[i-1];
+       curr = temp0;
+    }
+  }
+}
+
+
+uint32_t* bitarray_create(uint64_t max) 
+{
+  //uint32_t* result = malloc(BITNSLOTS(max) * sizeof(uint32_t));
+  //memset(result, 0, BITNSLOTS(max));
+  //uint32_t* result = (uint32_t *)calloc(0, BITNSLOTS(max) * sizeof(uint32_t));
+  uint32_t* result = (uint32_t *)calloc(BITNSLOTS(max),  sizeof(uint32_t));
+  return result;
+}
+
+void bitarray_unsetbit(uint32_t* array, uint64_t pos)
+{
+  BITCLEAR(array, pos);
+}
+void bitarray_setbit(uint32_t* array, uint64_t pos)
+{
+  BITSET(array, pos);
+}
+
+static const unsigned char BitsSetTable256[256] = 
+  {
+#   define B2(n) n,     n+1,     n+1,     n+2
+#   define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
+#   define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
+    B6(0), B6(1), B6(1), B6(2)
+  };
+
+//unsigned int v; // count the number of bits set in 32-bit value v
+uint32_t getSetBits(uint32_t v) 
+{
+  uint32_t c = 0; // c is the total bits set in v
+
+  // Option 1:
+  c = BitsSetTable256[v & 0xff] + 
+    BitsSetTable256[(v >> 8) & 0xff] + 
+    BitsSetTable256[(v >> 16) & 0xff] + 
+    BitsSetTable256[v >> 24]; 
+  
+  /*
+  // Option 2:
+  unsigned char * p = (unsigned char *) &v;
+  c = BitsSetTable256[p[0]] + 
+  BitsSetTable256[p[1]] + 
+  BitsSetTable256[p[2]] +
+  BitsSetTable256[p[3]];
+  */
+  return c;
+}
+
+uint64_t  bitarray_countHits(uint32_t* bitarray, uint64_t size) {
+  struct timespec startT;
+  casestudyLogger_getRealtime(&startT);
+
+  uint64_t  i=0;
+  uint64_t countHitser = 0;
+  for (i=0; i<size; i++) {    
+    countHitser += getSetBits(bitarray[i]);
+  }
+
+  //casestudyLogger_writeout(&startT, "count bit array hits ");
+  casestudyLogger_frame_writeout(&startT, "count bit");
+  return countHitser;
+}
+
+
+uint64_t  bitarray_getHits(uint32_t* bitarray, uint64_t* result, uint64_t size, uint64_t start, uint64_t count)
+{
+  //  printf("\n==> start=%ld count = %ld \n", start, count);
+
+  if (bitarray == NULL) {
+    return -1;
+  }
+
+  uint64_t i, j;
+  uint64_t hitCounter = 0;    
+  uint64_t collected = 0;
+
+  for (i=0; i<size; i++) {
+    int currCount = getSetBits(bitarray[i]);
+    if (hitCounter + currCount > start) {
+       for (j=0; j<INT_BIT; j++) {
+	    uint64_t bitpos = i*INT_BIT+j;
+	    if (BITTEST(bitarray, bitpos)) {
+	      hitCounter += 1;
+	      if (hitCounter > start) {
+		  result[collected] = bitpos;
+		  collected ++;
+		  //printf("bit at %ld is  hit: %ld. ref: [ %ld th]\n", bitpos, hitCounter, collected);
+	      }
+	      if (collected  == count) {
+		return collected;
+	      }
+	    }
+       }
+      break; 
+    } 
+    hitCounter += currCount;    
+  }
+
+  hitCounter += collected;
+  //printf(" hit counter check: %ld\n", hitCounter);
+
+  uint64_t rock = i+1;
+  uint64_t lastrock = 0;
+
+  for (i=rock; i<size; i++) {
+    int currCount = getSetBits(bitarray[i]);
+    if (collected + currCount > count) {
+      lastrock = i;
+      break;
+    } 
+    //collected += currCount;
+    for (j=0; j<INT_BIT; j++) {
+         uint64_t bitpos = i*INT_BIT + j;
+	 if (BITTEST(bitarray, bitpos)) {
+	   result[collected] = bitpos;
+	   collected++;
+	 }
+    }
+  }
+
+  hitCounter += collected;
+  //  printf(" hit counter check: %ld, collected: %ld\n", hitCounter, collected);
+
+  if (lastrock == 0) {
+    //printf("done. \n");
+    return collected;
+  }
+
+  // check the last rock
+  rock = i; 
+  for (i=0; i<INT_BIT; i++) {
+    uint64_t bitpos = rock*INT_BIT + i;
+    if (BITTEST(bitarray, bitpos)) {
+        result[collected] = bitpos;
+        collected ++; 
+	//printf("bit at %ld is  hit: %ld. ref: %ld th\n ", bitpos, hitCounter+collected, collected);
+    }
+    if (collected == count) {
+      break;
+    }
+  }
+
+  return collected;
+}
+ 
+
+uint64_t  bitarray_countHitsNative(uint64_t max, uint32_t* bitarray1) {
+  uint64_t countHitser = 0;				
+  uint64_t i;
+
+  // printf("array size= %ld \n", BITNSLOTS(max));
+  for (i=0; i<max; i++) {
+    if (BITTEST(bitarray1, i)) {
+      //printf(" ==> bit at: %ld is set. \n",i);
+      countHitser ++;
+    }
+  }
+
+  //printf("%ld\n", countHitser);
+  return countHitser;
+}
+
+void bitarray_or(uint32_t* bitarray0, uint32_t* bitarray1, uint32_t* bitarray3, uint64_t arraysize)
+{
+  uint64_t i;
+  for (i=0; i<arraysize; i++) {
+    bitarray3[i] = bitarray0[i] | bitarray1[i];
+  }  
+}
+
+void bitarray_and(uint32_t* bitarray0, uint32_t* bitarray1, uint32_t* bitarray3, uint64_t arraysize)
+{
+  uint64_t i;
+  for (i=0; i<arraysize; i++) {
+    bitarray3[i] = bitarray0[i] & bitarray1[i];
+  }  
+}
+
+
+
+
+
+
+
+
+
+
 
 typedef struct {
   double* _keys; 
@@ -24,9 +494,9 @@ typedef struct {
  
 
 ADIOS_QUERY* getFirstLeaf(ADIOS_QUERY* q);
-void getHandle(int timeStep, int blockIdx, ADIOS_FILE* idxFile, ADIOS_QUERY* q);
-
+void getHandle(int timeStep, int blockIdx, ADIOS_FILE* idxFile, ADIOS_QUERY* q, uint64_t blockSize);
 
+//#define __READ_BMS_AS_NEEDED__
 
 /** A simple reader to be used by FastBit for index reconstruction.  In
     this simple case, the first argument is the whole array storing all the
@@ -38,7 +508,10 @@ void getHandle(int timeStep, int blockIdx, ADIOS_FILE* idxFile, ADIOS_QUERY* q);
 //
 static int adios_bmreader(void *ctx, uint64_t start,uint64_t count, uint32_t *buf)
 {
-#ifdef _READ_BMS_AS_NEEDED
+  struct timespec startT;
+  casestudyLogger_getRealtime(&startT);
+
+#ifdef __READ_BMS_AS_NEEDED__
   FASTBIT_INTERNAL* itn = (FASTBIT_INTERNAL*)ctx;
   // read bms from start to count:
   ADIOS_VARINFO * bmsV = common_read_inq_var (itn->_idxFile, itn->_bmsVarName);
@@ -52,6 +525,8 @@ static int adios_bmreader(void *ctx, uint64_t start,uint64_t count, uint32_t *bu
   common_read_free_varinfo(bmsV);
   common_read_selection_delete(bmsSel);
 
+  //casestudyLogger_bms_writeout(&startT, 
+  casestudyLogger_bms_writeout(&startT, "bmreader_adv visited ");
   return 0;
 #else
   const uint32_t *bms = (uint32_t*)ctx + start;
@@ -59,8 +534,12 @@ static int adios_bmreader(void *ctx, uint64_t start,uint64_t count, uint32_t *bu
   for (j = 0; j < count; ++ j) {
     buf[j] = bms[j];
   }
+
+  //casestudyLogger_bms_writeout(&startT, "bmreader visited ");
+  casestudyLogger_bms_writeout(&startT, "bmreader visited ");
   return 0;
 #endif
+
 }
 
 
@@ -95,7 +574,13 @@ void create_fastbit_internal (ADIOS_QUERY* q)
       const char* basefileName = f->path;
 
       MPI_Comm comm_dummy = MPI_COMM_SELF;
+      
+      struct timespec idxStartT;
+      casestudyLogger_getRealtime(&idxStartT);
+
       ADIOS_FILE* idxFile = fastbit_adios_util_getFastbitIndexFileToRead(basefileName, comm_dummy);
+      casestudyLogger_idx_writeout(&idxStartT, "index file loaded ");
+
       create_fastbit_internal_idxFile (q, idxFile);
   }
 }
@@ -262,10 +747,10 @@ void getCoordinateFromPoints(uint64_t pos, const ADIOS_SELECTION_POINTS_STRUCT*
   }
 }
 
-
+/*
 void getCoordinateFromBlock(uint64_t pos, const ADIOS_VARBLOCK* sel, int n, uint64_t* coordinates, int blockDim) 
-{
-  int fortran_order = futils_is_called_from_fortran();
+{  
+  int fortran_order = futils_is_called_from_fortran(); 
   int dimToSlice = n-1;
 
   if (fortran_order == 1) {
@@ -275,23 +760,23 @@ void getCoordinateFromBlock(uint64_t pos, const ADIOS_VARBLOCK* sel, int n, uint
   //  log_debug("getCoordinateFromBlock: pos = %lld, n=%d, fortran_order? %d, dimToSlice %d\n", pos, n, fortran_order, dimToSlice);
   if (n == 1) {
       coordinates[n-1] = pos + sel->start[dimToSlice];
-      log_debug("     coordinate [%d]=%lld\n", n-1, coordinates[n-1]);
+      //log_debug("     coordinate [%d]=%lld\n", n-1, coordinates[n-1]);
       return ;
   } 
- 
+
   uint64_t lastDimSize= sel->count[dimToSlice];     
-  uint64_t res  = pos % lastDimSize;
+  uint64_t res  = pos % lastDimSize;  // time consuming 25%
 
-  //log_debug("      lastDim = %lld, res=%d \n", lastDimSize, res);
   coordinates[n-1] = res + sel->start[dimToSlice];
   uint64_t stepUp = (pos - res)/lastDimSize;
 
-  log_debug("      coordinate [%d]=%lld\n", n-1, coordinates[n-1]);
+  //log_debug("      coordinate [%d]=%lld\n", n-1, coordinates[n-1]);
   getCoordinateFromBlock(stepUp, sel, n-1, coordinates, blockDim);  
 }
-
+*/
 //check point coordinates
 //offset in the bounding box needs to be taken account
+ /*
 void getCoordinateFromBox(uint64_t pos, const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* sel, int n, uint64_t* coordinates) 
 {
   int fortran_order = futils_is_called_from_fortran();
@@ -320,7 +805,7 @@ void getCoordinateFromBox(uint64_t pos, const ADIOS_SELECTION_BOUNDINGBOX_STRUCT
 
   getCoordinateFromBox(stepUp, sel, n-1, coordinates);  
 }
-
+ */
 void getCoordinateFromVariable(uint64_t pos, const ADIOS_VARINFO* var, int n, uint64_t* coordinates) 
 {
   if (n == 1) {
@@ -331,142 +816,1407 @@ void getCoordinateFromVariable(uint64_t pos, const ADIOS_VARINFO* var, int n, ui
   uint64_t lastDimSize= var->dims[n-1];
   uint64_t res  = pos % lastDimSize;
 
-  coordinates[n-1] = res;
-  uint64_t stepUp = (pos - res)/lastDimSize;
+  coordinates[n-1] = res;
+  uint64_t stepUp = (pos - res)/lastDimSize;
+
+  getCoordinateFromVariable(stepUp, var, n-1, coordinates);  
+}
+
+
+/* static ADIOS_VARINFO* getAdiosVariable(ADIOS_FILE* f, const char* varName)
+{
+  ADIOS_VARINFO * v = common_read_inq_var(f, varName);
+
+  if (v != NULL) {
+    log_debug("  found variable [%s] in file\n", varName);
+    return v;
+  } 
+
+  return NULL;
+}*/
+
+
+
+//
+// Initialization is private business, Finalize is called by ADIOS when read is finalized
+//
+static int is_method_initialized = 0;
+static void adios_query_fastbit_init() 
+{
+  const char* conffile = 0;
+#ifdef DEBUG
+  int msglvl = 200;
+#else
+  int msglvl = 0;
+#endif
+  if (!is_method_initialized) {
+      fastbit_init(conffile);
+      fastbit_set_verbose_level(msglvl);
+      log_debug("[fastbit has initialized with verbosity level = %d]\n", msglvl);
+      is_method_initialized = 1;
+  }
+}
+
+int adios_query_fastbit_finalize()
+{
+  if (is_method_initialized) {
+      fastbit_iapi_free_all();
+      fastbit_cleanup();
+      is_method_initialized = 0;
+  }
+  return 0;
+}
+
+ 
+
+int64_t getPosInBox(const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* sel, int n, uint64_t* spatialCoordinates, int fortran_order) 
+{
+  if (sel->ndim <= 0) {
+    return -1;
+  }
+
+  //int fortran_order = futils_is_called_from_fortran();
+
+  int i=0;
+  if (n == sel->ndim) { // check validation once
+    for (i=0; i<sel->ndim; i++) {
+      int matchingBoxDim = i;
+      if (fortran_order == 1) {
+	matchingBoxDim = sel->ndim - 1 - i;
+      }
+      uint64_t min = sel->start[matchingBoxDim];
+      uint64_t max = sel->count[matchingBoxDim] + min;
+      if (spatialCoordinates[i] >= max) {
+	return -1;
+      }
+      if (spatialCoordinates[i] < min) {
+	return -1;
+      } 
+    }
+  }
+
+  // spatial Coordinate is valid
+
+  if (fortran_order == 1) {
+    int matchingBoxDim = sel->ndim  - n;
+     if (n == 1) {
+       //log_debug("n=1, c[0]=%lld ,  start[%d]=%lld", spatialCoordinates[0], matchingBoxDim, sel->start[matchingBoxDim]);
+       return spatialCoordinates[0] - sel->start[matchingBoxDim];
+     }
+     //log_debug("n=%d, c[n-1]=%lld, start/count[%d]= %lld/%lld \n", n, spatialCoordinates[n-1], matchingBoxDim, sel->start[matchingBoxDim], sel->count[matchingBoxDim]);
+     return (spatialCoordinates[n-1]- sel->start[matchingBoxDim]) + sel->count[matchingBoxDim] * getPosInBox(sel, n-1, spatialCoordinates, fortran_order);
+  } else {
+     if (n == 1) {
+        return spatialCoordinates[0]-sel->start[0];    
+     }
+     return (spatialCoordinates[n-1]-sel->start[n-1]) + sel->count[n-1]*getPosInBox(sel, n-1, spatialCoordinates, fortran_order);
+  }
+}
+
+int64_t getPosInVariable(const ADIOS_VARINFO* v, int n, uint64_t* spatialCoordinates, int fortran_order) 
+{
+  if (v->ndim <= 0) {
+    return -1;
+  }
+
+  //  log_debug("getPosInVariables() v->dim[0]=%d sp[%d]=%lld\n", v->dims[0], n-1, spatialCoordinates[n-1]);
+
+  if (n == 1) {
+      return spatialCoordinates[0];
+  }
+
+  if (fortran_order == 1) {
+    int matchingBoxDim = v->ndim  - n;
+    return (spatialCoordinates[n-1]) + v->dims[matchingBoxDim] * getPosInVariable(v, n-1, spatialCoordinates, fortran_order);
+  } else {
+    return  spatialCoordinates[n-1] + v->dims[n-1]*getPosInVariable(v, n-1, spatialCoordinates, fortran_order); 
+  }
+}
+
+
+int isSameRegion(const ADIOS_VARINFO* v, const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb, int timestep)
+{
+  if (v->sum_nblocks > 1) {
+    return 0;
+  }
+
+  if (v->nsteps > 1) { // non streaming case
+    if (v->nblocks[timestep] > 1)  // bb = block for this timestep
+      return 0;
+  }
+
+  if (bb == NULL) {
+    return 1;
+  }
+
+  int i=0;
+  for (i=0; i<v->ndim; i++) {
+    if (bb->start[i] != 0) {
+      return 0;
+    }      
+    if (v->dims[i] != bb->count[i]) {
+      return 0;
+    }
+  }
+  return 1;
+}
+
+//
+// absBlockIdx is needed as this is what blockinfo[] takes to get measure of a block (in order to coordinates from a given 1-d pos)
+//
+int64_t getRelativeIdx(uint64_t currPosInBlock,  const ADIOS_VARINFO* v, const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb, int absBlockIdx, int timestep)
+{
+  ADIOS_VARBLOCK* blockSel = &(v->blockinfo[absBlockIdx]);
+
+  // only calculates when more than one block presented
+    int isFortranClient = futils_is_called_from_fortran();
+    if (bb == NULL) {
+        uint64_t spatialCoordinates[v->ndim];
+	posToSpace(currPosInBlock, isFortranClient, blockSel->count, spatialCoordinates, v->ndim, blockSel->start);
+	return getPosInVariable(v, v->ndim, spatialCoordinates, isFortranClient);      
+    } else {      
+       uint64_t spatialCoordinates[bb->ndim];        
+       posToSpace(currPosInBlock, isFortranClient, blockSel->count, spatialCoordinates, bb->ndim, blockSel->start);
+       return getPosInBox(bb, bb->ndim, spatialCoordinates, isFortranClient);
+    }
+}
+
+/*
+int64_t getRelativeIdxInBoundingBox(uint64_t currPosInBlock, const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb, const ADIOS_VARBLOCK* blockSel)
+{
+    uint64_t spatialCoordinates[bb->ndim];    
+    //getCoordinateFromBlock(currPosInBlock, blockSel, bb->ndim, spatialCoordinates, bb->ndim);
+    
+    int isFortranClient = futils_is_called_from_fortran();
+    posToSpace(currPosInBlock, isFortranClient, blockSel->count, spatialCoordinates, bb->ndim, blockSel->start);
+    return getPosInBox(bb, bb->ndim, spatialCoordinates, isFortranClient);
+}
+
+int64_t getRelativeIdxInVariable(uint64_t currPosInBlock, const ADIOS_VARINFO* v, const ADIOS_VARBLOCK* blockSel)
+{
+    uint64_t spatialCoordinates[v->ndim];
+    //getCoordinateFromBlock(currPosInBlock, blockSel, v->ndim, spatialCoordinates, v->ndim);
+    int isFortranClient = futils_is_called_from_fortran();
+    posToSpace(currPosInBlock, isFortranClient, blockSel->count, spatialCoordinates, v->ndim, blockSel->start);
+
+    return getPosInVariable(v, v->ndim, spatialCoordinates, isFortranClient);
+}
+*/
+//
+// the calculated block start/end  are relative to given timestep
+//
+int getBlockCoveredOnBB(int* blockStart, int* blockEnd, uint64_t* sumBlocksBeforeThisTimeStep, ADIOS_QUERY* q, int timeStep)
+{
+    ADIOS_SELECTION* sel = q->sel;
+    ADIOS_VARINFO* v = q->varinfo;
+
+    int i=0;
+    const ADIOS_SELECTION_BOUNDINGBOX_STRUCT *bb = NULL;
+    if (sel == NULL) {
+        *blockStart=0;
+	if (v->nsteps == 1) { // could be streaming open
+	  *blockEnd = v->nblocks[0]-1;
+	} else {
+	  *blockEnd = v->nblocks[timeStep] -1;      
+	}
+	log_debug(" got blockStart = %d, blockEnd = %d\n", *blockStart, *blockEnd);
+    } else {
+        bb = &(sel->u.bb);      
+	if (v->blockinfo == NULL) {
+	  common_read_inq_var_blockinfo(q->file, v);
+	}
+	*blockStart = fastbit_adios_util_getRelativeBlockNumForPoint(v,bb->start,timeStep);
+	uint64_t end[v->ndim];
+	for (i=0; i<v->ndim; i++) {
+	  end[i] = bb->start[i]+bb->count[i]-1;
+	}
+	*blockEnd = fastbit_adios_util_getRelativeBlockNumForPoint(v, end, timeStep);
+	log_debug(" figured blockStart = %d, blockEnd = %d\n", *blockStart, *blockEnd);
+    }
+
+    if ((*blockStart < 0) || (*blockEnd < 0) || (*blockStart > *blockEnd)) {
+        adios_error (err_invalid_query_value, "Query processing failed. Unable to continue using index. vid=%d, dim[0]=%lld\n", v->varid, v->dims[0]);
+	return -1;
+    }
+    casestudyLogger_setPrefix(" computed block ids to scan");
+
+    if (v->nsteps > 1) { // non streaming case
+      for (i=0;i<timeStep; i++) {
+	*sumBlocksBeforeThisTimeStep += v->nblocks[i];
+      }
+    }
+
+    return 0;
+} // getBlockCoveredOnBB
+
+
+void getIncrement(uint64_t absBlockIdx, uint64_t* increment, int packSize, int timeStep, ADIOS_VARINFO* v)
+{
+  int i=0;
+  for (i=0; i<packSize; i++) {
+    uint64_t blockSize = fastbit_adios_util_getBlockSize(v, timeStep, absBlockIdx+i);
+    if (i == 0) {
+      increment[i] = blockSize;
+    } else {
+      increment[i] = blockSize + increment[i-1];
+    }
+  }
+}
+
+void locateBlockFromPack(uint64_t currPosInPack, uint64_t* absBlockIdx, uint64_t* posInBlock, uint64_t* packIncrementByBlock, int packSize)
+{
+  if (currPosInPack > packIncrementByBlock[packSize-1]) {
+      *absBlockIdx=-1;
+      *posInBlock = -1;
+      printf(" ERROR: %llu th element will not be found  in pack starting at block:%llu", currPosInPack, *absBlockIdx);
+  }
+
+  uint64_t packStarts = *absBlockIdx;
+  int i=0;
+  for (i=0; i<packSize; i++) {    
+    if (currPosInPack < packIncrementByBlock[i]) {
+      *absBlockIdx = i + packStarts;
+      *posInBlock = packIncrementByBlock[i] - currPosInPack;
+      break;
+    }
+  }
+}
+
+int recursiveIdentify(uint64_t* packIncrementByBlock, uint64_t currPosInPack, int start, int end)
+{
+  //printf(".... start=%d end = %d, currpos=%llu \n", start, end, currPosInPack);
+  if (end - start == 1) {
+    if (currPosInPack > packIncrementByBlock[start]) {
+      //printf("     ===> %llu\n", end);
+      return end;
+    } else {
+      //printf("     ===> %llu\n", start);
+      return start;
+    }
+  }
+
+  int pos = (start+end)/2;
+
+  if (currPosInPack > packIncrementByBlock[pos]) {
+    return recursiveIdentify(packIncrementByBlock, currPosInPack, pos, end);
+  } else {
+    return recursiveIdentify(packIncrementByBlock, currPosInPack, start, pos);
+  }
+
+}
+int identifyBlockInPack(uint64_t* packIncrementByBlock, uint64_t currPosInPack, int packSize)
+{
+#ifdef SIZEN
+  int i=0;
+  for (i=0; i<packSize; i++) {
+    if (currPosInPack < packIncrementByBlock[i]) {
+      return i;
+    }
+  }
+#else
+  return recursiveIdentify(packIncrementByBlock, currPosInPack, 0, packSize);
+#endif
+  return -1;
+}
+// coordinateArray is hits within the whole pack
+// this function sorts the hits with actual blocks
+// say a pack has N blocks, relative block ids are from 0 to (N-1), 
+// since hits are sorted, so we figure out start-a count-a rests in block-a
+// etc
+void sort(uint64_t* coordinateArray, uint64_t arraySize,  uint64_t* packIncrementByBlock, uint64_t* starts, uint64_t* counts, int* relativeBlockIds, int packSize)
+{
+  int i=0;
+  int whichBlock;
+  uint64_t arrayCounter = 0;
+
+  for (i=0; i<packSize; i++) {
+    relativeBlockIds[i]  = -1;
+  }
+  
+  if (arraySize == 0) {
+    return;
+  }
+
+  relativeBlockIds[0] = identifyBlockInPack(packIncrementByBlock, coordinateArray[0], packSize);
+  starts[0] = 0;
+
+  int lastBlock = identifyBlockInPack(packIncrementByBlock, coordinateArray[arraySize -1], packSize);
+
+  if (relativeBlockIds[0] == lastBlock) {
+      counts[0] = arraySize;
+      return;
+  }
+  
+  int bcounter =0 ; 
+  while (true) {
+    for (arrayCounter=starts[bcounter]+1; arrayCounter<arraySize; arrayCounter++) {
+      //int bid = recursiveIdentify(packIncrementByBlock, coordinateArray[arrayCounter], relativeBlockIds[0], packSize);
+	int bid = identifyBlockInPack(packIncrementByBlock, coordinateArray[arrayCounter], packSize);
+        //int bid = coordinateArray[arrayCounter]/packIncrementByBlock[0];
+
+      if (bid > relativeBlockIds[bcounter]) {
+	 counts[bcounter] = arrayCounter-starts[bcounter];
+	 bcounter++;
+	 starts[bcounter] = arrayCounter;
+	 relativeBlockIds[bcounter] = bid;
+	 break;
+      }
+    }
+
+    if (relativeBlockIds[bcounter] == lastBlock) {
+      counts[bcounter] = arraySize - starts[bcounter];
+      break;
+    }
+  }
+}
+
+
+void loopThrough(uint64_t dimMultiplier, uint64_t accumulatedPos, int currDim, ADIOS_VARINFO* var, uint64_t* regionStart, uint64_t* regionCount, uint32_t* bbSlice)
+{
+  int i = 0;
+  if (currDim == var->ndim-1) {
+    for (i=0; i<regionCount[currDim]; i++) {
+      uint64_t pos = accumulatedPos + (i+regionStart[currDim]);
+      bitarray_setbit(bbSlice, pos);
+    }
+    return;
+  } 
+
+  for (i=0; i<regionCount[currDim]; i++) {
+      uint64_t m = dimMultiplier/var->dims[currDim];
+      uint64_t pos = accumulatedPos + (i+regionStart[currDim]) * m;
+      loopThrough(m, pos, currDim+1, var, regionStart, regionCount, bbSlice);
+  }
+}
+
+//
+// create bit slice that mark 1 if within BB, 0 elsewise
+//
+uint32_t* bitarray_create_markBB(uint64_t knownSize, ADIOS_VARINFO* var, uint64_t* regionStart, uint64_t* regionCount)
+{
+  uint32_t* bbSlice = bitarray_create(knownSize);
+
+  if (var->ndim == 1) {
+    int i=0;
+    for (i = 0; i<regionCount[0]; i++) {
+      uint64_t pos = (i+regionStart[0]);
+      bitarray_setbit(bbSlice, pos);
+    }
+    return bbSlice;
+  }
+
+  if (var->ndim == 2) {
+    int i=0, j=0;
+    for (i = 0; i<regionCount[0]; i++) {
+      for (j=0; j<regionCount[1]; j++) {
+	uint64_t pos = (i+regionStart[0]) * var->dims[1] + (j+regionStart[1]);
+	bitarray_setbit(bbSlice, pos);
+      }
+    }
+    return bbSlice;
+  }
+
+  /*
+  if (bb->ndim == 3) {
+    int x=0, y=0, z=0;
+    for (x=0; x<bb->count[0]; x++) {
+      for (y=0; y<bb->count[1]; y++) {
+	for (z=0; z<bb->count[2]; z++) {
+	  uint64_t pos = (x+bb->start[0]) * var->dims[1]*var->dims[2] + (y+bb->start[1]) * var->dims[2] + (z+bb->start[2]);
+	  bitarray_setbit(bbSlice, pos);
+	}
+      }     
+    }
+    return bbSlice;
+  }
+  */
+  int i=0;
+  uint64_t dimOneToN=1;
+  for (i=1; i<var->ndim; i++) {
+    dimOneToN *= var->dims[i];
+  }
+
+  for (i = 0; i<regionCount[0]; i++) {
+    uint64_t pos = (i+regionStart[0]) * dimOneToN;
+    loopThrough(dimOneToN, pos, 1, var, regionStart, regionCount, bbSlice);
+  }
+
+  return bbSlice;
+}
+
+
+void loopThroughAndAssign(uint64_t varDimOneToN, uint64_t bbDimOneToN, uint64_t rpos_sofar, uint64_t pos_sofar, int currDim, ADIOS_VARINFO* var, 
+			  uint64_t* regionStart, uint64_t* regionCount,  uint32_t* bitSlice, uint32_t* resultSlice, uint64_t knownSize)
+{
+  int i = 0;
+  if (currDim == var->ndim-1) {
+    for (i=0; i<regionCount[currDim]; i++) {
+      uint64_t rpos = rpos_sofar + (i+regionStart[currDim]);
+      uint64_t pos =  pos_sofar + i;
+
+      if ((rpos < knownSize) && BITTEST(resultSlice, rpos)) {
+	bitarray_setbit(bitSlice, pos);
+      }
+    }
+    return;
+  } 
+
+  for (i=0; i<regionCount[currDim]; i++) {
+      uint64_t mv = varDimOneToN/(var->dims[currDim]);
+      uint64_t mb = bbDimOneToN/(regionCount[currDim]);
+      uint64_t rpos = rpos_sofar + (i+regionStart[currDim]) * mv;
+      uint64_t pos  = pos_sofar + (i) * mb;
+      loopThroughAndAssign(mv, mb, rpos, pos, currDim+1, var, regionStart, regionCount, bitSlice, resultSlice, knownSize);
+  }
+}
+
+void bitMapBack(uint32_t* bitSlice, uint32_t* resultSlice, ADIOS_VARINFO* var, uint64_t* regionStart, uint64_t* regionCount, uint64_t knownSize)
+{
+  int i=0;
+  if (var->ndim == 1) {
+    for (i=0; i<regionCount[0]; i++) {
+      uint64_t rpos = i+regionStart[0];
+      uint64_t pos = i;
+      if ((rpos < knownSize) && BITTEST(resultSlice, rpos)) {
+	bitarray_setbit(bitSlice, pos);
+      }
+    }
+    return;
+  } 
+
+  uint64_t varDimOneToN=1;
+  uint64_t bbDimOneToN = 1;
+  for (i=1; i<var->ndim; i++) {
+    varDimOneToN *= var->dims[i];
+    bbDimOneToN *= regionCount[i];    
+  }
+
+  for (i = 0; i<regionCount[0]; i++) {
+    uint64_t rpos = (i+regionStart[0]) * varDimOneToN;
+    uint64_t pos = i * bbDimOneToN;
+    loopThroughAndAssign(varDimOneToN, bbDimOneToN, rpos, pos, 1, var, regionStart, regionCount, bitSlice, resultSlice, knownSize);
+  }
+}
+
+ //
+ //
+void setBitArray(ADIOS_VARINFO* var, uint32_t* bitSlice, int64_t* coordinateArray, uint64_t count, uint64_t adjustment,
+		 uint64_t* regionStart, uint64_t* regionCount, uint64_t eleStarts, uint64_t eleEnds)
+{
+  uint64_t knownSize = eleEnds+1; // at most this many elements. + 1 is due to C arrays starts at 0. 
+
+  uint32_t* hitsSlice = bitarray_create(knownSize);
+  uint32_t* resultSlice = bitarray_create(knownSize);
+
+  uint32_t* bbSlice = bitarray_create_markBB(knownSize, var, regionStart, regionCount);
+ 
+  int k=0;
+  for (k=0; k<count; k++) {
+    int64_t currPosInVar = coordinateArray[k] + adjustment;
+    if (currPosInVar < knownSize) {
+      bitarray_setbit(hitsSlice, currPosInVar);
+    }
+  }
+
+  bitarray_and(hitsSlice, bbSlice,  resultSlice, BITNSLOTS(knownSize));      
+ 
+  // ok
+  int n = bitarray_countHits(resultSlice, BITNSLOTS(knownSize));      
+
+  
+  free(bbSlice);
+  free(hitsSlice);
+
+  bitMapBack(bitSlice, resultSlice, var, regionStart, regionCount, knownSize);
+
+  free(resultSlice);
+}
+
+
+void setBitArray0(ADIOS_VARINFO* var, uint32_t* bitSlice, int64_t* coordinateArray, uint64_t count, uint64_t adjustment,
+		 const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb, uint64_t eleStarts, uint64_t eleEnds)
+{
+  int isFortranClient = 0;
+
+  int k=0;
+  for (k=0; k<count; k++) {
+    int64_t currPosInBlock = coordinateArray[k] + adjustment;
+      
+    if ((currPosInBlock >= eleStarts) && (currPosInBlock <= eleEnds)) {	  
+        uint64_t spatialCoordinates[bb->ndim];
+	getCoordinateFromVariable(currPosInBlock, var, var->ndim, spatialCoordinates);
+	//posToSpace(currPosInBlock, isFortranClient, bb->count, spatialCoordinates, bb->ndim, bb->start);
+	int64_t p = getPosInBox(bb, bb->ndim, spatialCoordinates, isFortranClient);
+	if (p >= 0) {
+	  bitarray_setbit(bitSlice, p);
+	} 
+    }
+  }
+}
+
+void checkHits(ADIOS_VARINFO* v, ADIOS_QUERY* q, uint64_t boxStart, uint64_t* regionStart, uint64_t* regionCount, uint64_t eleStarts, uint64_t eleEnds)
+{
+      uint64_t count = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 	
+      int64_t  coordinateArray[count];
+      fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinateArray, count, 0);      
+      
+      // set bits
+      uint32_t* bitSlice = bitarray_create(q->rawDataSize);
+      setBitArray(v, bitSlice, coordinateArray, count, boxStart, regionStart, regionCount, eleStarts, eleEnds);
+
+      free(q->dataSlice);
+      q->dataSlice = bitSlice;
+      
+      fastbit_iapi_free_array_by_addr(q->dataSlice);
+      ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = 0;
+
+      casestudyLogger_setPrefix(" summarized evaluation for bb");  
+}
+
+int mEvaluateBBRangeFancyQueryOnWhole(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeStep, uint64_t* regionStart, uint64_t* regionCount)
+{
+  char bitsArrayName[60];
+  sprintf(bitsArrayName, "%ld_%d", fastbit_adios_getCurrentTimeMillis(), timeStep);
+
+  uint64_t s = 0;
+  uint64_t startRef = 0;
+
+  ADIOS_VARINFO* v = getFirstLeaf(q)->varinfo;
+
+  uint64_t eleStarts = 0;
+  uint64_t eleEnds = q->rawDataSize;
+
+  uint64_t totalEle = 1;
+
+  if ((regionStart == NULL) || (regionCount == NULL)) {
+    return mEvaluateTestFullRangeFancyQueryOnWhole(idxFile, q, timeStep);
+  } 
+
+  eleStarts = getPosInVariable(v, v->ndim, regionStart, 0);
+  uint64_t end[v->ndim];
+  int coversAll = 1;
+  int i = 0;
+  for (i=0; i<v->ndim; i++) {
+    if (regionCount[i] > 0) {
+      end[i] = regionStart[i]+regionCount[i]-1;
+    } else {
+      end[i] = regionStart[i];
+    }
+
+    totalEle *= v->dims[i];
+    if (v->dims[i] > regionCount[i]) {
+      coversAll = 0;
+    }
+  }
+  
+  if (coversAll == 1) {
+    return mEvaluateTestFullRangeFancyQueryOnWhole(idxFile, q, timeStep);
+  }  
+  eleEnds = getPosInVariable(v, v->ndim, end, 0);      
+  
+
+  ADIOS_VARINFO* packVar = common_read_inq_var (idxFile, "elements");
+  uint64_t recommended_index_ele = 0;
+  common_read_schedule_read (idxFile, NULL, "elements",           0, 1, NULL, &recommended_index_ele);
+  common_read_perform_reads(idxFile, 1);
+
+  //printf("dataSize from: %llu to %llu, elements = %lu\n", eleStarts, eleEnds, recommended_index_ele);
+
+  uint64_t start[v->ndim], count[v->ndim];
+  uint64_t split = totalEle/recommended_index_ele;
+  uint32_t* bitSlice = NULL;
+
+  int64_t eleBoxStarts = -1; 
+  if (split == 0) {
+      // index is on the whole timestep
+      getHandle(timeStep, 0, idxFile,  q,  totalEle);
+      checkHits(v, q, 0, regionStart, regionCount, eleStarts, eleEnds); 
+      return;
+  } else {
+      int boxCounter = 0;
+      while (startRef < v->dims[0]) {
+	uint64_t count[v->ndim];
+	uint64_t boxSize = 1;
+	
+	start[0] = startRef;
+	startRef += v->dims[0]/split;
+	if (startRef >= v->dims[0]) {
+	  startRef = v->dims[0];
+	}
+	count[0] = startRef - start[0];
+	boxSize *=count[0];
+	for (s=1; s < v->ndim; s++) {
+	  start[s] = 0;
+	  count[s] = v->dims[s];
+	  boxSize *= count[s];
+	}
+
+	if ((regionCount[0]+regionStart[0] >= start[0]) && (start[0]+count[0] > regionStart[0])) 
+	{
+	  if (eleBoxStarts == -1) {
+	    eleBoxStarts = getPosInVariable(v, v->ndim, start, 0);
+	  }
+	  getHandle(timeStep, start[0], idxFile, q, boxSize);	  
+	
+	  // has to call evaluate before calling either register_selection_as_bit_array() or extend_bit_array()
+	  uint64_t countMe = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 
+	  
+	  if (boxCounter == 0) {
+	    fastbit_iapi_register_selection_as_bit_array(bitsArrayName, ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);
+	  } else {
+	    fastbit_iapi_extend_bit_array_with_selection(bitsArrayName, ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);
+	  }
+	}
+      
+	boxCounter++;
+      }
+  }
+
+  FastBitSelectionHandle h  =  fastbit_selection_osr(bitsArrayName, FastBitCompareGreater, 0.0);//createHandle(q, bitsArrayName);
+
+  fastbit_adios_util_checkNotNull(h, bitsArrayName);    
+  ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = h;
+
+  checkHits(v, q, eleBoxStarts, regionStart, regionCount, eleStarts, eleEnds); 
+}
+
+
+
+void checkHitsDefault(ADIOS_QUERY* q)
+{
+  uint64_t resultCount = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 	
+
+  int64_t  coordinateArray[resultCount];
+  fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinateArray, resultCount, 0);      
+  casestudyLogger_setPrefix(" got coordinates bb");
+
+  uint32_t* bitSlice = bitarray_create(q->rawDataSize);
+
+  int k;
+  for (k=0; k<resultCount; k++) {
+    int64_t currPosInBlock = coordinateArray[k];
+    if (currPosInBlock >= 0) {
+      bitarray_setbit(bitSlice, currPosInBlock);
+    }
+  } 
+  
+  free(q->dataSlice);
+  q->dataSlice = bitSlice;
+  
+  fastbit_iapi_free_array_by_addr(q->dataSlice);
+  ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = 0;
+
+  casestudyLogger_setPrefix(" summarized evaluation for bb");  
+
+}
+ //
+ // 
+ //
+
+int mEvaluateTestFullRangeFancyQueryOnWhole(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeStep)
+{
+  char bitsArrayName[60];
+  sprintf(bitsArrayName, "%ld_%d", fastbit_adios_getCurrentTimeMillis(), timeStep);
+
+  uint64_t s = 0;
+  uint64_t startRef = 0;
+
+  ADIOS_VARINFO* packVar = common_read_inq_var (idxFile, "elements");
+  uint64_t recommended_index_ele = 0;
+  common_read_schedule_read (idxFile, NULL, "elements",           0, 1, NULL, &recommended_index_ele);
+  common_read_perform_reads(idxFile, 1);
+
+  uint64_t dataSize = q->rawDataSize;
+
+  uint64_t start[getFirstLeaf(q)->varinfo->ndim], count[getFirstLeaf(q)->varinfo->ndim];
+  uint64_t split = q->rawDataSize/recommended_index_ele;
+  //uint32_t* bitSlice = bitarray_create(q->rawDataSize);
+  uint32_t* bitSlice = NULL;
+  ADIOS_VARINFO* v = getFirstLeaf(q)->varinfo;
+
+  if (split == 0) {
+      // index is on the whole timestep
+      getHandle(timeStep, 0, idxFile,  q,  dataSize);
+
+      checkHitsDefault(q);
+      return;
+  } else {
+      int boxCounter = 0;
+      while (startRef < v->dims[0]) {
+	uint64_t count[v->ndim];
+	uint64_t boxSize = 1;
+	
+	start[0] = startRef;
+	startRef += v->dims[0]/split;
+	if (startRef >= v->dims[0]) {
+	  startRef = v->dims[0];
+	}
+	count[0] = startRef - start[0];
+	boxSize *=count[0];
+	for (s=1; s < v->ndim; s++) {
+	  start[s] = 0;
+	  count[s] = v->dims[s];
+	  boxSize *= count[s];
+	}
+	
+	//getHandleFromBlockAtLeafQuery(timeStep, start[0], idxFile,  q,  boxSize);
+	//
+	getHandle(timeStep, start[0], idxFile, q, boxSize);
+	
+	// has to call evaluate before calling either register_selection_as_bit_array() or extend_bit_array()
+	uint64_t countMe = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 
+
+	if (boxCounter == 0) {
+	  fastbit_iapi_register_selection_as_bit_array(bitsArrayName, ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);
+	} else {
+	  fastbit_iapi_extend_bit_array_with_selection(bitsArrayName, ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);
+	}
+      
+	boxCounter++;
+      }
+  }
+
+  FastBitSelectionHandle h  =  fastbit_selection_osr(bitsArrayName, FastBitCompareGreater, 0.0);//createHandle(q, bitsArrayName);
+  fastbit_adios_util_checkNotNull(h, bitsArrayName);    
+  ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = h;
+
+  checkHitsDefault(q);
+}
+
+
+ // with fancy query, on leaf node
+int mEvaluateTestFullRange(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeStep)
+{
+
+  char bitsArrayName[60];
+  sprintf(bitsArrayName, "%ld_%d_%d", fastbit_adios_getCurrentTimeMillis(), q->varinfo->varid, timeStep);
+
+  uint64_t s = 0;
+  uint64_t dataSize = 1;
+  uint64_t start[q->varinfo->ndim], count[q->varinfo->ndim];
+  for (s=0; s<q->varinfo->ndim; s++) {
+    dataSize *= q->varinfo->dims[s];
+  }
+
+  uint64_t startRef = 0;
+
+  ADIOS_VARINFO* packVar = common_read_inq_var (idxFile, "elements");
+  uint64_t recommended_index_ele = 0;
+  common_read_schedule_read (idxFile, NULL, "elements",           0, 1, NULL, &recommended_index_ele);
+  common_read_perform_reads(idxFile, 1);
+
+  //printf("dataSize = %llu, elements = %lu\n", dataSize, recommended_index_ele);
+
+  uint64_t split = dataSize/recommended_index_ele;
+  //uint32_t* bitSlice = bitarray_create(q->rawDataSize);
+  uint32_t* bitSlice = NULL;
+
+  if (split == 0) {
+      // index is on the whole timestep
+      getHandleFromBlockAtLeafQuery(timeStep, 0, idxFile,  q,  q->rawDataSize);
+      uint64_t count = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 	
+      int64_t  coordinateArray[count];
+      fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinateArray, count, 0);      
+      
+      int k=0;
+      // set bits
+      bitSlice = bitarray_create(q->rawDataSize);
+      for (k=0; k<count; k++) {
+	int64_t currPosInBlock = coordinateArray[k];
+	if (currPosInBlock >= 0) {
+	  bitarray_setbit(bitSlice, currPosInBlock);
+	}
+      }
+
+      free(q->dataSlice);
+      q->dataSlice = bitSlice;
+      
+      fastbit_iapi_free_array_by_addr(q->dataSlice);
+      ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = 0;
+      
+      casestudyLogger_setPrefix(" summarized evaluation for bb");  
+      return;
+  } else {
+      int boxCounter = 0;
+      while (startRef < q->varinfo->dims[0]) {
+	uint64_t count[q->varinfo->ndim];
+	uint64_t boxSize = 1;
+	
+	start[0] = startRef;
+	startRef += q->varinfo->dims[0]/split;
+	if (startRef >= q->varinfo->dims[0]) {
+	  startRef = q->varinfo->dims[0];
+	}
+	count[0] = startRef - start[0];
+	boxSize *=count[0];
+	for (s=1; s < q->varinfo->ndim; s++) {
+	  start[s] = 0;
+	  count[s] = q->varinfo->dims[s];
+	  boxSize *= count[s];
+	}
+	
+	getHandleFromBlockAtLeafQuery(timeStep, start[0], idxFile,  q,  boxSize);
+	/*
+	// index is on box identified by start/count
+	uint64_t resultCount = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 	
+	int64_t  coordinateArray[resultCount];
+	fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinateArray, resultCount, 0);      
+	
+	int64_t startPosInVar = getPosInVariable(q->varinfo, q->varinfo->ndim, start, 0);
+	printf("result count=%lu, startPos=%lld, (%llu, %llu, %llu) \n", resultCount, startPosInVar, start[0], start[1], start[2]);
+	
+	int k=0;
+	// set bits
+	for (k=0; k<resultCount; k++) {
+	  int64_t currPosInBlock = coordinateArray[k]+startPosInVar;
+	  if (currPosInBlock >= 0) {
+	    bitarray_setbit(bitSlice, currPosInBlock);
+	  }
+	} 
+	*/
+	
+	// has to call evaluate before calling either register_selection_as_bit_array() or extend_bit_array()
+	uint64_t countMe = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 
+
+	if (boxCounter == 0) {
+	  fastbit_iapi_register_selection_as_bit_array(bitsArrayName, ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);
+	} else {
+	  fastbit_iapi_extend_bit_array_with_selection(bitsArrayName, ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);
+	}
+      
+	boxCounter++;
+      }
+  }
+
+  FastBitSelectionHandle h  =  fastbit_selection_osr(bitsArrayName, FastBitCompareGreater, 0.0);//createHandle(q, bitsArrayName);
+
+  fastbit_adios_util_checkNotNull(h, bitsArrayName);    
+  ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = h;
+
+  uint64_t resultCount = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 	
+  //printf("resultCount = %llu\n", resultCount);
+  int64_t  coordinateArray[resultCount];
+  fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinateArray, resultCount, 0);      
+  casestudyLogger_setPrefix(" got coordinates bb");
+
+  if (resultCount > q->rawDataSize/2) {
+      int k;
+      bitSlice = bitarray_create(q->rawDataSize);
+
+      for (k=0; k<resultCount; k++) {
+	int64_t currPosInBlock = coordinateArray[k];
+	if (currPosInBlock >= 0) {
+	  bitarray_setbit(bitSlice, currPosInBlock);
+	}
+      } 
+      
+  } else {
+    bitSlice = bitarray_create(q->rawDataSize);
+    int k;
+    for (k=0; k<resultCount; k++) {
+      int64_t currPosInBlock = coordinateArray[k];
+      if (currPosInBlock >= 0) {
+	bitarray_setbit(bitSlice, currPosInBlock);
+      }
+    } 
+  }
+
+
+  free(q->dataSlice);
+  q->dataSlice = bitSlice;
+  
+  fastbit_iapi_free_array_by_addr(q->dataSlice);
+  
+  ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = 0;
+  
+  casestudyLogger_setPrefix(" summarized evaluation for bb");
+  
+}
+
+
+//
+// idx can be based on (m)ultiple blocks
+//
+int mEvaluateWithIdxOnBBoxWithBitArrayOnVar(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeStep)
+{
+    int blockStart=0; // relative
+    int blockEnd = 0; // relative
+
+    uint64_t sumBlocksBeforeThisTimeStep = 0;
+
+    int i=0;
+
+    if (getBlockCoveredOnBB(&blockStart, &blockEnd, &sumBlocksBeforeThisTimeStep, q, timeStep) != 0) {
+      return -1;
+    }
+
+    uint32_t* bitSlice = bitarray_create(q->rawDataSize);
+
+    int rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);      
+    char bitsArrayName[60];
+    sprintf(bitsArrayName, "%ld_%d_%d_%d", fastbit_adios_getCurrentTimeMillis(), q->varinfo->varid, timeStep, rank);
+
+    uint64_t currBlockIdx = blockStart;
+
+    casestudyLogger_setPrefix(" start scanning");
+    char casestudyLoggerPrefix[30];
+    
+    ADIOS_VARINFO* packVar = common_read_inq_var (idxFile, "pack");
+    int packSize = -1;
+    common_read_schedule_read (idxFile, NULL, "pack",           0, 1, NULL, &packSize);
+    common_read_perform_reads(idxFile, 1);
+        
+    uint64_t virtualBlockStart = blockStart/packSize;
+    uint64_t virtualBlockEnds = blockEnd/packSize;
+    
+    if (q->file->is_streaming == 1) {
+      if (packSize > q->varinfo->sum_nblocks) {
+	packSize = q->varinfo->sum_nblocks;
+      }
+    } else {
+      if (packSize > q->varinfo->nblocks[timeStep]) {
+	packSize = q->varinfo->nblocks[timeStep];
+      }
+    }
+
+      
+    const ADIOS_SELECTION_BOUNDINGBOX_STRUCT *bb = NULL;
+    if (q->sel != NULL) {
+      bb = &(q->sel->u.bb);      
+    }	
+
+    int k=0;
+    uint64_t absBlockIdx = 0;
+
+    for (currBlockIdx= virtualBlockStart; currBlockIdx <= virtualBlockEnds; currBlockIdx++) {
+      //getHandle(timeStep, currBlockIdx*packSize, idxFile, q);	      
+	absBlockIdx = currBlockIdx*packSize+sumBlocksBeforeThisTimeStep;	
+
+	uint64_t packIncrementByBlock[packSize];
+	if (q->file->is_streaming == 1) {
+	  getIncrement(absBlockIdx, packIncrementByBlock, packSize, -1, q->varinfo);
+	} else {
+	  getIncrement(absBlockIdx, packIncrementByBlock, packSize, timeStep, q->varinfo);
+	}
+
+        getHandleFromBlockAtLeafQuery(timeStep, currBlockIdx*packSize, idxFile,  q, packIncrementByBlock[packSize-1]);
+
+	if (((FASTBIT_INTERNAL*)(q->queryInternal))->_handle == 0) {
+	    log_warn(" Unable to construct fastbit query with NULL. Use _no_o idx method \n");
+	    return -1;
+	}
+	
+	sprintf(casestudyLoggerPrefix, "block:%llu", currBlockIdx);
+	casestudyLogger_setPrefix(casestudyLoggerPrefix);
+	
+	struct timespec evalStartT; casestudyLogger_getRealtime(&evalStartT);	
+	uint64_t count = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 	
+
+	int64_t  coordinateArray[count];
+	fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinateArray, count, 0);      
+
+	casestudyLogger_pro_writeout(&evalStartT, "fastbitevaluated");	
+	struct timespec frameStartT; casestudyLogger_getRealtime(&frameStartT);
+
+ 	clear_fastbit_internal_recursive(q);
+
+	if (isSameRegion(q->varinfo, bb, timeStep)) { 
+	    // bb covers all 
+	    // no need to do mapping , to do: check
+	} else {
+	    uint64_t posInBlock;
+	    int isFortranClient = futils_is_called_from_fortran();
+	    if (isFortranClient) { // to do: check
+	      for (k=0; k<count; k++) {
+		uint64_t currPosInPack = coordinateArray[k];		
+	        locateBlockFromPack(currPosInPack, &absBlockIdx, &posInBlock, packIncrementByBlock, packSize);
+		coordinateArray[k] =  getRelativeIdx(posInBlock, q->varinfo, bb, absBlockIdx, timeStep); 	
+	      }
+	    } else { // fastscan on c-clients
+	      uint64_t starts[packSize]; uint64_t counts[packSize]; int relativeBlockIds[packSize];
+	      sort(coordinateArray, count, packIncrementByBlock, starts, counts, relativeBlockIds, packSize);
+
+	      for (k=0; k<packSize; k++) {		
+		if (relativeBlockIds[k] >= 0) {
+		    uint64_t currIdx = absBlockIdx + relativeBlockIds[k];		  
+		    //printf("starts[%d] = %llu counts[%d] = %llu, relativeIdx=%lld, hits=%llu  \n", k, starts[k], k, counts[k], relativeBlockIds[k], count);
+		    ADIOS_VARBLOCK* blockSel = &(q->varinfo->blockinfo[currIdx]);
+		    if (relativeBlockIds[k] > 0) {
+		      int m = 0; 
+		      for (m =starts[k]; m<starts[k]+counts[k]; m++) {
+			//printf(" adjust coordinateArray[%ld],  %lld - %lld \n", m, coordinateArray[m], packIncrementByBlock[relativeBlockIds[k]-1]);
+			coordinateArray[m] = coordinateArray[m] - packIncrementByBlock[relativeBlockIds[k]-1];
+			
+		      }
+		    }
+		    fastscan(coordinateArray, starts[k], counts[k], q->varinfo, blockSel->start, blockSel->count, bb);	
+		} else {
+		    break;
+		}
+	      }
+	    }
+	}
+	// set bits
+	for (k=0; k<count; k++) {
+	  int64_t currPosInSel = coordinateArray[k];
+	  if (currPosInSel >= 0) {
+	    bitarray_setbit(bitSlice, currPosInSel);
+	  }
+	}
+	
+	//casestudyLogger_frame_writeout(&frameStartT, "block processed");
+	casestudyLogger_frame_writeout(&frameStartT, "block processed");
+	log_debug("----\n");
+    }
+    
+    casestudyLogger_setPrefix(" blocksProcessedIndividually!");
+
+    //return fastbit_selection_create(dataType, dataOfInterest, dataSize, compareOp, &vv);
+
+    free(q->dataSlice);
+    q->dataSlice = bitSlice;
+
+    fastbit_iapi_free_array_by_addr(q->dataSlice);
+
+    ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = 0;
+ 
+    casestudyLogger_setPrefix(" summarized evaluation for bb");
+    //fastbit_adios_util_checkNotNull(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, bitsArrayName);
+}
+//
+// for index that based on one block 
+//
+int evaluateWithIdxOnBBoxWithBitArrayOnVar0(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeStep)
+{
+    int blockStart=0; // relative
+    int blockEnd = 0; // relative
+    int i=0;
+
+    ADIOS_SELECTION* sel = q->sel;
+    ADIOS_VARINFO* v = q->varinfo;
+
+    const ADIOS_SELECTION_BOUNDINGBOX_STRUCT *bb = NULL;
+    if (sel == NULL) {
+        blockStart=0;
+	if (v->nsteps == 1) { // could be streaming open
+	  blockEnd = v->nblocks[0]-1;
+	} else {
+	  blockEnd = v->nblocks[timeStep] -1;      
+	}
+	log_debug(" got blockStart = %d, blockEnd = %d\n", blockStart, blockEnd);
+    } else {
+        bb = &(sel->u.bb);      
+	if (v->blockinfo == NULL) {
+	  common_read_inq_var_blockinfo(q->file, v);
+	}
+	blockStart = fastbit_adios_util_getRelativeBlockNumForPoint(v,bb->start,timeStep);
+	uint64_t end[v->ndim];
+	for (i=0; i<v->ndim; i++) {
+	  end[i] = bb->start[i]+bb->count[i]-1;
+	}
+	blockEnd = fastbit_adios_util_getRelativeBlockNumForPoint(v, end, timeStep);
+	log_debug(" figured blockStart = %d, blockEnd = %d\n", blockStart, blockEnd);
+    }
+
+    if ((blockStart < 0) || (blockEnd < 0) || (blockStart > blockEnd)) {
+        adios_error (err_invalid_query_value, "Query processing failed. Unable to continue using index. vid=%d, dim[0]=%lld\n", v->varid, v->dims[0]);
+	return -1;
+    }
+
+    casestudyLogger_setPrefix(" computed block ids to scan");
+
+    uint32_t* bitSlice = bitarray_create(q->rawDataSize);
+
+    int rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);      
+    char bitsArrayName[60];
+    sprintf(bitsArrayName, "%ld_%d_%d_%d", fastbit_adios_getCurrentTimeMillis(), v->varid, timeStep, rank);
+
+    uint64_t currBlockIdx = blockStart;
+
+    uint64_t sumBlocksBeforeThisTimeStep = 0;
+    if (v->nsteps > 1) { // non streaming case
+      for (i=0;i<timeStep; i++) {
+	sumBlocksBeforeThisTimeStep += v->nblocks[i];
+      }
+    }
+
+    casestudyLogger_setPrefix(" start scanning");
+    char casestudyLoggerPrefix[30];
+    
+    for (currBlockIdx=blockStart; currBlockIdx <= blockEnd; currBlockIdx++) {
+      getHandle(timeStep, currBlockIdx, idxFile, q, 0);	      
+      if (((FASTBIT_INTERNAL*)(q->queryInternal))->_handle == 0) {
+	log_warn(" Unable to construct fastbit query with NULL. Use _no_o idx method \n");
+	return -1;
+      }
+
+      sprintf(casestudyLoggerPrefix, "block:%llu", currBlockIdx);
+      casestudyLogger_setPrefix(casestudyLoggerPrefix);
+
+      struct timespec evalStartT;
+      casestudyLogger_getRealtime(&evalStartT);
+
+      uint64_t count = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 
+
+      int64_t  coordinateArray[count];
+      fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinateArray, count, 0);      
+
+      casestudyLogger_pro_writeout(&evalStartT, "fastbitevaluated");
+
+      struct timespec frameStartT;
+      casestudyLogger_getRealtime(&frameStartT);
+      clear_fastbit_internal_recursive(q);
 
-  getCoordinateFromVariable(stepUp, var, n-1, coordinates);  
-}
+      int absBlockIdx = currBlockIdx+sumBlocksBeforeThisTimeStep;
+      int k=0;
 
+      int isDefaultSelection = isSameRegion(v, bb, timeStep);
+      /*
+      for (k=0; k<count; k++) {
+	uint64_t currPosInBlock = coordinateArray[k];
+	int64_t currPos = currPosInBlock;
+	
+	if (!isDefaultSelection) {
+	    currPos = getRelativeIdx(currPosInBlock, v, bb, absBlockIdx, timeStep);
+	}
 
-/* static ADIOS_VARINFO* getAdiosVariable(ADIOS_FILE* f, const char* varName)
-{
-  ADIOS_VARINFO * v = common_read_inq_var(f, varName);
+	log_debug("%lld th in block[%d],   =>  in actual box %lld  \n", currPosInBlock, absBlockIdx, currPos);
+	if (currPos >= 0) {
+            #ifdef BITARRAY
+	    bitarray_setbit(bitSlice, currPos);
+            #else
+	    bitSlice[currPos] = 1;
+            #endif
+	}
+      }
+      */
+      if (isDefaultSelection) {
+	// no need to do mapping , to do: check
+      } else {
+	int isFortranClient = futils_is_called_from_fortran();
+	if (isFortranClient) { // to do: check
+	    for (k=0; k<count; k++) {
+	      uint64_t currPosInBlock = coordinateArray[k];
+	      coordinateArray[k] =  getRelativeIdx(currPosInBlock, v, bb, absBlockIdx, timeStep); 	
+	    }
+	} else { // fastscan on c-clients
+	    ADIOS_VARBLOCK* blockSel = &(v->blockinfo[absBlockIdx]);
+	    fastscan(coordinateArray, 0, count, v, blockSel->start, blockSel->count, bb);	
+	}
+      }
 
-  if (v != NULL) {
-    log_debug("  found variable [%s] in file\n", varName);
-    return v;
-  } 
+      // set bits
+      for (k=0; k<count; k++) {
+	int64_t currPosInBlock = coordinateArray[k];
+	if (currPosInBlock >= 0) {
+	  bitarray_setbit(bitSlice, currPosInBlock);
+	}
+      }
+      
+      //casestudyLogger_frame_writeout(&frameStartT, "block processed");
+      casestudyLogger_pro_writeout(&frameStartT, "block processed");
+      log_debug("----\n");
+    }
 
-  return NULL;
-}*/
+    casestudyLogger_setPrefix(" blocksProcessedIndividually!");
 
+    //return fastbit_selection_create(dataType, dataOfInterest, dataSize, compareOp, &vv);
 
+    free(q->dataSlice);
+    q->dataSlice = bitSlice;
 
-//
-// Initialization is private business, Finalize is called by ADIOS when read is finalized
-//
-static int is_method_initialized = 0;
-static void adios_query_fastbit_init() 
-{
-  const char* conffile = 0;
-#ifdef DEBUG
-  int msglvl = 200;
-#else
-  int msglvl = 0;
-#endif
-  if (!is_method_initialized) {
-      fastbit_init(conffile);
-      fastbit_set_verbose_level(msglvl);
-      log_debug("[fastbit has initialized with verbosity level = %d]\n", msglvl);
-      is_method_initialized = 1;
-  }
+    fastbit_iapi_free_array_by_addr(q->dataSlice);
+
+    ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = 0;
+ 
+    casestudyLogger_setPrefix(" summarized evaluation for bb");
+    //fastbit_adios_util_checkNotNull(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, bitsArrayName);
 }
 
-int adios_query_fastbit_finalize()
+
+int isSameBB(ADIOS_QUERY* q, const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb)
 {
-  if (is_method_initialized) {
-      fastbit_iapi_free_all();
-      fastbit_cleanup();
-      is_method_initialized = 0;
+  if (q->left == NULL) {
+    if (q->sel != NULL) {
+      const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* cbb = &(q->sel->u.bb);
+      int i=0;
+      for (i=0; i<bb->ndim; i++) {
+	if (bb->start[i] != cbb->start[i]) {
+	  return 0;
+	}
+	if (bb->count[i] != cbb->count[i]) {
+	  return 0;
+	}
+      }						
+      return 1;
+    }
+    return 0;  // skip furthur investigation
   }
+  if (isSameBB(q->left, bb) && isSameBB(q->right, bb)) {
+    return 1;
+  }
+  
   return 0;
 }
+// roughly
+int  isBasedOnSameBB(ADIOS_QUERY* q) {
+  if (q->left == NULL) { // leaf query, ok
+    return 1;
+  }
 
- 
-
-int64_t getPosInBox(const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* sel, int n, uint64_t* spatialCoordinates) 
-{
-  if (sel->ndim <= 0) {
-    return -1;
+  if (getFirstLeaf(q)->sel == NULL) {
+    return 0;
   }
 
-  int fortran_order = futils_is_called_from_fortran();
+  const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb = &(getFirstLeaf(q)->sel->u.bb);    
 
-  int i=0;
-  if (n == sel->ndim) { // check validation once
-    for (i=0; i<sel->ndim; i++) {
-      int matchingBoxDim = i;
-      if (fortran_order == 1) {
-	matchingBoxDim = sel->ndim - 1 - i;
-      }
-      uint64_t min = sel->start[matchingBoxDim];
-      uint64_t max = sel->count[matchingBoxDim] + min;
-      if (spatialCoordinates[i] >= max) {
-	return -1;
-      }
-      if (spatialCoordinates[i] < min) {
-	return -1;
-      } 
+  if (isSameBB(q->left, bb) && isSameBB(q->right, bb)) {
+    return 1;
+  } 
+  return 0;
+}
+  //
+  // in a general case, left query can have a different bb than right query
+  // thus the index alighment is different. e.g. left ([0,0]-[N,N]), right ([N, N] - [2N, 2N])
+  // index starts at 0 for left but something different likely for right query.
+  // therefore get handle on each leaf and combine is not right, as handles would be covering  more than the actual data size.
+  // and each leaf will vary
+  //
+// we identify the case when bb is the same through all the leaves,
+// then we do composite query in fastbit to get best efficiency
+int evaluateWithIdxOnBoundingBoxWithBitArray(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeStep)
+{  
+  
+  if (isBasedOnSameBB(q) > 0) {
+    if (getFirstLeaf(q)->sel != NULL) {
+      const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb = &(getFirstLeaf(q)->sel->u.bb);    
+      mEvaluateBBRangeFancyQueryOnWhole(idxFile, q, timeStep, bb->start, bb->count);
+    } else {
+      mEvaluateBBRangeFancyQueryOnWhole(idxFile, q, timeStep, NULL, NULL);
     }
+    return 0;
   }
 
-  // spatial Coordinate is valid
 
-  if (fortran_order == 1) {
-    int matchingBoxDim = sel->ndim  - n;
-     if (n == 1) {
-       //log_debug("n=1, c[0]=%lld ,  start[%d]=%lld", spatialCoordinates[0], matchingBoxDim, sel->start[matchingBoxDim]);
-       return spatialCoordinates[0] - sel->start[matchingBoxDim];
-     }
-     //log_debug("n=%d, c[n-1]=%lld, start/count[%d]= %lld/%lld \n", n, spatialCoordinates[n-1], matchingBoxDim, sel->start[matchingBoxDim], sel->count[matchingBoxDim]);
-     return (spatialCoordinates[n-1]- sel->start[matchingBoxDim]) + sel->count[matchingBoxDim] * getPosInBox(sel, n-1, spatialCoordinates);
+  //ADIOS_SELECTION* sel = q->sel;
+  ADIOS_VARINFO* v = q->varinfo;
+
+  create_fastbit_internal(q);
+  casestudyLogger_setPrefix(" created fastbit internal ");
+
+  if (v == NULL) {
+    ADIOS_QUERY* left = (ADIOS_QUERY*)(q->left);
+    ADIOS_QUERY* right = (ADIOS_QUERY*)(q->right);
+
+    if (evaluateWithIdxOnBoundingBoxWithBitArray(idxFile, left, timeStep) < 0) {
+      return -1;
+    }
+    if (evaluateWithIdxOnBoundingBoxWithBitArray(idxFile, right, timeStep) < 0) {
+      return -1;
+    }
+
+    casestudyLogger_setPrefix(" merge bitarray ");
+    free(q->dataSlice);
+    q->dataSlice = bitarray_create(q->rawDataSize);
+    if (q->combineOp == ADIOS_QUERY_OP_OR) {            
+      bitarray_or((uint32_t*)(left->dataSlice), (uint32_t*)(right->dataSlice), (uint32_t*)(q->dataSlice), BITNSLOTS(q->rawDataSize));      
+    } else {
+      bitarray_and((uint32_t*)(left->dataSlice), (uint32_t*)(right->dataSlice), (uint32_t*)(q->dataSlice), BITNSLOTS(q->rawDataSize));      
+    }
+    free(left->dataSlice);
+    free(right->dataSlice);
+    left->dataSlice = 0;
+    right->dataSlice = 0;
+    return 0;
   } else {
-     if (n == 1) {
-        return spatialCoordinates[0]-sel->start[0];    
-     }
-     return (spatialCoordinates[n-1]-sel->start[n-1]) + sel->count[n-1]*getPosInBox(sel, n-1, spatialCoordinates);
+    // is a leaf
+    if (q->rawDataSize == 0) {
+      return 0;
+    }
+    //return mEvaluateWithIdxOnBBoxWithBitArrayOnVar(idxFile, q, timeStep);
+    //!!return mEvaluateTestFullRange(idxFile, q, timeStep);
+    if (getFirstLeaf(q)->sel != NULL) {
+      const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb = &(getFirstLeaf(q)->sel->u.bb);    
+      mEvaluateBBRangeFancyQueryOnWhole(idxFile, q, timeStep, bb->start, bb->count);
+    } else {
+      mEvaluateBBRangeFancyQueryOnWhole(idxFile, q, timeStep, NULL, NULL);
+    }
+    return 0;
+
   }
+
 }
 
-int64_t getPosInVariable(const ADIOS_VARINFO* v, int n, uint64_t* spatialCoordinates) 
-{
-  if (v->ndim <= 0) {
-    return -1;
-  }
 
-  // 
-  // no need for fortran order here. 
-  //
-  log_debug("getPosInVariables() v->dim[0]=%d sp[%d]=%lld\n", v->dims[0], n-1, spatialCoordinates[n-1]);
+int evaluateWithIdxOnBlockWithBitArray(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeStep)
+{  
+  
+  ADIOS_VARINFO* v = q->varinfo;
 
-  if (n == 1) {
-      return spatialCoordinates[0];
-    }
+  create_fastbit_internal(q);
+  casestudyLogger_setPrefix(" created fastbit internal ");
 
-  return  spatialCoordinates[n-1] + v->dims[n-1]*getPosInVariable(v, n-1, spatialCoordinates); 
-}
+  if (v == NULL) {
+    ADIOS_QUERY* left = (ADIOS_QUERY*)(q->left);
+    ADIOS_QUERY* right = (ADIOS_QUERY*)(q->right);
+
+    if (evaluateWithIdxOnBlockWithBitArray(idxFile, left, timeStep) < 0) {
+      return -1;
+    }
+    if (evaluateWithIdxOnBlockWithBitArray(idxFile, right, timeStep) < 0) {
+      return -1;
+    }
 
+    casestudyLogger_setPrefix(" merge bitarray ");
+    free(q->dataSlice);
+    q->dataSlice = bitarray_create(q->rawDataSize);
+    if (q->combineOp == ADIOS_QUERY_OP_OR) {            
+      bitarray_or((uint32_t*)(left->dataSlice), (uint32_t*)(right->dataSlice), (uint32_t*)(q->dataSlice), BITNSLOTS(q->rawDataSize));      
+    } else {
+      bitarray_and((uint32_t*)(left->dataSlice), (uint32_t*)(right->dataSlice), (uint32_t*)(q->dataSlice), BITNSLOTS(q->rawDataSize));      
+    }
+    free(left->dataSlice);
+    free(right->dataSlice);
+    left->dataSlice = 0;
+    right->dataSlice = 0;
+    return 0;
+  } else {
+    // is a leaf
+    if (q->rawDataSize == 0) {
+      return 0;
+    }
 
-int64_t getRelativeIdxInBoundingBox(uint64_t currPosInBlock, const ADIOS_SELECTION_BOUNDINGBOX_STRUCT* bb, const ADIOS_VARBLOCK* blockSel)
-{
-    uint64_t spatialCoordinates[bb->ndim];
-    getCoordinateFromBlock(currPosInBlock, blockSel, bb->ndim, spatialCoordinates, bb->ndim);
-    return getPosInBox(bb, bb->ndim, spatialCoordinates);
-}
+    if (q->sel != NULL) {
+       const ADIOS_SELECTION_WRITEBLOCK_STRUCT *wb = &(q->sel->u.block);
+       
+       int absBlockCounter = wb->index;
+       if (!q->file->is_streaming) 
+	 absBlockCounter = query_utils_getGlobalWriteBlockId(wb->index, timeStep, v);
+       
+       if (v->blockinfo == NULL) {
+	 common_read_inq_var_blockinfo(q->file, v);
+       }
+       
+       ADIOS_VARBLOCK* blockSel = &(v->blockinfo[absBlockCounter]);
+       
+       mEvaluateBBRangeFancyQueryOnWhole(idxFile, q, timeStep, blockSel->start, blockSel->count);           
+       return 0;
+    }
+    return -1;
+  }
 
-int64_t getRelativeIdxInVariable(uint64_t currPosInBlock, const ADIOS_VARINFO* v, const ADIOS_VARBLOCK* blockSel)
-{
-    uint64_t spatialCoordinates[v->ndim];
-    getCoordinateFromBlock(currPosInBlock, blockSel, v->ndim, spatialCoordinates, v->ndim);
-    return getPosInVariable(v, v->ndim, spatialCoordinates);
 }
 
 int evaluateWithIdxOnBoundingBox(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeStep)
 {  
+  
   ADIOS_SELECTION* sel = q->sel;
   ADIOS_VARINFO* v = q->varinfo;
 
   create_fastbit_internal(q);
+  casestudyLogger_setPrefix(" created fastbit internal ");
 
   if (v == NULL) {
     ADIOS_QUERY* left = (ADIOS_QUERY*)(q->left);
@@ -478,8 +2228,23 @@ int evaluateWithIdxOnBoundingBox(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeSt
     if (evaluateWithIdxOnBoundingBox(idxFile, right, timeStep) < 0) {
       return -1;
     }
-
+#ifdef BITARRAY     
+    casestudyLogger_setPrefix(" merge bitarray ");
+    free(q->dataSlice);
+    q->dataSlice = bitarray_create(q->rawDataSize);
+    if (q->combineOp == ADIOS_QUERY_OP_OR) {            
+      bitarray_or((uint32_t*)(left->dataSlice), (uint32_t*)(right->dataSlice), (uint32_t*)(q->dataSlice), BITNSLOTS(q->rawDataSize));      
+    } else {
+      bitarray_and((uint32_t*)(left->dataSlice), (uint32_t*)(right->dataSlice), (uint32_t*)(q->dataSlice), BITNSLOTS(q->rawDataSize));      
+    }
+    free(left->dataSlice);
+    free(right->dataSlice);
+    left->dataSlice = 0;
+    right->dataSlice = 0;
+#else
     setCombinedQueryInternal(q);
+#endif
+    return 0;
   } else {
     // is a leaf
     if (q->rawDataSize == 0) {
@@ -517,35 +2282,69 @@ int evaluateWithIdxOnBoundingBox(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeSt
         adios_error (err_invalid_query_value, "Query processing failed. Unable to continue using index. vid=%d, dim[0]=%lld\n", v->varid, v->dims[0]);
 	return -1;
     }
+
+  casestudyLogger_setPrefix(" computed block ids to scan");
+#ifdef FANCY_QUERY
+#else  
+    #ifdef BITARRAY
+    uint32_t* bitSlice = bitarray_create(q->rawDataSize);
+    #else
     uint16_t* bitSlice = malloc((q->rawDataSize)* sizeof(uint16_t));
 
     for (i=0; i<q->rawDataSize; i++) {
       bitSlice[i] = 0;
     }
+    #endif
+#endif
+
+    int rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);      
+    char bitsArrayName[60];
+    sprintf(bitsArrayName, "%ld_%d_%d_%d", fastbit_adios_getCurrentTimeMillis(), v->varid, timeStep, rank);
 
     uint64_t currBlockIdx = blockStart;
 
     uint64_t sumBlocksBeforeThisTimeStep = 0;
     if (v->nsteps > 1) { // non streaming case
       for (i=0;i<timeStep; i++) {
-	sumBlocksBeforeThisTimeStep = v->nblocks[i];
+	sumBlocksBeforeThisTimeStep += v->nblocks[i];
       }
     }
-    uint64_t junk=0;
+
+    casestudyLogger_setPrefix(" start scanning");
+    char casestudyLoggerPrefix[30];
+
     for (currBlockIdx=blockStart; currBlockIdx <= blockEnd; currBlockIdx++) {
-      getHandle(timeStep, currBlockIdx, idxFile, q);	      
+      getHandle(timeStep, currBlockIdx, idxFile, q, 0);	      
       if (((FASTBIT_INTERNAL*)(q->queryInternal))->_handle == 0) {
 	log_warn(" Unable to construct fastbit query with NULL. Use _no_o idx method \n");
 	return -1;
       }
+
+      sprintf(casestudyLoggerPrefix, "block:%llu", currBlockIdx);
+      casestudyLogger_setPrefix(casestudyLoggerPrefix);
+
+      struct timespec evalStartT;
+      casestudyLogger_getRealtime(&evalStartT);
+
       uint64_t count = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 
       
-      junk += count;
-      log_debug("condition, %s, block: %lld hits = %lld, sum of hits so far: %lld\n", q->condition, currBlockIdx, count, junk);
+#ifdef FANCY_QUERY
+      //printf("\nNot that this only works if the region covered exactly by blocks.\n");
+      if (currBlockIdx == blockStart) {
+	fastbit_iapi_register_selection_as_bit_array(bitsArrayName, ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);
+      } else {
+	fastbit_iapi_extend_bit_array_with_selection(bitsArrayName, ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);
+      }
+#else
       //i = currBlockIdx-blockStart;
       uint64_t  coordinateArray[count];
       fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinateArray, count, 0);      
 
+      casestudyLogger_pro_writeout(&evalStartT, "fastbitevaluated");
+
+      struct timespec frameStartT;
+      casestudyLogger_getRealtime(&frameStartT);
       //fastbit_selection_free(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);
       ////fastbit_iapi_free_array_by_addr(q->_dataSlice); // if attached index    
       //fastbit_iapi_free_array_by_addr(q->dataSlice); // if attached index       
@@ -553,45 +2352,64 @@ int evaluateWithIdxOnBoundingBox(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeSt
 
       int absBlockIdx = currBlockIdx+sumBlocksBeforeThisTimeStep;
       int k=0;
+
+      int isDefaultSelection = isSameRegion(v, bb, timeStep);
+
       for (k=0; k<count; k++) {
 	uint64_t currPosInBlock = coordinateArray[k];
-	int64_t currPos = 0;
-	if (bb != NULL) {
-	  currPos = getRelativeIdxInBoundingBox(currPosInBlock, bb, &(v->blockinfo[absBlockIdx]));
-	} else {
-	  currPos = getRelativeIdxInVariable(currPosInBlock, v,  &(v->blockinfo[absBlockIdx]));
+	int64_t currPos = currPosInBlock;
+	
+	if (!isDefaultSelection) {
+	    currPos = getRelativeIdx(currPosInBlock, v, bb, absBlockIdx, timeStep);
 	}
 
 	log_debug("%lld th in block[%d],   =>  in actual box %lld  \n", currPosInBlock, absBlockIdx, currPos);
-	//log_warn("%lld th in block[%d],   =>  in actual %lld, limit: %lld \n", currPosInBlock, currBlockIdx, currPos, q->rawDataSize);
-	//if ((currPos >= 0) && (currPos < q->rawDataSize)) {
 	if (currPos >= 0) {
-	  bitSlice[currPos] = 1;
+            #ifdef BITARRAY
+	    bitarray_setbit(bitSlice, currPos);
+            #else
+	    bitSlice[currPos] = 1;
+            #endif
 	}
       }
-
+      casestudyLogger_frame_writeout(&frameStartT, "block processed");
+#endif
+      //casestudyLogger_setPrefix(" block processed");
       log_debug("----\n");
     }
 
-    int rank;
-    MPI_Comm_rank(MPI_COMM_WORLD, &rank);      
+    casestudyLogger_setPrefix(" blocksProcessedIndividually ");
 
-    char bitsArrayName[50+strlen(q->condition)];
-    sprintf(bitsArrayName, "%ld-%d-%s-%d-%d", fastbit_adios_getCurrentTimeMillis(), v->varid, q->condition, timeStep, rank);
     //return fastbit_selection_create(dataType, dataOfInterest, dataSize, compareOp, &vv);
 
+#ifdef FANCY_QUERY
+    //
+    // wrong result
+    //fastbit_iapi_register_array(bitsArrayName, FastBitDataTypeBitRaw, q->dataSlice, q->rawDataSize);
+    //FastBitSelectionHandle h = fastbit_selection_osr(bitsArrayName, FastBitCompareGreater, 0.1);
+    //
+    FastBitSelectionHandle h  = fastbit_selection_osr(bitsArrayName, FastBitCompareGreater, 0.0);
+    fastbit_adios_util_checkNotNull(h, bitsArrayName);    
+    ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = h;
+
+#else
     free(q->dataSlice);
     q->dataSlice = bitSlice;
 
     fastbit_iapi_free_array_by_addr(q->dataSlice);
-    fastbit_iapi_register_array(bitsArrayName, FastBitDataTypeUShort, q->dataSlice, q->rawDataSize);
 
-    //printData(q->_dataSlice, adios_unsigned_short, q->_rawDataSize); 
-    //fastbit_selection_free(q->_queryInternal);
-    FastBitSelectionHandle h = fastbit_selection_osr(bitsArrayName, FastBitCompareGreater, 0.5);
+  #ifdef BITARRAY
+    ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = 0;
+  #else
+    fastbit_iapi_register_array(bitsArrayName, FastBitDataTypeUShort, q->dataSlice, q->rawDataSize);
+    FastBitSelectionHandle h = fastbit_selection_osr(bitsArrayName, FastBitCompareGreater, 0);
     fastbit_adios_util_checkNotNull(h, bitsArrayName);    
     ((FASTBIT_INTERNAL*)(q->queryInternal))->_handle = h;
+  #endif
+
+#endif    
  
+    casestudyLogger_setPrefix(" summarized evaluation for bb");
     //fastbit_adios_util_checkNotNull(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, bitsArrayName);
   }
 }
@@ -624,7 +2442,7 @@ FastBitSelectionHandle createHandle(ADIOS_QUERY* q, const char* registeredArrayN
 }
 
 
-void getHandleFromBlockAtLeafQuery(int timeStep, int blockIdx, ADIOS_FILE* idxFile, ADIOS_QUERY* q) 
+void getHandleFromBlockAtLeafQuery(int timeStep, int blockIdx, ADIOS_FILE* idxFile, ADIOS_QUERY* q, uint64_t blockSize) 
 {
   //double *keys = NULL; int64_t*offsets= NULL; uint32_t *bms = NULL;  
     uint64_t nk, no, nb;
@@ -642,21 +2460,28 @@ void getHandleFromBlockAtLeafQuery(int timeStep, int blockIdx, ADIOS_FILE* idxFi
       common_read_inq_var_blockinfo(dataFile, v);
     }
 
-    uint64_t blockSize = 0;
-    if (q->file->is_streaming == 1) {
+    //uint64_t blockSize = 0;
+    if (blockSize == 0) {
+      if (q->file->is_streaming == 1) {
         blockSize = fastbit_adios_util_getBlockSize(v, -1, blockIdx);
-    } else {
+      } else {
         blockSize = fastbit_adios_util_getBlockSize(v, timeStep, blockIdx);
+      }
     }
 
     int rank;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);      
 
     char blockDataName[40+strlen(q->condition)];
-    sprintf(blockDataName, "%d-%s-%d-%d-%ld-%d", v->varid, q->condition, timeStep, blockIdx, fastbit_adios_getCurrentTimeMillis(), rank);
+    //sprintf(blockDataName, "%d-%s-%d-%d-%ld-%d", v->varid, q->condition, timeStep, blockIdx, fastbit_adios_getCurrentTimeMillis(), rank);
+    sprintf(blockDataName, "_%d_%d_%d_%ld_%d", v->varid,timeStep, blockIdx, fastbit_adios_getCurrentTimeMillis(), rank);
 
     FASTBIT_INTERNAL* itn = (FASTBIT_INTERNAL*)(q->queryInternal);
-#ifdef _READ_BMS_AS_NEEDED
+
+    struct timespec idxStartT;
+    casestudyLogger_getRealtime(&idxStartT);
+
+#ifdef __READ_BMS_AS_NEEDED__
     log_debug("FastBit will get bms as needed, not at the same time as key/offsets\n");
     if (fastbit_adios_util_readNoBMSFromIndexFile(idxFile, v, timeStep, blockIdx, &(itn->_keys), &nk, &(itn->_offsets), &no, &(itn->_bmsVarName)) < 0)     
 #else
@@ -691,14 +2516,17 @@ void getHandleFromBlockAtLeafQuery(int timeStep, int blockIdx, ADIOS_FILE* idxFi
       common_read_selection_delete(box);
       return;
     }
-    
+
+    //casestudyLogger_idx_writeout(&idxStartT, "index file visited ");
+    casestudyLogger_idx_writeout(&idxStartT, "index file visited ");
+
     //int err = fastbit_iapi_register_array(blockDataName, fastbit_adios_util_getFastbitDataType(v->type), q->_dataSlice, blockSize);
     uint64_t nv = blockSize;
     itn->_arrayName = malloc(strlen(blockDataName)+2);
     sprintf(itn->_arrayName, "%s", blockDataName);
     
     int ierr = fastbit_iapi_register_array_index_only(itn->_arrayName, fastbit_adios_util_getFastbitDataType(v->type), &nv, 1 , 
-#ifdef _READ_BMS_AS_NEEDED
+#ifdef __READ_BMS_AS_NEEDED__
 						      itn->_keys, nk, itn->_offsets, no, itn, adios_bmreader);
 #else
 						      itn->_keys, nk, itn->_offsets, no, itn->_bms, adios_bmreader);
@@ -771,6 +2599,10 @@ int readWithTimeStepNoIdx(ADIOS_QUERY* q, int timeStep) {
   if (q->file->is_streaming) 
       ts = 0; // if file is opened as stream, the actual 'actual timestep' is always 0
 
+  if (q->dataSlice == NULL) {
+    q->dataSlice = malloc(common_read_type_size(q->varinfo->type, q->varinfo->value)*q->rawDataSize);
+  }
+
   int errorCode = common_read_schedule_read_byid (q->file, q->sel, q->varinfo->varid, 
                                                   ts, 1, NULL,  q->dataSlice);
   log_debug("      schedule read error code = %d adios_error=%d \n", errorCode, adios_errno);
@@ -792,7 +2624,8 @@ int readWithTimeStepNoIdx(ADIOS_QUERY* q, int timeStep) {
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);      
 
   char datasetName[strlen(q->condition) + 40];
-  sprintf(datasetName, "noidx-%s-%d-%ld-%d", q->condition, timeStep, fastbit_adios_getCurrentTimeMillis(),rank);  
+  //sprintf(datasetName, "noidx_%s_%d_%ld_%d", q->condition, timeStep, fastbit_adios_getCurrentTimeMillis(),rank);  
+  sprintf(datasetName, "_noidx_%d_%ld_%d", timeStep, fastbit_adios_getCurrentTimeMillis(),rank);  
   setQueryInternal(q, compareOp, dataType, dataSize, datasetName);
 
   return 0;
@@ -882,7 +2715,7 @@ void blockSelectionFastbitHandle(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeSt
   if (q->varinfo != NULL) {
     const ADIOS_SELECTION_WRITEBLOCK_STRUCT *wb = &(q->sel->u.block);
     //int absBlockCounter = query_utils_getGlobalWriteBlockId(wb->index, timeStep, q->_var);    
-    getHandleFromBlockAtLeafQuery(timeStep, wb->index, idxFile, q);
+    getHandleFromBlockAtLeafQuery(timeStep, wb->index, idxFile, q, 0);
   } else {
     blockSelectionFastbitHandle(idxFile, q->left, timeStep);
     blockSelectionFastbitHandle(idxFile, q->right, timeStep);
@@ -892,15 +2725,15 @@ void blockSelectionFastbitHandle(ADIOS_FILE* idxFile, ADIOS_QUERY* q, int timeSt
 }
 
 
-void getHandle(int timeStep, int blockIdx, ADIOS_FILE* idxFile, ADIOS_QUERY* q) 
+void getHandle(int timeStep, int blockIdx, ADIOS_FILE* idxFile, ADIOS_QUERY* q, uint64_t blockSize) 
 {
   ADIOS_FILE* dataFile = q->file;
   ADIOS_VARINFO* v = q->varinfo;
 
   FastBitSelectionHandle result = NULL;
   if (v == NULL) {
-    getHandle(timeStep, blockIdx, idxFile, q->left);
-    getHandle(timeStep, blockIdx, idxFile, q->right);
+    getHandle(timeStep, blockIdx, idxFile, q->left, blockSize);
+    getHandle(timeStep, blockIdx, idxFile, q->right, blockSize);
 
     setCombinedQueryInternal(q);
     /*
@@ -913,7 +2746,7 @@ void getHandle(int timeStep, int blockIdx, ADIOS_FILE* idxFile, ADIOS_QUERY* q)
       q->_queryInternal = fastbit_selection_combine(left->_queryInternal, FastBitCombineOr, right->_queryInternal);
       } */   
   } else {
-    getHandleFromBlockAtLeafQuery(timeStep, blockIdx, idxFile, q);
+    getHandleFromBlockAtLeafQuery(timeStep, blockIdx, idxFile, q, blockSize);
   }     
 }
 
@@ -937,14 +2770,41 @@ int64_t  applyIndexIfExists (ADIOS_QUERY* q, int timeStep)
   //ADIOS_FILE* idxFile = fastbit_adios_util_getFastbitIndexFileToRead(basefileName, comm_dummy);
     
   if (idxFile != NULL) {
+    //casestudyLogger_starts("idxEval");
     //clear_fastbit_internal(q);
       if ((leaf->sel == NULL) || (leaf->sel->type == ADIOS_SELECTION_BOUNDINGBOX)) {
+#ifdef BITARRAY     
+	  if (evaluateWithIdxOnBoundingBoxWithBitArray(idxFile,  q, timeStep) >= 0) {
+#else
 	  if (evaluateWithIdxOnBoundingBox(idxFile,  q, timeStep) >= 0) {
-	     result = fastbit_selection_estimate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);	
+#endif
+	     casestudyLogger_bms_print();
+	     casestudyLogger_idx_print();
+	     casestudyLogger_pro_print();
+	     casestudyLogger_frame_print();
+	     casestudyLogger_setPrefix(" preparedBoundingBox ");
+	     if (((FASTBIT_INTERNAL*)(q->queryInternal))->_handle != 0) {
+	        result = fastbit_selection_estimate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);	
+		casestudyLogger_setPrefix(" estimateDone ");
+	     } else {	        
+	        result = bitarray_countHits(q->dataSlice, BITNSLOTS(q->rawDataSize));
+		casestudyLogger_setPrefix(" estimateDoneBitArray ");
+	     }
 	  }
       } else if (leaf->sel->type == ADIOS_SELECTION_WRITEBLOCK) {
-	  blockSelectionFastbitHandle(idxFile, q, timeStep);
-	  result= fastbit_selection_estimate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);       	  
+#ifdef BITARRAY
+	    evaluateWithIdxOnBlockWithBitArray(idxFile, q, timeStep);
+#else
+	    blockSelectionFastbitHandle(idxFile, q, timeStep);
+#endif
+	    //result= fastbit_selection_estimate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);       	  
+	    if (((FASTBIT_INTERNAL*)(q->queryInternal))->_handle != 0) {
+	      result = fastbit_selection_estimate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle);	
+	      casestudyLogger_setPrefix(" estimateDone ");
+	    } else {	        
+	      result = bitarray_countHits(q->dataSlice, BITNSLOTS(q->rawDataSize));
+	      casestudyLogger_setPrefix(" estimateDoneBitArray ");
+	    }
       } 
 
       log_debug("idx evaluated with result=%" PRId64 "\n", result);
@@ -956,6 +2816,7 @@ int64_t  applyIndexIfExists (ADIOS_QUERY* q, int timeStep)
 	//return result;
       } // otherwise, use no idx method
       //common_read_close(idxFile);      
+      //casestudyLogger_ends("idxEval");
   }
   
   
@@ -1064,14 +2925,29 @@ int64_t call_fastbit_evaluate(ADIOS_QUERY* q, int timeStep, uint64_t _maxResult)
      log_debug(":: user required more results. will evaluate again. \n");
   }
 
+  //casestudyLogger_starts("evaluatingFastbit");
+
+#ifdef BITARRAY
+  if (q->queryInternal == 0) {
+#else
   if ((q->queryInternal == 0) || (((FASTBIT_INTERNAL*)(q->queryInternal))->_handle == 0)) {
+#endif
     //log_error(">>  Unable to use fastbit to evaluate NULL query.\n"); 
     log_debug("query is NULL, result is NULL.");
     return 0;
   }
-  int64_t numHits = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 
+
+  int64_t numHits = -1;
+  if (((FASTBIT_INTERNAL*)(q->queryInternal))->_handle != 0) {
+    numHits = fastbit_selection_evaluate(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle); 
+  } else {
+    numHits = bitarray_countHits(q->dataSlice, BITNSLOTS(q->rawDataSize));
+  }
+
   log_debug(":: ==> fastbit_evaluate() num of hits found for [%s] = %lld, at timestep %d \n", q->condition, numHits, timeStep);  
 
+  //casestudyLogger_ends("evaluatingFastbit");
+
   if (numHits < 0) {
     return 0;
   }
@@ -1100,11 +2976,11 @@ void printOneSpatialCoordinate(int dim, uint64_t* spatialCoordinates)
 
 }
 
-void fillUp(int dimSize, uint64_t* spatialCoordinates, uint64_t i, uint64_t* pointArray) 
+ void fillUp(int dimSize, uint64_t* spatialCoordinates, uint64_t i, uint64_t* pointArray, int fortran_order) 
 {
   int k=0;
 
-  int fortran_order = futils_is_called_from_fortran();
+  //  int fortran_order = futils_is_called_from_fortran();
 
   for (k = 0; k < dimSize; k++) {	  
     uint64_t idx = i * dimSize + k;
@@ -1129,12 +3005,14 @@ ADIOS_SELECTION* getSpatialCoordinatesDefault(ADIOS_VARINFO* var, uint64_t* coor
   uint64_t arraySize = retrivalSize * (var->ndim);
   uint64_t* pointArray = (uint64_t*) (malloc(arraySize  * sizeof(uint64_t)));
 
+  int isFortranClient = futils_is_called_from_fortran();
+
   int i;
   for (i=0; i<retrivalSize; i++) {
     uint64_t spatialCoordinates[var->ndim];
     getCoordinateFromVariable(coordinates[i], var, var->ndim, spatialCoordinates);
     
-    fillUp(var->ndim, spatialCoordinates, i, pointArray);
+    fillUp(var->ndim, spatialCoordinates, i, pointArray, isFortranClient);
   }
   ADIOS_SELECTION* result =  common_read_selection_points(var->ndim, retrivalSize, pointArray);
   //free(pointArray); // user has to free this
@@ -1145,6 +3023,7 @@ ADIOS_SELECTION* getSpatialCoordinates(ADIOS_SELECTION* outputBoundary, uint64_t
 {
   int k = 0;
   uint64_t i=0;
+  int isFortranClient = futils_is_called_from_fortran();
 
   switch (outputBoundary->type) {
   case  ADIOS_SELECTION_BOUNDINGBOX:    
@@ -1156,9 +3035,11 @@ ADIOS_SELECTION* getSpatialCoordinates(ADIOS_SELECTION* outputBoundary, uint64_t
       
       for (i=0; i<retrivalSize; i++) {
 	   uint64_t spatialCoordinates[bb->ndim];
-	   getCoordinateFromBox(coordinates[i], bb, bb->ndim, spatialCoordinates);
+	   //getCoordinateFromBox(coordinates[i], bb, bb->ndim, spatialCoordinates);
+	   posToSpace(coordinates[i], isFortranClient, bb->count, spatialCoordinates, bb->ndim, bb->start);
+	   //fillUp(bb->ndim, spatialCoordinates, i, pointArray, isFortranClient);
 
-	   fillUp(bb->ndim, spatialCoordinates, i, pointArray);
+	   fillUp(bb->ndim, spatialCoordinates, i, pointArray, 0); // already fortran coordinates from posToSpace(.. isFortranClient ..)
       }
       ADIOS_SELECTION* result =  common_read_selection_points(bb->ndim, retrivalSize, pointArray);    
       //free(pointArray); // user has to free this
@@ -1175,7 +3056,7 @@ ADIOS_SELECTION* getSpatialCoordinates(ADIOS_SELECTION* outputBoundary, uint64_t
       for (i=0; i<retrivalSize; i++) {	
 	uint64_t spatialCoordinates[points->ndim];
 	getCoordinateFromPoints(coordinates[i], points, spatialCoordinates);
-	fillUp(points->ndim, spatialCoordinates, i, pointArray);
+	fillUp(points->ndim, spatialCoordinates, i, pointArray, isFortranClient);
       }
       ADIOS_SELECTION* result = common_read_selection_points(points->ndim, retrivalSize, pointArray);	      
       //free(pointArray); // user has to free this
@@ -1196,9 +3077,12 @@ ADIOS_SELECTION* getSpatialCoordinates(ADIOS_SELECTION* outputBoundary, uint64_t
 	   uint64_t spatialCoordinates[v->ndim];
 	   //create bb from block;
 	   int absBlockCounter = query_utils_getGlobalWriteBlockId(wb->index, timeStep, v);
-	   getCoordinateFromBlock(coordinates[i], &(v->blockinfo[absBlockCounter]), v->ndim, spatialCoordinates, v->ndim);
+	   //getCoordinateFromBlock(coordinates[i], &(v->blockinfo[absBlockCounter]), v->ndim, spatialCoordinates, v->ndim);
+	   ADIOS_VARBLOCK* blockSel = &(v->blockinfo[absBlockCounter]);
+	   posToSpace(coordinates[i], isFortranClient, blockSel->count, spatialCoordinates, v->ndim, blockSel->start);
 
-	   fillUp(v->ndim, spatialCoordinates, i, pointArray);
+	   //fillUp(v->ndim, spatialCoordinates, i, pointArray, isFortranClient); 
+	   fillUp(v->ndim, spatialCoordinates, i, pointArray, 0); // already fortran coordinates from posToSpace(.. isFortranClient ..)
       }
       ADIOS_SELECTION* result = common_read_selection_points(v->ndim, retrivalSize, pointArray);
       //free(pointArray); // user has to free this
@@ -1228,13 +3112,17 @@ int  adios_query_fastbit_evaluate(ADIOS_QUERY* q,
 				  ADIOS_SELECTION* outputBoundary, 
 				  ADIOS_SELECTION** result)
 {
+  casestudyLogger_init();
+  casestudyLogger_starts("queryArrived. initfastbit");
+
+  adios_query_fastbit_init();
+
   /*
   if (q->_onTimeStep < 0) {
     log_error(":: Error: need to call evaluate first! Exit.\n");
     return -1;
   }
   */
-  adios_query_fastbit_init();
 
   /*if (assertTimeStepValidWithQuery(q) != 0) {
     return -1;
@@ -1248,7 +3136,7 @@ int  adios_query_fastbit_evaluate(ADIOS_QUERY* q,
   int timeStep = adios_get_actual_timestep(q, incomingTimestep);
 
   call_fastbit_evaluate(q, timeStep, 0);
-  log_debug("::\t max=%llu  lastRead=%llu batchsize=\n", q->maxResultsDesired, q->resultsReadSoFar, batchSize);
+  log_debug("::\t max=%llu  lastRead=%llu batchsize=%llu\n", q->maxResultsDesired, q->resultsReadSoFar, batchSize);
 
   uint64_t retrivalSize = q->maxResultsDesired - q->resultsReadSoFar;
   if (retrivalSize == 0) {
@@ -1260,16 +3148,30 @@ int  adios_query_fastbit_evaluate(ADIOS_QUERY* q,
       retrivalSize = batchSize;
   }
 
-  uint64_t coordinates[retrivalSize];
+  //uint64_t coordinates[retrivalSize];
+  uint64_t* coordinates = (uint64_t*) calloc(retrivalSize, sizeof(uint64_t));
+  if (coordinates == 0) {
+    log_error("Unable to allocate for coordiantes.");
+    return -1;
+  }
+
+  struct timespec startT;
+  casestudyLogger_getRealtime(&startT);
+
+  if (((FASTBIT_INTERNAL*)(q->queryInternal))->_handle != 0) {
+    fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinates, retrivalSize, q->resultsReadSoFar);
+    casestudyLogger_idx_writeout(&startT, "getCoordinates");
+  } else {
+    bitarray_getHits(q->dataSlice, coordinates, BITNSLOTS(q->rawDataSize), q->resultsReadSoFar, retrivalSize);
+  }
 
-  fastbit_selection_get_coordinates(((FASTBIT_INTERNAL*)(q->queryInternal))->_handle, coordinates, retrivalSize, q->resultsReadSoFar);
-    
   q->resultsReadSoFar += retrivalSize;
   
   if (outputBoundary == 0) {
     ADIOS_QUERY* firstLeaf = getFirstLeaf(q);
     if ((firstLeaf == NULL) || (firstLeaf->varinfo == NULL)) {
 	log_error(":: Error: unable to get a valid first leaf! Exit. \n");
+	free(coordinates);
 	return -1;
       }
     if (firstLeaf->sel == NULL) {
@@ -1283,10 +3185,13 @@ int  adios_query_fastbit_evaluate(ADIOS_QUERY* q,
     // not sure wheather this is well defined case of combined query?! but the first varibale will be used for block information calculation
     *result = getSpatialCoordinates(outputBoundary, coordinates, retrivalSize, getFirstLeaf(q)->varinfo, timeStep);
 
+    free(coordinates);
     if (*result == 0) {
       return -1;
     }
   }
+  casestudyLogger_frame_writeout(&startT, "bitarrayGetHits");
+
   // print results
   /*
   int i=0; 
@@ -1300,6 +3205,9 @@ int  adios_query_fastbit_evaluate(ADIOS_QUERY* q,
   }
   log_debug("]\n\n");
   */
+  casestudyLogger_frame_print();
+  casestudyLogger_ends("evaluation_total");
+
   if (q->resultsReadSoFar == q->maxResultsDesired) {
     return 0;
   } else {
diff --git a/src/query/query_utils.c b/src/query/query_utils.c
index 11cb59c..760215e 100644
--- a/src/query/query_utils.c
+++ b/src/query/query_utils.c
@@ -35,3 +35,10 @@ int query_utils_file_exists (char * path)
     return 0;
 }
 
+// records the current time-stamp
+double dclock(void) {
+	struct timeval tv;
+	gettimeofday(&tv, 0);
+
+	return (double) tv.tv_sec + (double) tv.tv_usec * 1e-6;
+}
diff --git a/src/query/query_utils.h b/src/query/query_utils.h
index 39c534f..bc2ca3d 100644
--- a/src/query/query_utils.h
+++ b/src/query/query_utils.h
@@ -18,7 +18,8 @@ int query_utils_getGlobalWriteBlockId(int idxRelativeToTimeStep, int timeStep, A
 /* Return 1 if path exists on the file system, 0 otherwise */
 int query_utils_file_exists (char * path);
 
-
+//current timestamp
+double dclock(void);
 
 #ifdef __cplusplus
 }
diff --git a/src/read/read_bp.c b/src/read/read_bp.c
index 8cc57cb..b04e650 100644
--- a/src/read/read_bp.c
+++ b/src/read/read_bp.c
@@ -85,9 +85,7 @@ static int adios_wbidx_to_pgidx (const ADIOS_FILE * fp, read_request * r, int st
         fh->b->offset = 0;                                                                  \
                                                                                             \
         MPI_File * sfh;                                                                     \
-        sfh = get_BP_file_handle (fh->sfh                                                   \
-                                 ,v->characteristics[start_idx + idx].file_index            \
-                                 );                                                         \
+        sfh = get_BP_subfile_handle (fh, v->characteristics[start_idx + idx].file_index);   \
         if (!sfh)                                                                           \
         {                                                                                   \
             int err;                                                                        \
@@ -122,9 +120,7 @@ static int adios_wbidx_to_pgidx (const ADIOS_FILE * fp, read_request * r, int st
                fprintf (stderr, "can not open file %s\n", name);                            \
                return 0;                                                                    \
            }                                                                                \
-           add_BP_file_handle (&fh->sfh                                                     \
-                              ,new_h                                                        \
-                              );                                                            \
+           add_BP_subfile_handle (fh, new_h);                                                  \
            sfh = &new_h->fh;                                                                \
                                                                                             \
            free (name_no_path);                                                             \
@@ -179,9 +175,7 @@ static int adios_wbidx_to_pgidx (const ADIOS_FILE * fp, read_request * r, int st
 // To read subfiles
 #define MPI_FILE_READ_OPS2_BUF(buf)                                                         \
         MPI_File * sfh;                                                                     \
-        sfh = get_BP_file_handle (fh->sfh                                                   \
-                                 ,v->characteristics[start_idx + idx].file_index            \
-                                 );                                                         \
+        sfh = get_BP_subfile_handle (fh, v->characteristics[start_idx + idx].file_index);   \
         if (!sfh)                                                                           \
         {                                                                                   \
             int err;                                                                        \
@@ -216,9 +210,7 @@ static int adios_wbidx_to_pgidx (const ADIOS_FILE * fp, read_request * r, int st
                fprintf (stderr, "can not open file %s\n", name);                            \
                return 0;                                                                    \
            }                                                                                \
-           add_BP_file_handle (&fh->sfh                                                     \
-                              ,new_h                                                        \
-                              );                                                            \
+           add_BP_subfile_handle (fh, new_h);                                                 \
            sfh = &new_h->fh;                                                                \
                                                                                             \
            free (name_no_path);                                                             \
@@ -292,19 +284,7 @@ static BP_FILE * open_file (const char * fname, MPI_Comm comm)
         return 0;
     }
 
-    fh = (BP_FILE *) malloc (sizeof (BP_FILE));
-    assert (fh);
-
-    fh->fname = (fname ? strdup (fname) : 0L);
-    fh->sfh = 0;
-    fh->comm = comm;
-    fh->gvar_h = 0;
-    fh->pgs_root = 0;
-    fh->vars_root = 0;
-    fh->attrs_root = 0;
-    fh->vars_table = 0;
-    fh->b = malloc (sizeof (struct adios_bp_buffer_struct_v1));
-    assert (fh->b);
+    fh = BP_FILE_alloc (fname, comm);
 
     bp_open (fname, comm, fh);
 
@@ -1137,19 +1117,7 @@ static int open_stream (ADIOS_FILE * fp, const char * fname,
         return err_file_not_found;
     }
 
-    fh = (BP_FILE *) malloc (sizeof (BP_FILE));
-    assert (fh);
-
-    fh->fname = (fname ? strdup (fname) : 0L);
-    fh->sfh = 0;
-    fh->comm = comm;
-    fh->gvar_h = 0;
-    fh->pgs_root = 0;
-    fh->vars_root = 0;
-    fh->attrs_root = 0;
-    fh->vars_table = 0;
-    fh->b = malloc (sizeof (struct adios_bp_buffer_struct_v1));
-    assert (fh->b);
+    fh = BP_FILE_alloc (fname, comm);
 
     p = (BP_PROC *) malloc (sizeof (BP_PROC));
     assert (p);
@@ -1209,19 +1177,7 @@ ADIOS_FILE * adios_read_bp_open_file (const char * fname, MPI_Comm comm)
 
     MPI_Comm_rank (comm, &rank);
 
-    fh = (BP_FILE *) malloc (sizeof (BP_FILE));
-    assert (fh);
-
-    fh->fname = (fname ? strdup (fname) : 0L);
-    fh->sfh = 0;
-    fh->comm = comm;
-    fh->gvar_h = 0;
-    fh->pgs_root = 0;
-    fh->vars_root = 0;
-    fh->attrs_root = 0;
-    fh->vars_table = 0;
-    fh->b = malloc (sizeof (struct adios_bp_buffer_struct_v1));
-    assert (fh->b);
+    fh = BP_FILE_alloc (fname, comm);
 
     p = (BP_PROC *) malloc (sizeof (BP_PROC));
     assert (p);
@@ -2292,6 +2248,8 @@ static ADIOS_VARBLOCK * inq_var_blockinfo(const ADIOS_FILE * fp, const ADIOS_VAR
     uint64_t * ldims, * gdims, * offsets;
     int dummy = -1;
     struct adios_index_var_struct_v1 * var_root;
+    struct bp_index_pg_struct_v1 * pgs = fh->pgs_root;
+    uint32_t current_process_id = pgs->process_id;
     ADIOS_VARBLOCK *blockinfo;
 
     assert (varinfo);
@@ -2329,6 +2287,7 @@ static ADIOS_VARBLOCK * inq_var_blockinfo(const ADIOS_FILE * fp, const ADIOS_VAR
     j = 0; 
     for (i = 0; i < nblks; i++)
     {
+        int k; /* to save i or j for the process_id determination step below */
         blockinfo[i].start = (uint64_t *) malloc (dimcount * 8);
         blockinfo[i].count = (uint64_t *) malloc (dimcount * 8);
         assert (blockinfo[i].start && blockinfo[i].count);
@@ -2346,6 +2305,7 @@ static ADIOS_VARBLOCK * inq_var_blockinfo(const ADIOS_FILE * fp, const ADIOS_VAR
             				&blk_characteristic->dims;
 
             bp_get_dimension_generic_notime(blk_dims, ldims, gdims, offsets, file_is_fortran);
+            k = i;
         }
         else
         {
@@ -2367,6 +2327,7 @@ static ADIOS_VARBLOCK * inq_var_blockinfo(const ADIOS_FILE * fp, const ADIOS_VAR
                 				&blk_characteristic->dims;
 
                 bp_get_dimension_generic_notime(blk_dims, ldims, gdims, offsets, file_is_fortran);
+                k = j;
                 j++;
             }
             else
@@ -2377,7 +2338,7 @@ static ADIOS_VARBLOCK * inq_var_blockinfo(const ADIOS_FILE * fp, const ADIOS_VAR
 
         // NCSU ALACRITY-ADIOS - If a time dimension was removed above, update
         // dimcount so that dimension copy/swapping works below
-        if (dimcount > 0 && ldims[dimcount - 1] == 0)
+        if (dimcount > 0 && ldims[dimcount-1] == 0 && gdims[dimcount-1] != 0)
             dimcount--;
 
         /*Fix: the function above swaps the dimensions to C order in any case. 
@@ -2397,6 +2358,18 @@ static ADIOS_VARBLOCK * inq_var_blockinfo(const ADIOS_FILE * fp, const ADIOS_VAR
 //            swap_order (dimcount, blockinfo[i].start, &timedim);
 //            swap_order (dimcount, blockinfo[i].count, &timedim);
 //        }
+        
+        /* Find the process ID */
+        //blockinfo[i].process_id = (uint32_t)-1;
+        while (pgs != NULL && 
+               pgs->offset_in_file <= var_root->characteristics[k].offset) 
+        {
+            current_process_id = pgs->process_id;
+            pgs = pgs->next;
+        }
+        blockinfo[i].process_id = current_process_id;
+        blockinfo[i].time_index = var_root->characteristics[k].time_index;
+        
     }
 
     free (ldims);
@@ -3151,8 +3124,13 @@ int adios_read_bp_get_attr_byid (const ADIOS_FILE * fp, int attrid, enum ADIOS_D
     if (attr_root->characteristics[attr_c_index].value)
     {
         /* Attribute has its own value */
-        *size = bp_get_type_size (attr_root->type, attr_root->characteristics[attr_c_index].value);
         *type = attr_root->type;
+        int type_size = bp_get_type_size (attr_root->type, attr_root->characteristics[attr_c_index].value);
+        if (*type == adios_string) {
+            *size = type_size;
+        } else {
+            *size = attr_root->nelems * type_size;
+        }
         *data = (void *) malloc (*size);
         assert (*data);
 
diff --git a/src/read/read_bp_staged.c b/src/read/read_bp_staged.c
index f5f8c6e..f241e16 100644
--- a/src/read/read_bp_staged.c
+++ b/src/read/read_bp_staged.c
@@ -957,7 +957,7 @@ static void read_chunk (const ADIOS_FILE * fp,
 
     if (has_subfile)
     {
-        sfh = get_BP_file_handle (fh->sfh, file_idx);
+        sfh = get_BP_subfile_handle (fh, file_idx);   
 
         if (!sfh)
         {
@@ -994,7 +994,7 @@ static void read_chunk (const ADIOS_FILE * fp,
                 return;
             }
 
-            add_BP_file_handle (&fh->sfh, new_h);
+            add_BP_subfile_handle (fh, new_h);
             sfh = &new_h->fh;
 
             free (name_no_path);
@@ -2145,7 +2145,7 @@ ADIOS_FILE * adios_read_bp_staged_open_file (const char * fname, MPI_Comm comm)
     assert (fh);
     fh->fname = (fname ? strdup (fname) : 0L);
     fh->mpi_fh = 0;
-    fh->sfh = 0;
+    fh->subfile_handles.n_handles = 0;
     fh->comm = comm;
     fh->gvar_h = 0;
     fh->pgs_root = 0;
diff --git a/src/read/read_dataspaces.c b/src/read/read_dataspaces.c
index 8cb2dde..89f454c 100644
--- a/src/read/read_dataspaces.c
+++ b/src/read/read_dataspaces.c
@@ -1108,6 +1108,8 @@ int adios_read_dataspaces_inq_var_blockinfo (const ADIOS_FILE *fp, ADIOS_VARINFO
         varinfo->blockinfo->start[i] = 0;
         varinfo->blockinfo->count[i] = ds->vars[varinfo->varid].dims[i];
     }
+    varinfo->blockinfo->process_id = 0;
+    varinfo->blockinfo->time_index = fp->current_step;
     return 0;
 }
 
diff --git a/src/read/read_dimes.c b/src/read/read_dimes.c
index 62f2f89..8a8bc85 100644
--- a/src/read/read_dimes.c
+++ b/src/read/read_dimes.c
@@ -1138,6 +1138,8 @@ int adios_read_dimes_inq_var_blockinfo (const ADIOS_FILE *fp, ADIOS_VARINFO * va
         varinfo->blockinfo->start[i] = 0;
         varinfo->blockinfo->count[i] = ds->vars[varinfo->varid].dims[i];
     }
+    varinfo->blockinfo->process_id = 0;
+    varinfo->blockinfo->time_index = fp->current_step;
     return 0;
 }
 
diff --git a/src/read/read_flexpath.c b/src/read/read_flexpath.c
index 3b6496f..dc31011 100644
--- a/src/read/read_flexpath.c
+++ b/src/read/read_flexpath.c
@@ -1,6 +1,6 @@
 /*
-    read_flexpath.c       
-    Goal: to create evpath io connection layer in conjunction with 
+    read_flexpath.c
+    Goal: to create evpath io connection layer in conjunction with
     write/adios_flexpath.c
 
 */
@@ -50,7 +50,10 @@
 #include "dmalloc.h"
 #endif
 
-#define FP_BATCH_SIZE 1
+#define FP_BATCH_SIZE 4
+
+#define MAX(x, y) (((x) > (y)) ? (x) : (y))
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
 
 typedef struct _bridge_info
 {
@@ -90,7 +93,7 @@ typedef struct _array_displ
     int ndims;
     uint64_t pos;
     uint64_t *start;
-    uint64_t *count;    
+    uint64_t *count;
 }array_displacements;
 
 typedef struct _flexpath_var
@@ -169,7 +172,7 @@ flexpath_read_data* fp_read_data = NULL;
 
 /********** Helper functions. **********/
 
-static void 
+static void
 reverse_dims(uint64_t *dims, int len)
 {
     int i;
@@ -182,10 +185,10 @@ reverse_dims(uint64_t *dims, int len)
     }
 }
 
-void build_bridge(bridge_info* bridge) 
+void build_bridge(bridge_info* bridge)
 {
     attr_list contact_list = attr_list_from_string(bridge->contact);
-    if(bridge->created == 0){
+    if (bridge->created == 0) {
 	bridge->bridge_stone =
 	    EVcreate_bridge_action(fp_read_data->cm,
 				   contact_list,
@@ -213,9 +216,9 @@ void build_bridge(bridge_info* bridge)
 void
 free_displacements(array_displacements *displ, int num)
 {
-    if(displ){
+    if (displ) {
 	int i;
-	for(i=0; i<num; i++){
+	for (i=0; i<num; i++) {
 	    free(displ[i].start);
 	    free(displ[i].count);
 	}
@@ -233,11 +236,11 @@ flexpath_var*
 new_flexpath_var(const char *varname, int id, uint64_t type_size)
 {
     flexpath_var *var = malloc(sizeof(flexpath_var));
-    if(var == NULL){
+    if (var == NULL) {
 	log_error("Error creating new var: %s\n", varname);
 	return NULL;
     }
-    
+
     memset(var, 0, sizeof(flexpath_var));
     // free this when freeing vars.
     var->varname = strdup(varname);
@@ -252,21 +255,21 @@ flexpath_reader_file*
 new_flexpath_reader_file(const char *fname)
 {
     flexpath_reader_file *fp = calloc(1, sizeof(*fp));
-    if(fp == NULL){
+    if (fp == NULL) {
 	log_error("Cannot create data for new file.\n");
 	exit(1);
     }
     fp->file_name = strdup(fname);
     fp->writer_coordinator = -1;
     fp->last_writer_step = -1;
-    fp->req = (flexpath_read_request){.num_pending = 0, .num_completed = 0, .condition = -1};
+    fp->req = (flexpath_read_request) {.num_pending = 0, .num_completed = 0, .condition = -1};
     pthread_mutex_init(&fp->data_mutex, NULL);
     pthread_cond_init(&fp->data_condition, NULL);
-    return fp;        
+    return fp;
 }
 
 enum ADIOS_DATATYPES
-ffs_type_to_adios_type(const char *ffs_type)
+ffs_type_to_adios_type(const char *ffs_type, int size)
 
 {
     char *bracket = "[";
@@ -278,70 +281,89 @@ ffs_type_to_adios_type(const char *ffs_type)
     else {
         filtered_type = malloc(posfound+1);
         memset(filtered_type, '\0', posfound+1);
-        filtered_type = strncpy(filtered_type, ffs_type, posfound);       
+        filtered_type = strncpy(filtered_type, ffs_type, posfound);
     }
 
-    if (!strcmp("integer", filtered_type))
-	return adios_integer;
-    else if(!strcmp("float", filtered_type))
+    if (!strcmp("integer", filtered_type)) {
+	if (size == sizeof(int)) {
+	    return adios_integer;
+	} else if (size == sizeof(long)) {
+	    return adios_long;
+	}
+    }
+    else if (!strcmp("unsigned integer", filtered_type)) {
+	    if (size == sizeof(unsigned int)) {
+		return adios_unsigned_integer;
+	    } else if (size == sizeof(unsigned long)) {
+		return adios_unsigned_long;
+	    }
+	}	   
+    else if (!strcmp("float", filtered_type))
 	return adios_real;
-    else if(!strcmp("string", filtered_type))
+    else if (!strcmp("string", filtered_type))
 	return adios_string;
-    else if(!strcmp("double", filtered_type))
-	return adios_double;
-    else if(!strcmp("char", filtered_type))
+    else if (!strcmp("double", filtered_type)) {
+	if (size == sizeof(double)) {
+	    return adios_double;
+	} else if (size == sizeof(long double)) {
+	    return adios_long_double;
+	}
+    }
+    else if (!strcmp("char", filtered_type))
 	return adios_byte;
-    else if(!strcmp("complex", filtered_type))
+    else if (!strcmp("complex", filtered_type))
 	return adios_complex;
-    else if(!strcmp("double_complex", filtered_type))
+    else if (!strcmp("double_complex", filtered_type))
         return adios_double_complex;
-    else
+    else {
+	fprintf(stderr, "returning unknown for: ffs_type: %s\n", ffs_type);
 	return adios_unknown;
+    }
 }
 
-ADIOS_VARINFO* 
+ADIOS_VARINFO*
 convert_var_info(flexpath_var * fpvar,
-		 ADIOS_VARINFO * v, 
+		 ADIOS_VARINFO * v,
 		 const char* varname,
 		 const ADIOS_FILE *adiosfile)
 {
     int i;
-    flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;    
+    flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;
     v->type = fpvar->type;
     v->ndim = fpvar->ndims;
     // needs to change. Has to get information from write.
     v->nsteps = 1;
     v->nblocks = malloc(sizeof(int)*v->nsteps);
-    v->sum_nblocks = 1;    
+    v->sum_nblocks = 1;
     v->nblocks[0] = 1;
     v->statistics = NULL;
     v->blockinfo = NULL;
 
-    if(v->ndim == 0){    
-	int value_size = fpvar->type_size;	
+    if (v->ndim == 0) {
+	int value_size = fpvar->type_size;
 	v->value = malloc(value_size);
 	if(!v->value) {
-	    adios_error(err_no_memory, 
+	    adios_error(err_no_memory,
 			"Cannot allocate buffer in adios_read_flexpath_inq_var()");
 	    return NULL;
 	}
 	flexpath_var_chunk * chunk = &fpvar->chunks[0];
 	memcpy(v->value, chunk->data, value_size);
-	v->global = 0;	
-    }else{ // arrays
+	v->global = 0;
+    } else { // arrays
 	v->dims = (uint64_t*)malloc(v->ndim * sizeof(uint64_t));
-	if(!v->dims) {
-	    adios_error(err_no_memory, 
+	if (!v->dims) {
+	    adios_error(err_no_memory,
 			"Cannot allocate buffer in adios_read_flexpath_inq_var()");
 	    return NULL;
 	}
 	// broken.  fix. -- why did I put this comment here?
 	int cpysize = fpvar->ndims*sizeof(uint64_t);
-	if(fpvar->global_dims){
+	if (fpvar->global_dims) {
 	    v->global = 1;
 	    memcpy(v->dims, fpvar->global_dims, cpysize);
 	}
-	else{
+	else {
 	    v->global = 0;
 	}
     }
@@ -351,8 +373,8 @@ convert_var_info(flexpath_var * fpvar,
 flexpath_var *
 find_fp_var(flexpath_var * var_list, const char * varname)
 {
-    while(var_list){
-	if(!strcmp(varname, var_list->varname)){
+    while (var_list) {
+	if (!strcmp(varname, var_list->varname)) {
 	    return var_list;
 	}
 	var_list = var_list->next;
@@ -360,12 +382,12 @@ find_fp_var(flexpath_var * var_list, const char * varname)
     return NULL;
 }
 
-global_var* 
+global_var*
 find_gbl_var(global_var *vars, const char *name, int num_vars)
 {
     int i;
-    for(i=0; i<num_vars; i++){
-	if(!strcmp(vars[i].name, name))
+    for (i=0; i<num_vars; i++) {
+	if (!strcmp(vars[i].name, name))
 	    return &vars[i];
     }
     return NULL;
@@ -377,7 +399,7 @@ find_field_by_name (const char *name, const FMFieldList flist)
     FMField *f = flist;
     while (f->field_name != NULL)
     {
-        if(!strcmp(name, f->field_name))
+        if (!strcmp(name, f->field_name))
             return f;
         else
             f++;
@@ -389,21 +411,21 @@ static uint64_t
 calc_ffspacket_size(FMField *f, attr_list attrs, void *buffer)
 {
     uint64_t size = 0;
-    while(f->field_name){
+    while (f->field_name) {
         char atom_name[200] = "";
 
         strcat(atom_name, FP_NDIMS_ATTR_NAME);
         strcat(atom_name, "_");
         strcat(atom_name, f->field_name);
-        int num_dims = 0;	
+        int num_dims = 0;
         get_int_attr(attrs, attr_atom_from_string(atom_name), &num_dims);
-	if(num_dims == 0){
+	if (num_dims == 0) {
 	    size += (uint64_t)f->field_size;
 	}
-	else{
+	else {
 	    int i;
 	    uint64_t tmpsize = (uint64_t)f->field_size;
-	    for(i=0; i<num_dims; i++){
+	    for (i=0; i<num_dims; i++) {
 		char *dim;
 		char atom_name[200] ="";
 		strcat(atom_name, FP_DIM_ATTR_NAME);
@@ -418,7 +440,7 @@ calc_ffspacket_size(FMField *f, attr_list attrs, void *buffer)
 		FMField *temp_field = find_field_by_name(dim, f);
 		uint64_t *temp_val = get_FMfieldAddr_by_name(temp_field,
 							     temp_field->field_name,
-							     buffer);		
+							     buffer);
 		uint64_t dimval = *temp_val;
 		tmpsize *= dimval;
 	    }
@@ -434,7 +456,7 @@ print_displacement(array_displacements *disp, int myrank)
 {
     printf("rank: %d, writer displacements for writer: %d\n", myrank, disp->writer_rank);
     printf("\tndims: %d, pos: %d\n", disp->ndims, (int)disp->pos);
-    
+
     int i;
     printf("\tstarts: ");
     for (i = 0; i<disp->ndims; i++) {
@@ -455,9 +477,9 @@ array_displacements*
 find_displacement(array_displacements *list, int rank, int num_displ)
 {
     int i;
-    for(i=0; i<num_displ; i++){
-	if(list[i].writer_rank == rank)
-	    return &list[i];	
+    for (i=0; i<num_displ; i++) {
+	if (list[i].writer_rank == rank)
+	    return &list[i];
     }
     return NULL;
 }
@@ -465,8 +487,8 @@ find_displacement(array_displacements *list, int rank, int num_displ)
 
 array_displacements*
 get_writer_displacements(
-    int writer_rank, 
-    const ADIOS_SELECTION * sel, 
+    int writer_rank,
+    const ADIOS_SELECTION * sel,
     global_var* gvar,
     uint64_t *size)
 {
@@ -476,7 +498,7 @@ get_writer_displacements(
     displ->writer_rank = writer_rank;
 
     displ->start = malloc(sizeof(uint64_t) * ndims);
-    displ->count = malloc(sizeof(uint64_t) * ndims);  
+    displ->count = malloc(sizeof(uint64_t) * ndims);
     memset(displ->start, 0, sizeof(uint64_t) * ndims);
     memset(displ->count, 0, sizeof(uint64_t) * ndims);
 
@@ -487,19 +509,19 @@ get_writer_displacements(
 
     int i;
     int _size = 1;
-    for(i=0; i<ndims; i++){	
-	if(sel->u.bb.start[i] >= offsets[pos+i]){
+    for (i=0; i<ndims; i++) {
+	if (sel->u.bb.start[i] >= offsets[pos+i]) {
 	    int start = sel->u.bb.start[i] - offsets[pos+i];
 	    displ->start[i] = start;
 	}
-	if((sel->u.bb.start[i] + sel->u.bb.count[i] - 1) <= 
-	   (offsets[pos+i] + local_dims[pos+i] - 1)){
-	    int count = ((sel->u.bb.start[i] + sel->u.bb.count[i] - 1) - 
+	if ((sel->u.bb.start[i] + sel->u.bb.count[i] - 1) <=
+	   (offsets[pos+i] + local_dims[pos+i] - 1)) {
+	    int count = ((sel->u.bb.start[i] + sel->u.bb.count[i] - 1) -
 			 offsets[pos+i]) - displ->start[i] + 1;
 	    displ->count[i] = count;
 
-	    
-	}else{
+
+	} else {
 	    int count = (local_dims[pos+i] - 1) - displ->start[i] + 1;
 	    displ->count[i] = count;
 	}
@@ -511,27 +533,27 @@ get_writer_displacements(
 
 int
 need_writer(
-    flexpath_reader_file *fp, 
-    int writer, 
-    const ADIOS_SELECTION *sel, 
-    evgroup_ptr gp, 
-    char *varname) 
-{    
+    flexpath_reader_file *fp,
+    int writer,
+    const ADIOS_SELECTION *sel,
+    evgroup_ptr gp,
+    char *varname)
+{
     //select var from group
     global_var *gvar = find_gbl_var(gp->vars, varname, gp->num_vars);
 
     //for each dimension
     int i=0;
     offset_struct var_offsets = gvar->offsets[0];
-    for (i=0; i< var_offsets.offsets_per_rank; i++) {      
+    for (i=0; i< var_offsets.offsets_per_rank; i++) {
 	int pos = writer*(var_offsets.offsets_per_rank) + i;
 
         uint64_t sel_offset = sel->u.bb.start[i];
-        uint64_t sel_size = sel->u.bb.count[i];        
-	
+        uint64_t sel_size = sel->u.bb.count[i];
+
         uint64_t rank_offset = var_offsets.local_offsets[pos];
-        uint64_t rank_size = var_offsets.local_dimensions[pos];        
-	
+        uint64_t rank_size = var_offsets.local_dimensions[pos];
+
 	/* printf("need writer rank: %d writer: %d sel_start: %d sel_count: %d rank_offset: %d rank_size: %d\n", */
 	/*        fp->rank, writer, (int)sel_offset, (int)sel_size, (int)rank_offset, (int)rank_size); */
 
@@ -553,16 +575,16 @@ void
 free_fmstructdesclist(FMStructDescList struct_list)
 {
     FMField *f = struct_list[0].field_list;
-    
+
     //cant free field_name because it's const.
     /* FMField *temp = f; */
-    /* while(temp->field_name){ */
+    /* while (temp->field_name) { */
     /* 	free(temp->field_name); */
     /* 	temp++; */
     /* } */
-    free(f);   
+    free(f);
     free(struct_list[0].opt_info);
-    free(struct_list);   
+    free(struct_list);
 }
 
 int
@@ -584,15 +606,15 @@ setup_flexpath_vars(FMField *f, int *num)
     flexpath_var *vars = NULL;
     int var_count = 0;
 
-    while(f->field_name != NULL){
+    while (f->field_name != NULL) {
 	flexpath_var *curr_var = new_flexpath_var(f->field_name,
-						  var_count, 
+						  var_count,
 						  f->field_size);
 	curr_var->num_chunks = 1;
 	curr_var->chunks =  malloc(sizeof(flexpath_var_chunk)*curr_var->num_chunks);
 	memset(curr_var->chunks, 0, sizeof(flexpath_var_chunk)*curr_var->num_chunks);
 	curr_var->sel = NULL;
-	curr_var->type = ffs_type_to_adios_type(f->field_type);
+	curr_var->type = ffs_type_to_adios_type(f->field_type, f->field_size);
 	flexpath_var *temp = vars;
 	curr_var->next = temp;
 	vars = curr_var;
@@ -610,7 +632,7 @@ setup_flexpath_vars(FMField *f, int *num)
 void
 send_open_msg(flexpath_reader_file *fp, int destination)
 {
-    if(!fp->bridges[destination].created){
+    if (!fp->bridges[destination].created) {
 	build_bridge(&(fp->bridges[destination]));
     }
     op_msg msg;
@@ -621,7 +643,7 @@ send_open_msg(flexpath_reader_file *fp, int destination)
     int cond = CMCondition_get(fp_read_data->cm, NULL);
     msg.condition = cond;
 
-    EVsubmit(fp->bridges[destination].op_source, &msg, NULL);    
+    EVsubmit(fp->bridges[destination].op_source, &msg, NULL);
     CMCondition_wait(fp_read_data->cm, cond);
     fp->bridges[destination].opened = 1;
 }
@@ -629,7 +651,7 @@ send_open_msg(flexpath_reader_file *fp, int destination)
 void
 send_close_msg(flexpath_reader_file *fp, int destination)
 {
-    if(!fp->bridges[destination].created){
+    if (!fp->bridges[destination].created) {
 	build_bridge(&(fp->bridges[destination]));
     }
     op_msg msg;
@@ -640,8 +662,8 @@ send_close_msg(flexpath_reader_file *fp, int destination)
     //msg.condition = -1;
     int cond = CMCondition_get(fp_read_data->cm, NULL);
     msg.condition = cond;
-    EVsubmit(fp->bridges[destination].op_source, &msg, NULL);  
-    CMCondition_wait(fp_read_data->cm, cond);  
+    EVsubmit(fp->bridges[destination].op_source, &msg, NULL);
+    CMCondition_wait(fp_read_data->cm, cond);
     fp->bridges[destination].opened = 0;
 }
 
@@ -653,44 +675,44 @@ send_flush_msg(flexpath_reader_file *fp, int destination, Flush_type type, int u
     msg.process_id = fp->rank;
     msg.id = fp->mystep;
 
-    if(use_condition)
+    if (use_condition)
 	msg.condition = CMCondition_get(fp_read_data->cm, NULL);
     else
 	msg.condition = -1;
     // maybe check to see if the bridge is create first.
     EVsubmit(fp->bridges[destination].flush_source, &msg, NULL);
-    if(use_condition){
+    if (use_condition) {
 	CMCondition_wait(fp_read_data->cm, msg.condition);
     }
 }
 
-void 
+void
 send_var_message(flexpath_reader_file *fp, int destination, char *varname)
 {
         int i = 0;
         int found = 0;
-        for(i=0; i<fp->num_sendees; i++) {
-            if(fp->sendees[i]==destination) {
+        for (i=0; i<fp->num_sendees; i++) {
+            if (fp->sendees[i]==destination) {
                 found=1;
                 break;
             }
         }
-        if(!found) {
+        if (!found) {
             fp->num_sendees+=1;
             fp->sendees=realloc(fp->sendees, fp->num_sendees*sizeof(int));
             fp->sendees[fp->num_sendees-1] = destination;
         }
-        if(!fp->bridges[destination].created) {
+        if (!fp->bridges[destination].created) {
             build_bridge(&(fp->bridges[destination]));
 	}
-	if(!fp->bridges[destination].opened){
+	if (!fp->bridges[destination].opened) {
 	    fp->bridges[destination].opened = 1;
 	    send_open_msg(fp, destination);
 	}
 	Var_msg var;
 	var.process_id = fp->rank;
 	var.var_name = varname;
-	EVsubmit(fp->bridges[destination].var_source, &var, NULL);    
+	EVsubmit(fp->bridges[destination].var_source, &var, NULL);
 }
 
 /********** EVPath Handlers **********/
@@ -704,7 +726,7 @@ update_step_msg_handler(
 {
     update_step_msg *msg = (update_step_msg*)vevent;
     ADIOS_FILE *adiosfile = (ADIOS_FILE*)client_data;
-    flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;    
+    flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;
 
     fp->last_writer_step = msg->step;
     fp->writer_finalized = msg->finalized;
@@ -713,21 +735,21 @@ update_step_msg_handler(
     return 0;
 }
 
-static int 
+static int
 op_msg_handler(CManager cm, void *vevent, void *client_data, attr_list attrs) {
-    op_msg* msg = (op_msg*)vevent;    
+    op_msg* msg = (op_msg*)vevent;
     ADIOS_FILE *adiosfile = (ADIOS_FILE*)client_data;
     flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;
-    if(msg->type==ACK_MSG) {
-	if(msg->condition != -1){
+    if (msg->type==ACK_MSG) {
+	if (msg->condition != -1) {
 	    CMCondition_signal(fp_read_data->cm, msg->condition);
 	}
         //ackCondition = CMCondition_get(fp_read_data->cm, NULL);
     }
-    if(msg->type == EOS_MSG){	
+    if (msg->type == EOS_MSG) {
 	adios_errno = err_end_of_stream;
 	CMCondition_signal(fp_read_data->cm, msg->condition);
-    }       
+    }
     return 0;
 }
 
@@ -743,7 +765,7 @@ group_msg_handler(CManager cm, void *vevent, void *client_data, attr_list attrs)
     }
     fp->gp = msg;
     int i;
-    for(i = 0; i<msg->num_vars; i++){
+    for (i = 0; i<msg->num_vars; i++) {
 	global_var *gblvar = &msg->vars[i];
 	flexpath_var *fpvar = find_fp_var(fp->var_list, gblvar->name);
 	if (fpvar) {
@@ -755,19 +777,18 @@ group_msg_handler(CManager cm, void *vevent, void *client_data, attr_list attrs)
 	    fpvar->ndims = offset->offsets_per_rank;
 	    fpvar->global_dims = malloc(sizeof(uint64_t)*fpvar->ndims);
 	    memcpy(fpvar->global_dims, global_dimensions, sizeof(uint64_t)*fpvar->ndims);
-	}else{
-	    adios_error(err_corrupted_variable, 
+	} else {
+	    adios_error(err_corrupted_variable,
 			"Mismatch between global variables and variables specified %s.",
 			gblvar->name);
 	    return err_corrupted_variable;
 	}
     }
-    CMCondition_signal(fp_read_data->cm, msg->condition);    
+    CMCondition_signal(fp_read_data->cm, msg->condition);
     return 0;
 }
 
 
-
 int
 increment_index(int64_t ndim, uint64_t *dimen_array, uint64_t *index_array)
 {
@@ -802,19 +823,6 @@ map_global_to_local_index(uint64_t ndim, uint64_t *global_index, uint64_t *local
 }
 
 int
-index_in_selection(uint64_t ndim, uint64_t *global_index, uint64_t *selection_offsets, uint64_t *selection_counts)
-{
-    int i;
-    for (i=0; i < ndim; i++) {
-	if ((global_index[i] < selection_offsets[i]) || 
-	    (global_index[i] >= selection_offsets[i] + selection_counts[i])) {
-	    return 0;
-	}
-    }
-    return 1;
-}
-
-int 
 find_offset(uint64_t ndim, uint64_t *size, uint64_t *index)
 {
     int offset = 0;
@@ -827,67 +835,107 @@ find_offset(uint64_t ndim, uint64_t *size, uint64_t *index)
 
 /*
  *  element_size is the byte size of the array elements
- *  ndim is the number of dimensions in the variable
- *  global_dimens is an array, ndim long, giving the size of each dimension
- *  partial_offsets is an array, ndim long, giving the starting offsets per dimension
+ *  dims is the number of dimensions in the variable
+ *  global_dimens is an array, dims long, giving the size of each dimension
+ *  partial_offsets is an array, dims long, giving the starting offsets per dimension
  *      of this data block in the global array
- *  partial_counts is an array, ndim long, giving the size per dimension
+ *  partial_counts is an array, dims long, giving the size per dimension
  *      of this data block in the global array
- *  selection_offsets is an array, ndim long, giving the starting offsets in the global array 
+ *  selection_offsets is an array, dims long, giving the starting offsets in the global array
  *      of the output selection.
- *  selection_counts is an array, ndim long, giving the size per dimension
+ *  selection_counts is an array, dims long, giving the size per dimension
  *      of the output selection.
  *  data is the input, a slab of the global array
  *  selection is the output, to be filled with the selection array.
  */
 void
-extract_selection_from_partial(int element_size, int ndim, uint64_t *global_dimens, 
+extract_selection_from_partial(int element_size, uint64_t dims, uint64_t *global_dimens,
 			       uint64_t *partial_offsets, uint64_t *partial_counts,
 			       uint64_t *selection_offsets, uint64_t *selection_counts,
 			       char *data, char *selection)
 {
-    uint64_t *partial_index = malloc(ndim * sizeof(partial_index[0]));
-    uint64_t *global_index = malloc(ndim * sizeof(global_index[0]));
-    uint64_t *selection_index = malloc(ndim * sizeof(selection_index[0]));
-    memset(partial_index, 0, ndim * sizeof(partial_index[0]));
-    memset(selection_index, 0, ndim * sizeof(selection_index[0]));
-    do {
-	/* walk through incoming (partial) element by element, keeping partial_index up to date */
-	map_local_to_global_index(ndim, partial_index, partial_offsets, global_index);
-	/* find the global index for the incoming one */
-	if (index_in_selection(ndim, global_index, selection_offsets, selection_counts)) {
-	    int offset;
-	    /* if it's in the selection, map it to the local index of the selection */
-	    map_global_to_local_index(ndim, global_index, selection_offsets, selection_index);
-	    /* find location in selection*/
-	    offset = find_offset(ndim, selection_counts, selection_index);
-	    memcpy(selection + offset * element_size, data, element_size);
+    int block_size;
+    int source_block_stride;
+    int dest_block_stride;
+    int source_block_start_offset;
+    int dest_block_start_offset;
+    int block_count;
+    int dim;
+    int operant_dims;
+    int operant_element_size;
+
+    block_size = 1;
+    operant_dims = dims;
+    operant_element_size = element_size;
+    for (dim = dims-1; dim >= 0; dim--) {
+	if ((global_dimens[dim] == partial_counts[dim]) &&
+	    (selection_counts[dim] == partial_counts[dim])) {
+	    block_size *= global_dimens[dim];
+	    operant_dims--;   /* last dimension doesn't matter, we got all and we want all */
+	    operant_element_size *= global_dimens[dim];
+	} else {
+	    int left = MAX(partial_offsets[dim], selection_offsets[dim]);
+	    int right = MIN(partial_offsets[dim] + partial_counts[dim],
+			    selection_offsets[dim] + selection_counts[dim]);
+	    block_size *= (right - left);
+	    break;
 	}
-	data += element_size;
-    } while (increment_index(ndim, partial_counts, partial_index));
-    free(partial_index);
-    free(global_index);
+    }
+    source_block_stride = partial_counts[operant_dims-1] * operant_element_size;
+    dest_block_stride = selection_counts[operant_dims-1] * operant_element_size;
+
+    /* calculate first selected element and count */
+    block_count = 1;
+    uint64_t *first_index = malloc(dims * sizeof(first_index[0]));
+    for (dim = 0; dim < dims; dim++) {
+	int left = MAX(partial_offsets[dim], selection_offsets[dim]);
+	int right = MIN(partial_offsets[dim] + partial_counts[dim],
+			selection_offsets[dim] + selection_counts[dim]);
+	if (dim < operant_dims-1) {
+	    block_count *= (right-left);
+	}
+	first_index[dim] = left;
+    }
+    uint64_t *selection_index = malloc(dims * sizeof(selection_index[0]));
+    map_global_to_local_index(dims, first_index, selection_offsets, selection_index);
+    dest_block_start_offset = find_offset(dims, selection_counts, selection_index);
     free(selection_index);
+    dest_block_start_offset *= element_size;
+
+    uint64_t *partial_index = malloc(dims * sizeof(selection_index[0]));
+    map_global_to_local_index(dims, first_index, partial_offsets, partial_index);
+    source_block_start_offset = find_offset(dims, partial_counts, partial_index);
+    free(partial_index);
+    source_block_start_offset *= element_size;
+
+    data += source_block_start_offset;
+    selection += dest_block_start_offset;
+    int i;
+    for (i=0 ; i < block_count; i++) {
+	memcpy(selection, data, block_size * element_size);
+	data += source_block_stride;
+	selection += dest_block_stride;
+    }
 }
 
-static int
+    static int
 raw_handler(CManager cm, void *vevent, int len, void *client_data, attr_list attrs)
 {
     ADIOS_FILE *adiosfile = client_data;
     flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;
-    int writer_rank;          
+    int writer_rank;
     int flush_id;
     double data_start;
     get_double_attr(attrs, attr_atom_from_string("fp_starttime"), &data_start);
-    get_int_attr(attrs, attr_atom_from_string(FP_RANK_ATTR_NAME), &writer_rank); 
+    get_int_attr(attrs, attr_atom_from_string(FP_RANK_ATTR_NAME), &writer_rank);
     get_int_attr(attrs, attr_atom_from_string("fp_flush_id"), &flush_id);
 
     FMContext context = CMget_FMcontext(cm);
     void *base_data = FMheader_skip(context, vevent);
-    FMFormat format = FMformat_from_ID(context, vevent);  
-    
+    FMFormat format = FMformat_from_ID(context, vevent);
+
     // copy //FMfree_struct_desc_list call
-    FMStructDescList struct_list = 
+    FMStructDescList struct_list =
 	FMcopy_struct_list(format_list_of_FMFormat(format));
     FMField *f = struct_list[0].field_list;
 
@@ -897,14 +945,14 @@ raw_handler(CManager cm, void *vevent, int len, void *client_data, attr_list att
 #endif
     /* setting up initial vars from the format list that comes along with the
        message. Message contains both an FFS description and the data. */
-    if(fp->num_vars == 0){
+    if (fp->num_vars == 0) {
 	int var_count = 0;
 	fp->var_list = setup_flexpath_vars(f, &var_count);
-		
+
 	adiosfile->var_namelist = malloc(var_count * sizeof(char *));
 	int i = 0;
-	while(f->field_name != NULL) {
-	    if (strncmp(f->field_name, "FPDIM", 5)) {	    
+	while (f->field_name != NULL) {
+	    if (strncmp(f->field_name, "FPDIM", 5)) {
 		adiosfile->var_namelist[i++] = strdup(f->field_name);
 	    }
 	    f++;
@@ -916,11 +964,11 @@ raw_handler(CManager cm, void *vevent, int len, void *client_data, attr_list att
     f = struct_list[0].field_list;
     char *curr_offset = NULL;
 
-    while(f->field_name){
+    while (f->field_name) {
         char atom_name[200] = "";
-    	flexpath_var *var = find_fp_var(fp->var_list, f->field_name);	
+    	flexpath_var *var = find_fp_var(fp->var_list, f->field_name);
 
-    	if(!var){
+    	if (!var) {
     	    adios_error(err_file_open_error,
     			"file not opened correctly.  var does not match format.\n");
     	    return err_file_open_error;
@@ -932,21 +980,21 @@ raw_handler(CManager cm, void *vevent, int len, void *client_data, attr_list att
 	flexpath_var_chunk *curr_chunk = &var->chunks[0];
 
 	// has the var been scheduled?
-	if(var->sel){
-	    if(var->sel->type == ADIOS_SELECTION_WRITEBLOCK){
-		if(num_dims == 0){ // writeblock selection for scalar
-		    if(var->sel->u.block.index == writer_rank){
-			void *tmp_data = get_FMfieldAddr_by_name(f, 
-								 f->field_name, 
+	if (var->sel) {
+	    if (var->sel->type == ADIOS_SELECTION_WRITEBLOCK) {
+		if (num_dims == 0) { // writeblock selection for scalar
+		    if (var->sel->u.block.index == writer_rank) {
+			void *tmp_data = get_FMfieldAddr_by_name(f,
+								 f->field_name,
 								 base_data);
 			memcpy(var->chunks[0].user_buf, tmp_data, f->field_size);
 		    }
 		}
 		else { // writeblock selection for arrays
-		    if(var->sel->u.block.index == writer_rank){
+		    if (var->sel->u.block.index == writer_rank) {
 			var->array_size = var->type_size;
 			int i;
-			for(i=0; i<num_dims; i++){
+			for (i=0; i<num_dims; i++) {
 			    char *dim;
 			    atom_name[0] ='\0';
 			    strcat(atom_name, FP_DIM_ATTR_NAME);
@@ -957,13 +1005,13 @@ raw_handler(CManager cm, void *vevent, int len, void *client_data, attr_list att
 			    sprintf(dim_num, "%d", i+1);
 			    strcat(atom_name, dim_num);
 			    get_string_attr(attrs, attr_atom_from_string(atom_name), &dim);
-	
+
 			    FMField *temp_field = find_field_by_name(dim, f);
 			    if (!temp_field) {
 				adios_error(err_corrupted_variable,
 					    "Could not find fieldname: %s\n",
 					    dim);
-			    } else {    			    
+			    } else {
 				int *temp_data = get_FMfieldAddr_by_name
 				    (
 					temp_field,
@@ -974,10 +1022,10 @@ raw_handler(CManager cm, void *vevent, int len, void *client_data, attr_list att
 				uint64_t dim = (uint64_t)(*temp_data);
 				var->array_size = var->array_size * dim;
 			    }
-			}    	       
-			void *arrays_data  = get_FMPtrField_by_name(f, 
-								    f->field_name, 
-								    base_data, 
+			}
+			void *arrays_data  = get_FMPtrField_by_name(f,
+								    f->field_name,
+								    base_data,
 								    1);
 			memcpy(var->chunks[0].user_buf, arrays_data, var->array_size);
 		    }
@@ -1006,9 +1054,9 @@ raw_handler(CManager cm, void *vevent, int len, void *client_data, attr_list att
 			int offsets_per_rank = gv->offsets[0].offsets_per_rank;
 			uint64_t *writer_sizes = &temp[offsets_per_rank * writer_rank];
 			uint64_t *writer_offsets = &temp2[offsets_per_rank * writer_rank];
-	
-			char *writer_array = (char*)get_FMPtrField_by_name(f, 
-									   f->field_name, 
+
+			char *writer_array = (char*)get_FMPtrField_by_name(f,
+									   f->field_name,
 									   base_data, 1);
 			char *reader_array = (char*)var->chunks[0].user_buf;
 
@@ -1020,29 +1068,29 @@ raw_handler(CManager cm, void *vevent, int len, void *client_data, attr_list att
 		}
 	    }
 	}
-	else { //var has not been scheduled; 
-	    if(num_dims == 0){ // only worry about scalars		
+	else { //var has not been scheduled;
+	    if (num_dims == 0) { // only worry about scalars
 		flexpath_var_chunk *chunk = &var->chunks[0];
-		if(!chunk->has_data){
+		if (!chunk->has_data) {
 		    void *tmp_data = get_FMfieldAddr_by_name(f, f->field_name, base_data);
 		    chunk->data = malloc(f->field_size);
-		    memcpy(chunk->data, tmp_data, f->field_size);	
+		    memcpy(chunk->data, tmp_data, f->field_size);
 		    chunk->has_data = 1;
 		}
 	    }
 	}
         f++;
     }
- 
-    
+
+
     fp->req.num_completed++;
-    if(fp->req.num_completed == fp->req.num_pending){
+    if (fp->req.num_completed == fp->req.num_pending) {
         CMCondition_signal(fp_read_data->cm, fp->req.condition);
     }
-    
+
 
     free_fmstructdesclist(struct_list);
-    return 0; 
+    return 0;
 }
 
 /********** Core ADIOS Read functions. **********/
@@ -1052,15 +1100,15 @@ raw_handler(CManager cm, void *vevent, int len, void *client_data, attr_list att
  */
 int
 adios_read_flexpath_init_method (MPI_Comm comm, PairStruct* params)
-{    
+{
     setenv("CMSelfFormats", "1", 1);
-    fp_read_data = malloc(sizeof(flexpath_read_data));     
-    if(!fp_read_data) {
+    fp_read_data = malloc(sizeof(flexpath_read_data));
+    if (!fp_read_data) {
         adios_error(err_no_memory, "Cannot allocate memory for flexpath.");
         return -1;
     }
     memset(fp_read_data, 0, sizeof(flexpath_read_data));
-    
+
     fp_read_data->CM_TRANSPORT = attr_atom_from_string("CM_TRANSPORT");
     attr_list listen_list = NULL;
     char * transport = NULL;
@@ -1072,19 +1120,19 @@ adios_read_flexpath_init_method (MPI_Comm comm, PairStruct* params)
     MPI_Comm_rank(fp_read_data->comm, &(fp_read_data->rank));
 
     fp_read_data->cm = CManager_create();
-    if(transport == NULL){
-	if(CMlisten(fp_read_data->cm) == 0) {
+    if (transport == NULL) {
+	if (CMlisten(fp_read_data->cm) == 0) {
 	    fprintf(stderr, "Flexpath ERROR: reader %d unable to initialize connection manager.\n",
 		fp_read_data->rank);
 	}
-    }else{
+    } else {
 	listen_list = create_attr_list();
-	add_attr(listen_list, fp_read_data->CM_TRANSPORT, Attr_String, 
+	add_attr(listen_list, fp_read_data->CM_TRANSPORT, Attr_String,
 		 (attr_value)strdup(transport));
 	CMlisten_specific(fp_read_data->cm, listen_list);
     }
     int forked = CMfork_comm_thread(fp_read_data->cm);
-    if(!forked) {
+    if (!forked) {
 	fprintf(stderr, "reader %d failed to fork comm_thread.\n", fp_read_data->rank);
 	/*log_debug( "forked\n");*/
     }
@@ -1101,7 +1149,7 @@ adios_read_flexpath_open_file(const char * fname, MPI_Comm comm)
 }
 
 /*
- * Still have work to do here.  
+ * Still have work to do here.
  * Change it so that we can support the timeouts and lock_modes.
  */
 /*
@@ -1119,17 +1167,17 @@ adios_read_flexpath_open(const char * fname,
 			 float timeout_sec)
 {
     fp_log("FUNC", "entering flexpath_open\n");
-    ADIOS_FILE *adiosfile = malloc(sizeof(ADIOS_FILE));        
-    if(!adiosfile){
-	adios_error (err_no_memory, 
+    ADIOS_FILE *adiosfile = malloc(sizeof(ADIOS_FILE));
+    if (!adiosfile) {
+	adios_error (err_no_memory,
 		     "Cannot allocate memory for file info.\n");
 	return NULL;
-    }    
-    
+    }
+
     flexpath_reader_file *fp = new_flexpath_reader_file(fname);
     fp->host_language = futils_is_called_from_fortran();
     adios_errno = 0;
-    fp->stone = EValloc_stone(fp_read_data->cm);	
+    fp->stone = EValloc_stone(fp_read_data->cm);
     fp->comm = comm;
 
     MPI_Comm_size(fp->comm, &(fp->size));
@@ -1139,13 +1187,13 @@ adios_read_flexpath_open(const char * fname,
 			    fp->stone,
 			    op_format_list,
 			    op_msg_handler,
-			    adiosfile);       
+			    adiosfile);
 
     EVassoc_terminal_action(fp_read_data->cm,
 			    fp->stone,
 			    update_step_msg_format_list,
 			    update_step_msg_handler,
-			    adiosfile);       
+			    adiosfile);
 
 
     EVassoc_terminal_action(fp_read_data->cm,
@@ -1166,12 +1214,12 @@ adios_read_flexpath_open(const char * fname,
     char writer_info_filename[200];
     char reader_ready_filename[200];
     char reader_info_filename[200];
-	
+
     sprintf(reader_ready_filename, "%s_%s", fname, READER_READY_FILE);
     sprintf(reader_info_filename, "%s_%s", fname, READER_CONTACT_FILE);
     sprintf(writer_ready_filename, "%s_%s", fname, WRITER_READY_FILE);
     sprintf(writer_info_filename, "%s_%s", fname, WRITER_CONTACT_FILE);
-	
+
     char *string_list;
     char data_contact_info[CONTACT_LENGTH];
     string_list = attr_list_to_string(CMget_contact_list(fp_read_data->cm));
@@ -1179,28 +1227,28 @@ adios_read_flexpath_open(const char * fname,
     free(string_list);
 
     char * recvbuf;
-    if(fp->rank == 0){	
+    if (fp->rank == 0) {
 	recvbuf = (char*)malloc(sizeof(char)*CONTACT_LENGTH*(fp->size));
     }
 
     MPI_Gather(data_contact_info, CONTACT_LENGTH, MPI_CHAR, recvbuf,
 	       CONTACT_LENGTH, MPI_CHAR, 0, fp->comm);
 
-    if(fp->rank == 0){	
+    if (fp->rank == 0) {
 	// print our own contact information
 	FILE * fp_out = fopen(reader_info_filename, "w");
 	int i;
-	if(!fp_out){	    
+	if (!fp_out) {
 	    adios_error(err_file_open_error,
 			"File for contact info could not be opened for writing.\n");
 	    exit(1);
 	}
-	for(i=0; i<fp->size; i++) {
+	for (i=0; i<fp->size; i++) {
 	    fprintf(fp_out,"%s\n", &recvbuf[i*CONTACT_LENGTH]);
 	}
 	fclose(fp_out);
 	free(recvbuf);
-	
+
 	FILE * read_ready = fopen(reader_ready_filename, "w");
 	fprintf(read_ready, "ready");
 	fclose(read_ready);
@@ -1208,14 +1256,14 @@ adios_read_flexpath_open(const char * fname,
     MPI_Barrier(fp->comm);
 
     FILE * fp_in = fopen(writer_ready_filename,"r");
-    while(!fp_in) {
+    while (!fp_in) {
 	//CMsleep(fp_read_data->cm, 1);
 	fp_in = fopen(writer_ready_filename, "r");
     }
     fclose(fp_in);
 
     fp_in = fopen(writer_info_filename, "r");
-    while(!fp_in){
+    while (!fp_in) {
 	//CMsleep(fp_read_data->cm, 1);
 	fp_in = fopen(writer_info_filename, "r");
     }
@@ -1226,7 +1274,7 @@ adios_read_flexpath_open(const char * fname,
     int their_stone;
 
     // change to read all numbers, dont create stones, turn bridge array into linked list
-    while(fscanf(fp_in, "%d:%s", &their_stone, in_contact) != EOF){	
+    while (fscanf(fp_in, "%d:%s", &their_stone, in_contact) != EOF) {
 	//fprintf(stderr, "writer contact: %d:%s\n", their_stone, in_contact);
 	fp->bridges = realloc(fp->bridges,
 					  sizeof(bridge_info) * (num_bridges+1));
@@ -1242,27 +1290,27 @@ adios_read_flexpath_open(const char * fname,
     fp->num_bridges = num_bridges;
     // clean up of writer's files
     MPI_Barrier(fp->comm);
-    if(fp->rank == 0){
+    if (fp->rank == 0) {
 	unlink(writer_info_filename);
 	unlink(writer_ready_filename);
-    }	    
+    }
 
     adiosfile->fh = (uint64_t)fp;
     adiosfile->current_step = 0;
-    
+
     /* Init with a writer to get initial scalar
        data so we can handle inq_var calls and
        also populate the ADIOS_FILE struct. */
-    if(fp->size < num_bridges){
+    if (fp->size < num_bridges) {
     	int mystart = (num_bridges/fp->size) * fp->rank;
     	int myend = (num_bridges/fp->size) * (fp->rank+1);
     	fp->writer_coordinator = mystart;
     	int z;
-    	for(z=mystart; z<myend; z++){
+    	for (z=mystart; z<myend; z++) {
     	    build_bridge(&fp->bridges[z]);
     	}
     }
-    else{
+    else {
 	int writer_rank = fp->rank % num_bridges;
 	build_bridge(&fp->bridges[writer_rank]);
 	fp->writer_coordinator = writer_rank;
@@ -1270,7 +1318,7 @@ adios_read_flexpath_open(const char * fname,
 
     // requesting initial data.
     send_open_msg(fp, fp->writer_coordinator);
-    
+
 
     fp->data_read = 0;
     fp->req.condition = CMCondition_get(fp_read_data->cm, NULL);
@@ -1290,14 +1338,14 @@ adios_read_flexpath_open(const char * fname,
     // first step is at least one, otherwise raw_handler will not execute.
     // in reality, writer might be further along, so we might have to make
     // the writer explitly send across messages each time it calls close, to
-    // indicate which timesteps are available. 
+    // indicate which timesteps are available.
     adiosfile->last_step = 1;
     adiosfile->path = strdup(fname);
     // verifies these two fields. It's not BP, so no BP version.
     // It's a stream, so how can the file size be known?
     adiosfile->version = -1;
     adiosfile->file_size = 0;
-    adios_errno = err_no_error;        
+    adios_errno = err_no_error;
     fp_log("FUNC", "leaving flexpath_open\n");
     return adiosfile;
 }
@@ -1311,8 +1359,8 @@ void adios_read_flexpath_release_step(ADIOS_FILE *adiosfile) {
     int i;
     flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;
     MPI_Barrier(fp->comm);
-    for(i=0; i<fp->num_bridges; i++) {
-        if(fp->bridges[i].created && !fp->bridges[i].opened) {
+    for (i=0; i<fp->num_bridges; i++) {
+        if (fp->bridges[i].created && !fp->bridges[i].opened) {
 	    send_open_msg(fp, i);
         }
     }
@@ -1320,10 +1368,10 @@ void adios_read_flexpath_release_step(ADIOS_FILE *adiosfile) {
     fp->gp = NULL;
 
     flexpath_var *tmpvars = fp->var_list;
-    while(tmpvars){
+    while (tmpvars) {
 
-	if(tmpvars->ndims > 0){
-	    free(tmpvars->global_dims);	   
+	if (tmpvars->ndims > 0) {
+	    free(tmpvars->global_dims);
 	    tmpvars->ndims = 0;
 	}
 	if (tmpvars->displ) {
@@ -1336,13 +1384,13 @@ void adios_read_flexpath_release_step(ADIOS_FILE *adiosfile) {
 	    tmpvars->sel = NULL;
 	}
 
-	tmpvars->sel = NULL;	
-	for(i=0; i<tmpvars->num_chunks; i++){	   
-	    flexpath_var_chunk *chunk = &tmpvars->chunks[i];	    	    
-	    if(chunk->has_data){
+	tmpvars->sel = NULL;
+	for (i=0; i<tmpvars->num_chunks; i++) {
+	    flexpath_var_chunk *chunk = &tmpvars->chunks[i];
+	    if (chunk->has_data) {
 		free(chunk->data);
 		chunk->data = NULL;
-		chunk->has_data = 0;		
+		chunk->has_data = 0;
 	    }
 	    chunk->rank = 0;
 	}
@@ -1350,16 +1398,16 @@ void adios_read_flexpath_release_step(ADIOS_FILE *adiosfile) {
     }
 }
 
-int 
-adios_read_flexpath_advance_step(ADIOS_FILE *adiosfile, int last, float timeout_sec) 
+int
+adios_read_flexpath_advance_step(ADIOS_FILE *adiosfile, int last, float timeout_sec)
 {
     flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;
     MPI_Barrier(fp->comm);
     int count = 0; // for perf measurements
     send_flush_msg(fp, fp->writer_coordinator, STEP, 1);
     //put this on a timer, so to speak, for timeout_sec
-    while(fp->mystep == fp->last_writer_step){
-	if(fp->writer_finalized){
+    while (fp->mystep == fp->last_writer_step) {
+	if (fp->writer_finalized) {
 	    adios_errno = err_end_of_stream;
 	    return err_end_of_stream;
 	}
@@ -1367,9 +1415,9 @@ adios_read_flexpath_advance_step(ADIOS_FILE *adiosfile, int last, float timeout_
 	send_flush_msg(fp, fp->writer_coordinator, STEP, 1);
     }
 
-    int i=0;    
-    for(i=0; i<fp->num_bridges; i++) {
-        if(fp->bridges[i].created && fp->bridges[i].opened) {
+    int i=0;
+    for (i=0; i<fp->num_bridges; i++) {
+        if (fp->bridges[i].created && fp->bridges[i].opened) {
 	    count++;
 	    send_close_msg(fp, i);
 	}
@@ -1379,13 +1427,13 @@ adios_read_flexpath_advance_step(ADIOS_FILE *adiosfile, int last, float timeout_
     count = 0;
     adiosfile->current_step++;
     fp->mystep = adiosfile->current_step;
-   
-    for(i=0; i<fp->num_bridges; i++){
-	if(fp->bridges[i].created && !fp->bridges[i].opened){	    
+
+    for (i=0; i<fp->num_bridges; i++) {
+	if (fp->bridges[i].created && !fp->bridges[i].opened) {
 	    send_open_msg(fp, i);
 	    count++;
         }
-    }   
+    }
     // need to remove selectors from each var now.
     fp->req.num_completed = 0;
     fp->req.num_pending = 1;
@@ -1403,29 +1451,29 @@ int adios_read_flexpath_close(ADIOS_FILE * fp)
     flexpath_reader_file *file = (flexpath_reader_file*)fp->fh;
     //send to each opened link
     int i;
-    for(i = 0; i<file->num_bridges; i++){
-        if(file->bridges[i].created && file->bridges[i].opened) {
+    for (i = 0; i<file->num_bridges; i++) {
+        if (file->bridges[i].created && file->bridges[i].opened) {
 	    send_close_msg(file, i);
         }
     }
     /*
     start to cleanup.  Clean up var_lists for now, as the
     data has already been copied over to ADIOS_VARINFO structs
-    that the user maintains a copy of. 
+    that the user maintains a copy of.
     */
     flexpath_var *v = file->var_list;
-    while (v) {        	
+    while (v) {
     	// free chunks; data has already been copied to user
-    	int i;	
-    	for(i = 0; i<v->num_chunks; i++){    		    
-    	    flexpath_var_chunk *c = &v->chunks[i];	    
-	    if(!c)
+    	int i;
+    	for (i = 0; i<v->num_chunks; i++) {
+    	    flexpath_var_chunk *c = &v->chunks[i];
+	    if (!c)
 		log_error("FLEXPATH: %s This should not happen! line %d\n",__func__,__LINE__);
-	    //free(c->data);	    
+	    //free(c->data);
 	    c->data = NULL;
 	    free(c);
 	}
-	flexpath_var *tmp = v->next;	
+	flexpath_var *tmp = v->next;
 	free(v);
 	v = tmp;
     	//v=v->next;
@@ -1440,11 +1488,11 @@ ADIOS_FILE *adios_read_flexpath_fopen(const char *fname, MPI_Comm comm) {
 int adios_read_flexpath_is_var_timed(const ADIOS_FILE* fp, int varid) { return 0; }
 
 void adios_read_flexpath_get_groupinfo(
-    const ADIOS_FILE *adiosfile, 
-    int *ngroups, 
-    char ***group_namelist, 
-    uint32_t **nvars_per_group, 
-    uint32_t **nattrs_per_group) 
+    const ADIOS_FILE *adiosfile,
+    int *ngroups,
+    char ***group_namelist,
+    uint32_t **nvars_per_group,
+    uint32_t **nattrs_per_group)
 {
     flexpath_reader_file *fp;
     if (adiosfile) {
@@ -1472,7 +1520,7 @@ int adios_read_flexpath_perform_reads(const ADIOS_FILE *adiosfile, int blocking)
     fp->req.num_pending = FP_BATCH_SIZE;
     fp->req.condition = CMCondition_get(fp_read_data->cm, NULL);
 
-    for(i = 0; i<num_sendees; i++){	
+    for (i = 0; i<num_sendees; i++) {
 	int sendee = fp->sendees[i];
         batchcount++;
 	total_sent++;
@@ -1491,21 +1539,21 @@ int adios_read_flexpath_perform_reads(const ADIOS_FILE *adiosfile, int blocking)
     }
 
     free(fp->sendees);
-    fp->sendees = NULL;    
+    fp->sendees = NULL;
     fp->num_sendees = 0;
-    
+
     flexpath_var *tmpvars = fp->var_list;
     while (tmpvars) {
 	if (tmpvars->displ) {
 	    free_displacements(tmpvars->displ, tmpvars->num_displ);
 	    tmpvars->displ = NULL;
 	}
-    
+
 	if (tmpvars->sel) {
 	    common_read_selection_delete(tmpvars->sel);
 	    tmpvars->sel = NULL;
 	}
-    
+
 	tmpvars = tmpvars->next;
     }
     fp_log("FUNC", "leaving perform_reads.\n");
@@ -1525,14 +1573,14 @@ adios_read_flexpath_inq_var_stat(const ADIOS_FILE* fp,
 { /*log_debug( "flexpath:adios function inq var stat\n");*/ return 0; }
 
 
-int 
+int
 adios_read_flexpath_schedule_read_byid(const ADIOS_FILE *adiosfile,
 				       const ADIOS_SELECTION *sel,
 				       int varid,
 				       int from_steps,
 				       int nsteps,
 				       void *data)
-{   
+{
     fp_log("FUNC", "entering schedule_read_byid\n");
     flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;
     flexpath_var *fpvar = fp->var_list;
@@ -1543,23 +1591,23 @@ adios_read_flexpath_schedule_read_byid(const ADIOS_FILE *adiosfile,
         else
 	    fpvar=fpvar->next;
     }
-    if(!fpvar){
+    if (!fpvar) {
         adios_error(err_invalid_varid,
 		    "Invalid variable id: %d\n",
 		    varid);
         return err_invalid_varid;
-    }    
+    }
     //store the user allocated buffer.
-    flexpath_var_chunk *chunk = &fpvar->chunks[0];  
+    flexpath_var_chunk *chunk = &fpvar->chunks[0];
     if (nsteps != 1) {
 	adios_error (err_invalid_timestep,
                      "Only one step can be read from a stream at a time. "
-                     "You requested % steps in adios_schedule_read()\n", 
+                     "You requested % steps in adios_schedule_read()\n",
 		     nsteps);
         return err_invalid_timestep;
     }
     // this is done so that the user can do multiple schedule_read/perform_reads
-    // within before doing release/advance step. Might need a better way to 
+    // within before doing release/advance step. Might need a better way to
     // manage the ADIOS selections.
     if (fpvar->sel) {
 	common_read_selection_delete(fpvar->sel);
@@ -1568,7 +1616,7 @@ adios_read_flexpath_schedule_read_byid(const ADIOS_FILE *adiosfile,
     if (!sel) { // null selection; read whole variable
 	//TODO: This will have to be fixed for local arrays,
 	// but dataspaces doesn't have local arrays so there
-	// are no use cases for it. 
+	// are no use cases for it.
 	uint64_t *starts = calloc(fpvar->ndims, sizeof(uint64_t));
 	uint64_t *counts = calloc(fpvar->ndims, sizeof(uint64_t));
 	memcpy(counts, fpvar->global_dims, fpvar->ndims*sizeof(uint64_t));
@@ -1593,9 +1641,9 @@ adios_read_flexpath_schedule_read_byid(const ADIOS_FILE *adiosfile,
 	break;
     }
     case ADIOS_SELECTION_BOUNDINGBOX:
-    {   
+    {
         // boundingbox for a scalar; handle it as we do with inq_var
-        if (fpvar->ndims == 0) {                        
+        if (fpvar->ndims == 0) {
             memcpy(data, chunk->data, fpvar->type_size);
         } else {
             if (fp->host_language == FP_FORTRAN_MODE) {
@@ -1611,8 +1659,8 @@ adios_read_flexpath_schedule_read_byid(const ADIOS_FILE *adiosfile,
             array_displacements *all_disp = NULL;
             uint64_t pos = 0;
             for (j=0; j<fp->num_bridges; j++) {
-                int destination=0;	    	    
-                if(need_writer(fp, j, fpvar->sel, fp->gp, fpvar->varname)==1){           
+                int destination=0;
+                if (need_writer(fp, j, fpvar->sel, fp->gp, fpvar->varname)==1) {
 		    //printf("\t\trank: %d need_writer: %d\n", fp->rank, j);
                     uint64_t _pos = 0;
                     need_count++;
@@ -1621,12 +1669,12 @@ adios_read_flexpath_schedule_read_byid(const ADIOS_FILE *adiosfile,
                     // displ is freed in release_step.
                     array_displacements *displ = get_writer_displacements(j, fpvar->sel, gvar, &_pos);
                     displ->pos = pos;
-                    _pos *= (uint64_t)fpvar->type_size; 
+                    _pos *= (uint64_t)fpvar->type_size;
                     pos += _pos;
-		
+
                     all_disp = realloc(all_disp, sizeof(array_displacements)*need_count);
                     all_disp[need_count-1] = *displ;
-                    send_var_message(fp, j, fpvar->varname);				
+                    send_var_message(fp, j, fpvar->varname);
                 }
             }
             fpvar->displ = all_disp;
@@ -1651,7 +1699,7 @@ adios_read_flexpath_schedule_read_byid(const ADIOS_FILE *adiosfile,
     return 0;
 }
 
-int 
+int
 adios_read_flexpath_schedule_read(const ADIOS_FILE *adiosfile,
 			const ADIOS_SELECTION * sel,
 			const char * varname,
@@ -1663,14 +1711,14 @@ adios_read_flexpath_schedule_read(const ADIOS_FILE *adiosfile,
     return 0;
 }
 
-int 
+int
 adios_read_flexpath_get_attr (int *gp, const char *attrname,
                                  enum ADIOS_DATATYPES *type,
                                  int *size, void **data)
 {
     //log_debug( "debug: adios_read_flexpath_get_attr\n");
     // TODO: borrowed from dimes
-    adios_error(err_invalid_read_method, 
+    adios_error(err_invalid_read_method,
 		"adios_read_flexpath_get_attr is not implemented.");
     *size = 0;
     *type = adios_unknown;
@@ -1678,14 +1726,14 @@ adios_read_flexpath_get_attr (int *gp, const char *attrname,
     return adios_errno;
 }
 
-int 
+int
 adios_read_flexpath_get_attr_byid (const ADIOS_FILE *adiosfile, int attrid,
 				   enum ADIOS_DATATYPES *type,
 				   int *size, void **data)
 {
 //    log_debug( "debug: adios_read_flexpath_get_attr_byid\n");
     // TODO: borrowed from dimes
-    adios_error(err_invalid_read_method, 
+    adios_error(err_invalid_read_method,
 		"adios_read_flexpath_get_attr_byid is not implemented.");
     *size = 0;
     *type = adios_unknown;
@@ -1693,22 +1741,22 @@ adios_read_flexpath_get_attr_byid (const ADIOS_FILE *adiosfile, int attrid,
     return adios_errno;
 }
 
-ADIOS_VARINFO* 
+ADIOS_VARINFO*
 adios_read_flexpath_inq_var(const ADIOS_FILE * adiosfile, const char* varname)
 {
     fp_log("FUNC", "entering flexpath_inq_var\n");
     flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;
     ADIOS_VARINFO *v = NULL;
-    
+
     flexpath_var *fpvar = find_fp_var(fp->var_list, varname);
     if (fpvar) {
         v = calloc(1, sizeof(ADIOS_VARINFO));
 
         if (!v) {
-            adios_error(err_no_memory, 
+            adios_error(err_no_memory,
                         "Cannot allocate buffer in adios_read_flexpath_inq_var()");
             return NULL;
-        }           
+        }
 
 	v = convert_var_info(fpvar, v, varname, adiosfile);
 	fp_log("FUNC", "leaving flexpath_inq_var\n");
@@ -1719,12 +1767,12 @@ adios_read_flexpath_inq_var(const ADIOS_FILE * adiosfile, const char* varname)
     return v;
 }
 
-ADIOS_VARINFO* 
+ADIOS_VARINFO*
 adios_read_flexpath_inq_var_byid (const ADIOS_FILE * adiosfile, int varid)
 {
     fp_log("FUNC", "entering flexpath_inq_var_byid\n");
     flexpath_reader_file *fp = (flexpath_reader_file*)adiosfile->fh;
-    if(varid >= 0 && varid < adiosfile->nvars) {	
+    if (varid >= 0 && varid < adiosfile->nvars) {
 	ADIOS_VARINFO *v = adios_read_flexpath_inq_var(adiosfile, adiosfile->var_namelist[varid]);
 	fp_log("FUNC", "leaving flexpath_inq_var_byid\n");
 	return v;
@@ -1735,7 +1783,7 @@ adios_read_flexpath_inq_var_byid (const ADIOS_FILE * adiosfile, int varid)
     }
 }
 
-void 
+void
 adios_read_flexpath_free_varinfo (ADIOS_VARINFO *adiosvar)
 {
     //log_debug( "debug: adios_read_flexpath_free_varinfo\n");
@@ -1744,9 +1792,9 @@ adios_read_flexpath_free_varinfo (ADIOS_VARINFO *adiosvar)
 }
 
 
-ADIOS_TRANSINFO* 
+ADIOS_TRANSINFO*
 adios_read_flexpath_inq_var_transinfo(const ADIOS_FILE *gp, const ADIOS_VARINFO *vi)
-{    
+{
     //adios_error(err_operation_not_supported, "Flexpath does not yet support transforms: var_transinfo.\n");
     ADIOS_TRANSINFO *trans = malloc(sizeof(ADIOS_TRANSINFO));
     memset(trans, 0, sizeof(ADIOS_TRANSINFO));
@@ -1755,7 +1803,7 @@ adios_read_flexpath_inq_var_transinfo(const ADIOS_FILE *gp, const ADIOS_VARINFO
 }
 
 
-int 
+int
 adios_read_flexpath_inq_var_trans_blockinfo(const ADIOS_FILE *gp, const ADIOS_VARINFO *vi, ADIOS_TRANSINFO *ti)
 {
     adios_error(err_operation_not_supported, "Flexpath does not yet support transforms: trans_blockinfo.\n");
@@ -1768,7 +1816,7 @@ int  adios_read_flexpath_get_dimension_order (const ADIOS_FILE *adiosfile)
     return (fp->host_language == FP_FORTRAN_MODE);
 }
 
-void 
+void
 adios_read_flexpath_reset_dimension_order (const ADIOS_FILE *adiosfile, int is_fortran)
 {
     //log_debug( "debug: adios_read_flexpath_reset_dimension_order\n");
diff --git a/src/read/read_icee.c b/src/read/read_icee.c
index 1e5fb72..413948a 100644
--- a/src/read/read_icee.c
+++ b/src/read/read_icee.c
@@ -1404,7 +1404,8 @@ adios_read_icee_inq_var_byid (const ADIOS_FILE * adiosfile, int varid)
         a->varid = vp->varid;
         a->type = vp->type;
         a->ndim = vp->ndims;
-
+        a->nsteps = 1;
+        
         if (vp->ndims == 0)
         {
             a->value = malloc(vp->typesize);
diff --git a/src/transforms/adios_transform_alacrity_write.c b/src/transforms/adios_transform_alacrity_write.c
index 360474b..dd2e0c5 100644
--- a/src/transforms/adios_transform_alacrity_write.c
+++ b/src/transforms/adios_transform_alacrity_write.c
@@ -246,7 +246,7 @@ int adios_transform_alacrity_apply(struct adios_file_struct *fd,
 
         // Write directly to the shared buffer
         output_buff = fd->buffer + fd->offset;
-    } else { // Else, fall back to var->data memory allocation
+    } else { // Else, fall back to var->adata memory allocation
         output_buff = malloc(output_size);
         assert(output_buff);
     }
@@ -285,7 +285,7 @@ int adios_transform_alacrity_apply(struct adios_file_struct *fd,
     if (*wrote_to_shared_buffer) {
         shared_buffer_mark_written(fd, output_size);
     } else {
-        var->data = output_buff;
+        var->adata = output_buff;
         var->data_size = output_size;
         var->free_data = adios_flag_yes;
     }
diff --git a/src/transforms/adios_transform_aplod_write.c b/src/transforms/adios_transform_aplod_write.c
index 8690b02..68904f8 100644
--- a/src/transforms/adios_transform_aplod_write.c
+++ b/src/transforms/adios_transform_aplod_write.c
@@ -144,7 +144,7 @@ int adios_transform_aplod_apply(struct adios_file_struct *fd,
 
         // Write directly to the shared buffer
         output_buff = fd->buffer + fd->offset;
-    } else { // Else, fall back to var->data memory allocation
+    } else { // Else, fall back to var->adata memory allocation
         output_buff = malloc(output_size);
         assert(output_buff);
     }
@@ -170,7 +170,7 @@ int adios_transform_aplod_apply(struct adios_file_struct *fd,
     if (*wrote_to_shared_buffer) {
         shared_buffer_mark_written(fd, output_size);
     } else {
-        var->data = output_buff;
+        var->adata = output_buff;
         var->data_size = output_size;
         var->free_data = adios_flag_yes;
     }
diff --git a/src/transforms/adios_transform_bzip2_write.c b/src/transforms/adios_transform_bzip2_write.c
index 6c8729a..e3f071c 100755
--- a/src/transforms/adios_transform_bzip2_write.c
+++ b/src/transforms/adios_transform_bzip2_write.c
@@ -101,7 +101,7 @@ int adios_transform_bzip2_apply(struct adios_file_struct *fd,
         // Write directly to the shared buffer
         output_buff = fd->buffer + fd->offset;
     }
-    else    // Else, fall back to var->data memory allocation
+    else    // Else, fall back to var->adata memory allocation
     {
         *wrote_to_shared_buffer = 0;
         output_buff = malloc(output_size);
@@ -133,7 +133,7 @@ int adios_transform_bzip2_apply(struct adios_file_struct *fd,
     }
     else
     {
-        var->data = output_buff;
+        var->adata = output_buff;
         var->data_size = actual_output_size;
         var->free_data = adios_flag_yes;
     }
diff --git a/src/transforms/adios_transform_isobar_write.c b/src/transforms/adios_transform_isobar_write.c
index 7b6081d..869e977 100755
--- a/src/transforms/adios_transform_isobar_write.c
+++ b/src/transforms/adios_transform_isobar_write.c
@@ -135,7 +135,7 @@ int adios_transform_isobar_apply(struct adios_file_struct *fd,
         // Write directly to the shared buffer
         output_buff = fd->buffer + fd->offset;
     }
-    else    // Else, fall back to var->data memory allocation
+    else    // Else, fall back to var->adata memory allocation
     {
         *wrote_to_shared_buffer = 0;
         output_buff = malloc(output_size);
@@ -168,7 +168,7 @@ int adios_transform_isobar_apply(struct adios_file_struct *fd,
     }
     else
     {
-        var->data = output_buff;
+        var->adata = output_buff;
         var->data_size = actual_output_size;
         var->free_data = adios_flag_yes;
     }
diff --git a/src/transforms/adios_transform_szip_write.c b/src/transforms/adios_transform_szip_write.c
index f82855e..6fed29d 100755
--- a/src/transforms/adios_transform_szip_write.c
+++ b/src/transforms/adios_transform_szip_write.c
@@ -76,7 +76,7 @@ int adios_transform_szip_apply(struct adios_file_struct *fd,
 
         // Write directly to the shared buffer
         output_buff = fd->buffer + fd->offset;
-    } else { // Else, fall back to var->data memory allocation
+    } else { // Else, fall back to var->adata memory allocation
         output_buff = malloc(output_size);
         assert(output_buff);
     }
@@ -102,7 +102,7 @@ int adios_transform_szip_apply(struct adios_file_struct *fd,
     if (*wrote_to_shared_buffer) {
         shared_buffer_mark_written(fd, output_size);
     } else {
-        var->data = output_buff;
+        var->adata = output_buff;
         var->data_size = output_size;
         var->free_data = adios_flag_yes;
     }
diff --git a/src/transforms/adios_transform_template_write.c b/src/transforms/adios_transform_template_write.c
index 8740ff2..7438c4e 100644
--- a/src/transforms/adios_transform_template_write.c
+++ b/src/transforms/adios_transform_template_write.c
@@ -43,7 +43,7 @@ int adios_transform_template_apply(struct adios_file_struct *fd,
 
         // Write directly to the shared buffer
         output_buff = fd->buffer + fd->offset;
-    } else { // Else, fall back to var->data memory allocation
+    } else { // Else, fall back to var->adata memory allocation
         output_buff = malloc(output_size);
         assert(output_buff);
     }
@@ -55,7 +55,7 @@ int adios_transform_template_apply(struct adios_file_struct *fd,
     if (*wrote_to_shared_buffer) {
         shared_buffer_mark_written(fd, output_size);
     } else {
-        var->data = output_buff;
+        var->adata = output_buff;
         var->data_size = output_size;
         var->free_data = adios_flag_yes;
     }
diff --git a/src/transforms/adios_transform_zlib_write.c b/src/transforms/adios_transform_zlib_write.c
index ab20798..56a510b 100755
--- a/src/transforms/adios_transform_zlib_write.c
+++ b/src/transforms/adios_transform_zlib_write.c
@@ -121,7 +121,7 @@ int adios_transform_zlib_apply(struct adios_file_struct *fd,
         // Write directly to the shared buffer
         output_buff = fd->buffer + fd->offset;
     }
-    else    // Else, fall back to var->data memory allocation
+    else    // Else, fall back to var->adata memory allocation
     {
         *wrote_to_shared_buffer = 0;
         output_buff = malloc(output_size);
@@ -154,7 +154,7 @@ int adios_transform_zlib_apply(struct adios_file_struct *fd,
     }
     else
     {
-        var->data = output_buff;
+        var->adata = output_buff;
         var->data_size = actual_output_size;
         var->free_data = adios_flag_yes;
     }
diff --git a/src/write/adios_dataspaces.c b/src/write/adios_dataspaces.c
index 061393a..92a78f5 100644
--- a/src/write/adios_dataspaces.c
+++ b/src/write/adios_dataspaces.c
@@ -287,7 +287,7 @@ enum ADIOS_FLAG adios_dataspaces_should_buffer (struct adios_file_struct * fd
 
 void adios_dataspaces_write (struct adios_file_struct * fd
                       ,struct adios_var_struct * v
-                      ,void * data
+                      ,const void * data
                       ,struct adios_method_struct * method
                       )
 {
@@ -425,11 +425,11 @@ void adios_dataspaces_get_write_buffer (struct adios_file_struct * fd
         return;
     }
 
-    if (v->data && v->free_data == adios_flag_yes)
+    if (v->adata && v->free_data == adios_flag_yes)
     {
         adios_method_buffer_free (v->data_size);
-        free (v->data);
-        v->data = NULL;
+        free (v->adata);
+        v->data = v->adata = NULL;
     }
 
     mem_allowed = adios_method_buffer_alloc (*size);
@@ -544,7 +544,7 @@ static void adios_dataspaces_gather_indices (struct adios_file_struct * fd
                         ,&new_attrs_root
                         );
                 adios_merge_index_v1 (index, new_pg_root, 
-                                      new_vars_root, new_attrs_root);
+                                      new_vars_root, new_attrs_root, 0);
                 new_pg_root = 0;
                 new_vars_root = 0;
                 new_attrs_root = 0;
diff --git a/src/write/adios_datatap.c b/src/write/adios_datatap.c
index 4e9b8c3..02abf84 100644
--- a/src/write/adios_datatap.c
+++ b/src/write/adios_datatap.c
@@ -672,7 +672,7 @@ extern enum ADIOS_FLAG adios_datatap_should_buffer (struct adios_file_struct * f
 extern void
 adios_datatap_write(struct adios_file_struct *fd,
                     struct adios_var_struct *f,
-                    void *data, struct adios_method_struct *method)
+                    const void *data, struct adios_method_struct *method)
 {
     struct fm_structure *fm;
     dmd *mdata = (dmd *) method->method_data;
diff --git a/src/write/adios_dimes.c b/src/write/adios_dimes.c
index 76acf59..53b67b8 100644
--- a/src/write/adios_dimes.c
+++ b/src/write/adios_dimes.c
@@ -422,7 +422,7 @@ enum ADIOS_FLAG adios_dimes_should_buffer (struct adios_file_struct * fd
 
 void adios_dimes_write (struct adios_file_struct * fd
                       ,struct adios_var_struct * v
-                      ,void * data
+                      ,const void * data
                       ,struct adios_method_struct * method
                       )
 {
@@ -561,11 +561,11 @@ void adios_dimes_get_write_buffer (struct adios_file_struct * fd
         return;
     }
 
-    if (v->data && v->free_data == adios_flag_yes)
+    if (v->adata && v->free_data == adios_flag_yes)
     {
         adios_method_buffer_free (v->data_size);
-        free (v->data);
-        v->data = NULL;
+        free (v->adata);
+        v->data = v->adata = NULL;
     }
 
     mem_allowed = adios_method_buffer_alloc (*size);
@@ -680,7 +680,7 @@ static void adios_dimes_gather_indices (struct adios_file_struct * fd
                         ,&new_attrs_root
                         );
                 adios_merge_index_v1 (index, new_pg_root, 
-                                      new_vars_root, new_attrs_root);
+                                      new_vars_root, new_attrs_root, 0);
                 new_pg_root = 0;
                 new_vars_root = 0;
                 new_attrs_root = 0;
diff --git a/src/write/adios_flexpath.c b/src/write/adios_flexpath.c
index 53f29af..cbe3740 100644
--- a/src/write/adios_flexpath.c
+++ b/src/write/adios_flexpath.c
@@ -192,9 +192,9 @@ char*
 resolve_path_name(char *path, char *name)
 {
     char *fullname = NULL;
-    if(name){
-        if(path){
-            if(strcmp(path, "")){
+    if (name) {
+        if (path) {
+            if (strcmp(path, "")) {
                 fullname = malloc(strlen(path) + strlen(name) + 2);
                 strcpy(fullname, path);
                 strcat(fullname, "/");
@@ -238,7 +238,7 @@ set_flush_id_atom(attr_list attrs, int value)
 {
     atom_t dst_atom = attr_atom_from_string("fp_flush_id");
     int dst;
-    if(!get_int_attr(attrs, dst_atom, &dst)) {
+    if (!get_int_attr(attrs, dst_atom, &dst)) {
         add_int_attr(attrs, dst_atom, value);
     }
     set_int_attr(attrs, dst_atom, value);
@@ -251,7 +251,7 @@ set_size_atom(attr_list attrs, int value)
 {
     atom_t dst_atom = attr_atom_from_string("fp_size");
     int size;
-    if(!get_int_attr(attrs, dst_atom, &size)) {
+    if (!get_int_attr(attrs, dst_atom, &size)) {
         add_int_attr(attrs, dst_atom, value);
     }
     set_int_attr(attrs, dst_atom, value);
@@ -264,7 +264,7 @@ set_dst_rank_atom(attr_list attrs, int value)
 {
     atom_t dst_atom = attr_atom_from_string("fp_dst_rank");
     int dst;
-    if(!get_int_attr(attrs, dst_atom, &dst)) {
+    if (!get_int_attr(attrs, dst_atom, &dst)) {
         add_int_attr(attrs, dst_atom, value);
     }
     set_int_attr(attrs, dst_atom, value);
@@ -277,7 +277,7 @@ set_dst_condition_atom(attr_list attrs, int condition)
 {
     atom_t dst_atom = attr_atom_from_string("fp_dst_condition");
     int dst;
-    if(!get_int_attr(attrs, dst_atom, &dst)){
+    if (!get_int_attr(attrs, dst_atom, &dst)) {
 	add_int_attr(attrs, dst_atom, condition);
     }
     set_int_attr(attrs, dst_atom, condition);
@@ -293,7 +293,7 @@ evgroup_msg_free(void *eventData, void *clientData)
     /* evgroup *msg = (evgroup*)eventData; */
     /* int num_vars = msg->num_vars; */
     /* int i; */
-    /* for(i=0; i<num_vars; i++){ */
+    /* for (i=0; i<num_vars; i++) { */
     /* 	free(msg->vars[i].offsets); */
     /* } */
     /* free(msg); */
@@ -327,7 +327,7 @@ op_free(void* eventData, void* clientData)
 {
     fp_write_log("OP", "freeing an op message\n");
     op_msg* op = (op_msg*) eventData;
-    if(op->file_name) {
+    if (op->file_name) {
         free(op->file_name);
     }
     free(op);
@@ -337,12 +337,12 @@ op_free(void* eventData, void* clientData)
 int 
 queue_count(FlexpathQueueNode** queue) 
 {
-    if(*queue==NULL) {
+    if (*queue==NULL) {
         return 0;
     }
     int count = 1;
     FlexpathQueueNode* current = *queue;
-    while(current && current->next) {
+    while (current && current->next) {
         count++;
         current = current->next;
     }
@@ -360,8 +360,8 @@ threaded_enqueue(
     int max_size) 
 {
     pthread_mutex_lock(mutex);
-    if(max_size > 0){
-	while(queue_count(queue) > max_size){
+    if (max_size > 0) {
+	while (queue_count(queue) > max_size) {
 	    pthread_cond_wait(condition, mutex);
 	}
     }
@@ -383,23 +383,23 @@ threaded_dequeue(
     int signal_dequeue) 
 {
     pthread_mutex_lock(mutex);
-    while(queue_count(queue) == 0) {
+    while (queue_count(queue) == 0) {
         pthread_cond_wait(condition, mutex);
     }
     FlexpathQueueNode *tail;
     FlexpathQueueNode *prev = NULL;
     tail = *queue;
-    while(tail && tail->next) {
+    while (tail && tail->next) {
         prev=tail;
         tail=tail->next;
     }
-    if(prev) {
+    if (prev) {
         prev->next = NULL;
     } else {
         *queue = NULL;
     }
     pthread_mutex_unlock(mutex);
-    if(signal_dequeue==1) {
+    if (signal_dequeue==1) {
         pthread_cond_broadcast(condition);
     }
     return tail;
@@ -413,12 +413,12 @@ threaded_peek(FlexpathQueueNode** queue,
 {
     pthread_mutex_lock(mutex);
     int q = queue_count(queue);
-    if(q == 0) {	
+    if (q == 0) {	
 	pthread_cond_wait(condition, mutex);
     }
     FlexpathQueueNode* tail;
     tail = *queue;
-    while(tail && tail->next) {
+    while (tail && tail->next) {
         tail=tail->next;
     }
     pthread_mutex_unlock(mutex);
@@ -429,7 +429,7 @@ threaded_peek(FlexpathQueueNode** queue,
 FlexpathVarNode* 
 add_var(FlexpathVarNode* queue, char* varName, FlexpathVarNode* dims, int rank)
 {
-    if(queue) {
+    if (queue) {
         queue->next=add_var(queue->next, varName, dims, rank);
         return queue;
     } else {
@@ -446,7 +446,7 @@ add_var(FlexpathVarNode* queue, char* varName, FlexpathVarNode* dims, int rank)
 void 
 free_vars(FlexpathVarNode* queue)
 {
-    if(queue) {
+    if (queue) {
         free_vars(queue->next);
         free(queue->varName);
         free(queue);
@@ -458,14 +458,14 @@ FlexpathVarNode*
 queue_contains(FlexpathVarNode* queue, const char* name, int rank) 
 {
     int compare_rank = 0;
-    if(rank >= 0 ) {
+    if (rank >= 0 ) {
         compare_rank = 1;
     }
     FlexpathVarNode* tmp = queue;
-    while(tmp) {
-        if(strcmp(tmp->varName, name)==0){
-            if(compare_rank) {
-                if(tmp->rank == rank) {
+    while (tmp) {
+        if (strcmp(tmp->varName, name)==0) {
+            if (compare_rank) {
+                if (tmp->rank == rank) {
                     return tmp;
                 }
             } else {
@@ -534,21 +534,22 @@ get_var_offsets(struct adios_var_struct *v,
 		      uint64_t **local_dimensions,
 		      uint64_t **global_dimensions)
 {
-    struct adios_dimension_struct * dim_list = v->dimensions;	    
-
+    struct adios_dimension_struct * dim_list = v->dimensions;
     int ndims = 0;
     while (dim_list) {
         ndims++;
         dim_list = dim_list->next;
     }
-    dim_list = v->dimensions;	    
-
-    if(ndims){		
+    dim_list = v->dimensions;
+    
+    if (ndims) {
+	uint64_t global = adios_get_dim_value(&dim_list->global_dimension);
+	if (global == 0) { return 0;}
         uint64_t *local_offsets = (uint64_t*)malloc(sizeof(uint64_t) * ndims);
         uint64_t *local_sizes = (uint64_t*)malloc(sizeof(uint64_t) * ndims);
 	uint64_t *global_sizes = (uint64_t*)malloc(sizeof(uint64_t) * ndims);
         int n = 0; 
-        while(dim_list) {		
+        while (dim_list) {
             local_sizes[n] = (uint64_t)adios_get_dim_value(&dim_list->dimension);
             local_offsets[n] = (uint64_t)adios_get_dim_value(&dim_list->local_offset);
 	    global_sizes[n] = (uint64_t)adios_get_dim_value(&dim_list->global_dimension);
@@ -572,40 +573,40 @@ char *multiqueue_action = "{\n\
     int flush_data_count = 0; \n\
     int my_rank = -1;\n\
     attr_list mine;\n\
-    if(EVcount_varMsg()>0) {\n\
+    if (EVcount_varMsg()>0) {\n\
         EVdiscard_and_submit_varMsg(0, 0);\n\
     }\n\
-    if(EVcount_update_step_msg() > 1) {\n\
+    if (EVcount_update_step_msg() > 1) {\n\
         EVdiscard_update_step_msg(0);\n\
     }\n\
-    if(EVcount_drop_evgroup_msg()>0) {\n\
-       if(EVcount_evgroup()>0) {\n\
+    if (EVcount_drop_evgroup_msg()>0) {\n\
+       if (EVcount_evgroup()>0) {\n\
           EVdiscard_evgroup(0);\n\
        }\n\
        EVdiscard_and_submit_drop_evgroup_msg(0,0);\n\
     }\n\
-    if(EVcount_op_msg()>0) {\n\
+    if (EVcount_op_msg()>0) {\n\
         op_msg *msg = EVdata_op_msg(0);\n\
         mine = EVget_attrs_op_msg(0);\n\
         found = attr_ivalue(mine, \"fp_dst_rank\");\n\
-        if(found > 0) {\n\
+        if (found > 0) {\n\
             EVdiscard_and_submit_op_msg(found, 0);\n\
         } else {\n\
             EVdiscard_and_submit_op_msg(0,0);\n\
         }\n\
     }\n\
-    if(EVcount_flush()>0) {\n\
+    if (EVcount_flush()>0) {\n\
         flush *c = EVdata_flush(0);\n\
-         if(c->type == 2) { \n\
-             if(EVcount_evgroup()>0){\n\
+         if (c->type == 2) { \n\
+             if (EVcount_evgroup()>0) {\n\
                evgroup *g = EVdata_evgroup(0); \n\
                g->condition = c->condition;\n\
                EVsubmit(c->process_id+1, g);\n\
                EVdiscard_flush(0);\n\
              }\n\
          }\n\
-         else if(c->type == 3) {\n\
-            if(EVcount_update_step_msg()>0) {\n\
+         else if (c->type == 3) {\n\
+            if (EVcount_update_step_msg()>0) {\n\
                update_step_msg *stepmsg = EVdata_update_step_msg(0);\n\
                stepmsg->condition = c->condition;\n\
                EVsubmit(c->process_id+1, stepmsg);\n\
@@ -617,7 +618,7 @@ char *multiqueue_action = "{\n\
             flush_data_count++;\n\
          }\n\
     }\n\
-    if(EVcount_anonymous()>0){\n\
+    if (EVcount_anonymous()>0) {\n\
         mine = EVget_attrs_anonymous(0);\n\
         found = attr_ivalue(mine, \"fp_dst_rank\");\n\
         EVdiscard_and_submit_anonymous(found+1,0);\n\
@@ -631,7 +632,7 @@ set_field(int type, FMFieldList* field_list_ptr, int fieldNo, int* size)
     FMFieldList field_list = *field_list_ptr;
     switch (type) {
     case adios_unknown:
-	perr("set_field: Bad Type Error\n");
+	fprintf(stderr, "set_field: Bad Type Error %d\n", type);
 	break;
 
     case adios_unsigned_integer:
@@ -640,13 +641,7 @@ set_field(int type, FMFieldList* field_list_ptr, int fieldNo, int* size)
 	field_list[fieldNo].field_offset = *size;
 	*size += sizeof(unsigned int);
 	break;
-
-    case adios_unsigned_long:
-	field_list[fieldNo].field_type = strdup("unsigned long");
-	field_list[fieldNo].field_size = sizeof(unsigned long);
-	field_list[fieldNo].field_offset = *size;
-	*size += sizeof(unsigned long);
-
+	
     case adios_integer:
 	field_list[fieldNo].field_type = strdup("integer");
 	field_list[fieldNo].field_size = sizeof(int);
@@ -654,7 +649,7 @@ set_field(int type, FMFieldList* field_list_ptr, int fieldNo, int* size)
 	*size += sizeof(int);
 	break;
 
-    case adios_real:
+    case adios_real:       
 	field_list[fieldNo].field_type = strdup("float");
 	field_list[fieldNo].field_size = sizeof(float);
 	field_list[fieldNo].field_offset = *size;
@@ -669,12 +664,19 @@ set_field(int type, FMFieldList* field_list_ptr, int fieldNo, int* size)
 	break;
 
     case adios_double:
-	field_list[fieldNo].field_type = strdup("float");
+	field_list[fieldNo].field_type = strdup("double");
 	field_list[fieldNo].field_size = sizeof(double);
 	field_list[fieldNo].field_offset = *size;
 	*size += sizeof(double);
 	break;
 
+    case adios_long_double:
+	field_list[fieldNo].field_type = strdup("double");
+	field_list[fieldNo].field_size = sizeof(long double);
+	field_list[fieldNo].field_offset = *size;
+	*size += sizeof(long double);
+	break;
+
     case adios_byte:
 	field_list[fieldNo].field_type = strdup("char");
 	field_list[fieldNo].field_size = sizeof(char);
@@ -682,6 +684,20 @@ set_field(int type, FMFieldList* field_list_ptr, int fieldNo, int* size)
 	*size += sizeof(char);
 	break;
 
+    case adios_long:
+	field_list[fieldNo].field_type = strdup("integer");
+	field_list[fieldNo].field_size = sizeof(long);
+	field_list[fieldNo].field_offset = *size;
+	*size += sizeof(long);
+	break;
+	
+    case adios_unsigned_long:
+	field_list[fieldNo].field_type = strdup("unsigned integer");
+	field_list[fieldNo].field_size = sizeof(unsigned long);
+	field_list[fieldNo].field_offset = *size;
+	*size += sizeof(unsigned long);
+	break;
+
     case adios_complex:
         field_list[fieldNo].field_type = strdup("complex");
         field_list[fieldNo].field_size = sizeof(complex_dummy);
@@ -697,7 +713,7 @@ set_field(int type, FMFieldList* field_list_ptr, int fieldNo, int* size)
         break;
 
     default:
-	perr("set_field: Unknown Type Error\n");
+	fprintf(stderr, "set_field: Unknown Type Error %d\n", type);
 	break;
     }
     *field_list_ptr = field_list;
@@ -718,7 +734,7 @@ internal_find_field(char *name, FMFieldList flist)
 void 
 mem_check(void* ptr, const char* str) 
 {
-    if(!ptr) {
+    if (!ptr) {
         adios_error(err_no_memory, "Cannot allocate memory for flexpath %s.", str);
     }
 }
@@ -776,17 +792,16 @@ set_format(struct adios_group_struct *t,
 
 	// use the mangled name for the field.
 	field_list[fieldNo].field_name = fullname;
-        if(fullname!=NULL) {
+        if (fullname!=NULL) {
             int num_dims = 0;
             char atom_name[200] = "";
             FlexpathVarNode *dims=NULL;
-            if(adios_var->dimensions) {
+            if (adios_var->dimensions) {
                 struct adios_dimension_struct *adim = adios_var->dimensions;  
 		
                 // attach appropriate attrs for dimensions	
-                for(; adim != NULL; adim = adim->next) {
+                for (; adim != NULL; adim = adim->next) {
                     num_dims++;		    
-                    
 		    // have to change get_alt_name to append FPVAR at the start of each varname.
                     char *vname = get_dim_name(&adim->dimension);
                     if (vname) {
@@ -798,13 +813,16 @@ set_format(struct adios_group_struct *t,
 			set_attr_dimensions(fullname, aname, num_dims, fileData->attrs);
 		    }
                     char *gname = get_dim_name(&adim->global_dimension);
-		    if(gname) {
+		    if (gname) {
 			fileData->globalCount++;
 			//char *name = find_fixed_name(currentFm, gname);
 			char *aname = get_alt_name(fullname, gname);
 			dims=add_var(dims, strdup(aname), NULL, 0);
 			set_attr_dimensions(fullname, aname, num_dims, fileData->attrs);
 		    }
+		    if (adim->global_dimension.rank > 0) {
+			fileData->globalCount++;
+		    }
                 }
             }
             // attach ndims attr
@@ -846,7 +864,7 @@ set_format(struct adios_group_struct *t,
 	    }
 	    v_offset *= -1;
 		  
-	    while(currentFm->size % 8 != 0) {
+	    while (currentFm->size % 8 != 0) {
 		currentFm->size ++;					
 	    }
 		  
@@ -884,21 +902,6 @@ set_format(struct adios_group_struct *t,
 		{  currentFm->size += (v_offset * sizeof(unsigned int));  } 
 		break;
 
-	    case adios_unsigned_long: // needs to be unsigned integer in ffs
-                // to distinguish on reader_side, I have to look at the size also
-		field_list[fieldNo].field_type =
-		    (char *) malloc(sizeof(char) * 255);
-		snprintf((char *) field_list[fieldNo].field_type, 255,
-			 "unsigned long%s", dims);
-		field_list[fieldNo].field_size = sizeof(unsigned long);
-		      
-		field_list[fieldNo].field_offset = currentFm->size;
-		if (v_offset == 0 ) // pointer to variably sized array
-		{ currentFm->size += sizeof(void *);  } 
-		else // statically sized array allocated inline
-		{  currentFm->size += (v_offset * sizeof(unsigned long));  } 
-		break;
-
 	    case adios_real:
 		field_list[fieldNo].field_type =
 		    (char *) malloc(sizeof(char) * 255);
@@ -931,6 +934,19 @@ set_format(struct adios_group_struct *t,
 		else // statically sized array allocated inline
 		{  currentFm->size += (v_offset * sizeof(double));  } 
 		break;
+		
+	    case adios_long_double:
+		field_list[fieldNo].field_type =
+		    (char *) malloc(sizeof(char) * 255);
+		snprintf((char *) field_list[fieldNo].field_type, 255,
+			 "double%s", dims);
+		field_list[fieldNo].field_size = sizeof(long double);
+		field_list[fieldNo].field_offset = currentFm->size;
+		if (v_offset == 0 ) // pointer to variably sized array
+		{ currentFm->size += sizeof(void *);  } 
+		else // statically sized array allocated inline
+		{  currentFm->size += (v_offset * sizeof(long double));  } 
+		break;
 
 	    case adios_byte:
 		field_list[fieldNo].field_type =
@@ -945,7 +961,37 @@ set_format(struct adios_group_struct *t,
 		{  currentFm->size += (v_offset * sizeof(char));  } 
 		break;
 
-            case adios_complex:
+	    case adios_long: // needs to be unsigned integer in ffs
+                // to distinguish on reader_side, I have to look at the size also
+		field_list[fieldNo].field_type =
+		    (char *) malloc(sizeof(char) * 255);
+		snprintf((char *) field_list[fieldNo].field_type, 255,
+			 "integer%s", dims);
+		field_list[fieldNo].field_size = sizeof(long);
+		      
+		field_list[fieldNo].field_offset = currentFm->size;
+		if (v_offset == 0 ) // pointer to variably sized array
+		{ currentFm->size += sizeof(void *);  } 
+		else // statically sized array allocated inline
+		{  currentFm->size += (v_offset * sizeof(long));  } 
+		break;
+		
+	    case adios_unsigned_long: // needs to be unsigned integer in ffs
+                // to distinguish on reader_side, I have to look at the size also
+		field_list[fieldNo].field_type =
+		    (char *) malloc(sizeof(char) * 255);
+		snprintf((char *) field_list[fieldNo].field_type, 255,
+			 "unsigned integer%s", dims);
+		field_list[fieldNo].field_size = sizeof(unsigned long);
+		      
+		field_list[fieldNo].field_offset = currentFm->size;
+		if (v_offset == 0 ) // pointer to variably sized array
+		{ currentFm->size += sizeof(void *);  } 
+		else // statically sized array allocated inline
+		{  currentFm->size += (v_offset * sizeof(unsigned long));  } 
+		break;
+
+	    case adios_complex:
 		field_list[fieldNo].field_type =
 		    (char *) malloc(sizeof(char) * 255);
 		snprintf((char *) field_list[fieldNo].field_type, 255, "complex%s",
@@ -1013,7 +1059,7 @@ set_format(struct adios_group_struct *t,
     format[1].field_list = complex_dummy_field_list;
     format[2].format_name = strdup("double_complex");
     format[2].field_list = double_complex_dummy_field_list;
-    
+
     format[0].struct_size = currentFm->size;
     format[1].struct_size = sizeof(complex_dummy);
     format[2].struct_size = sizeof(double_complex_dummy);
@@ -1031,20 +1077,20 @@ void* copy_buffer(void* buffer, int rank, FlexpathWriteFileData* fileData)
     while (f->field_name != NULL)
     {
         FlexpathVarNode* a;
-        if(!queue_contains(fileData->askedVars, f->field_name, rank)) {
-            if((a=queue_contains(fileData->formatVars, f->field_name, -1)) 
+        if (!queue_contains(fileData->askedVars, f->field_name, rank)) {
+            if ((a=queue_contains(fileData->formatVars, f->field_name, -1)) 
 	       && 
 	       (a->dimensions != NULL)) {
                 FlexpathVarNode* dim = a->dimensions;
-                while(dim) {
+                while (dim) {
                     FMField *f2 = fileData->fm->format[0].field_list;
-                    while(f2->field_name != NULL) {
-                        if(strcmp(f2->field_name, dim->varName)==0) {
+                    while (f2->field_name != NULL) {
+                        if (strcmp(f2->field_name, dim->varName)==0) {
                             break;
                         }
                         f2++;
                     }
-                    if(f2->field_name != NULL) {
+                    if (f2->field_name != NULL) {
                         memset(&temp[f2->field_offset], 0, f2->field_size);
                     }
                     dim = dim->next;
@@ -1067,7 +1113,7 @@ process_data_flush(FlexpathWriteFileData *fileData,
     fileData->attrs = set_dst_rank_atom(fileData->attrs, flushMsg->process_id);
     fileData->attrs = set_flush_id_atom(fileData->attrs, flushMsg->id);
     
-    if(!fileData->bridges[flushMsg->process_id].opened) {
+    if (!fileData->bridges[flushMsg->process_id].opened) {
 	fileData->bridges[flushMsg->process_id].opened=1;
 	fileData->openCount++;
     }
@@ -1089,7 +1135,7 @@ process_open_msg(FlexpathWriteFileData *fileData, op_msg *open)
 {
     fileData->bridges[open->process_id].step = open->step;
     fileData->bridges[open->process_id].condition = open->condition;
-    if(!fileData->bridges[open->process_id].created){
+    if (!fileData->bridges[open->process_id].created) {
 	fileData->bridges[open->process_id].created = 1;
 	fileData->bridges[open->process_id].myNum = 
 	    EVcreate_bridge_action(
@@ -1104,7 +1150,7 @@ process_open_msg(FlexpathWriteFileData *fileData, op_msg *open)
 			    fileData->bridges[open->process_id].myNum);
     }	
 	
-    if (open->step == fileData->readerStep){
+    if (open->step == fileData->readerStep) {
 	pthread_mutex_lock(&fileData->openMutex);
 	fileData->openCount++;  
 	fileData->bridges[open->process_id].opened = 1;
@@ -1119,7 +1165,7 @@ process_open_msg(FlexpathWriteFileData *fileData, op_msg *open)
 	fileData->attrs = set_dst_rank_atom(fileData->attrs, open->process_id+1);
 	EVsubmit_general(fileData->opSource, ack, op_free, fileData->attrs);
     } 
-    else if(open->step < fileData->readerStep) {
+    else if (open->step < fileData->readerStep) {
 	log_error("Flexpath method control_thread: Received Past Step Open\n");
     } 
     else {
@@ -1137,7 +1183,7 @@ process_close_msg(FlexpathWriteFileData *fileData, op_msg *close)
     fileData->bridges[close->process_id].condition = close->condition;
     pthread_mutex_unlock(&fileData->openMutex);
 
-    if(fileData->openCount==0) {
+    if (fileData->openCount==0) {
 	FlexpathQueueNode* node = threaded_dequeue(&fileData->dataQueue, 
 						   &fileData->dataMutex, 
 						   &fileData->dataCondition, 1);
@@ -1194,7 +1240,7 @@ flush_handler(CManager cm, void* vevent, void* client_data, attr_list attrs)
 }
 
 static int
-drop_evgroup_handler(CManager cm, void *vevent, void *client_data, attr_list attrs){
+drop_evgroup_handler(CManager cm, void *vevent, void *client_data, attr_list attrs) {
     drop_evgroup_msg *msg = vevent;
     // will have to change when not using control thread.
     CMCondition_signal(cm, msg->condition);    
@@ -1207,10 +1253,10 @@ op_handler(CManager cm, void* vevent, void* client_data, attr_list attrs)
     FlexpathWriteFileData* fileData = (FlexpathWriteFileData*) client_data;
     op_msg* msg = (op_msg*) vevent;
     EVtake_event_buffer(cm, vevent);
-    if(msg->type == OPEN_MSG) {
+    if (msg->type == OPEN_MSG) {
         threaded_enqueue(&fileData->controlQueue, msg, OPEN, 
 			 &fileData->controlMutex, &fileData->controlCondition, -1);
-    } else if(msg->type == CLOSE_MSG) {
+    } else if (msg->type == CLOSE_MSG) {
         threaded_enqueue(&fileData->controlQueue, msg, CLOSE, 
 			 &fileData->controlMutex, &fileData->controlCondition, -1);  			
     }
@@ -1225,15 +1271,15 @@ control_thread(void *arg)
     int rank = fileData->rank;
     FlexpathQueueNode *controlMsg;
     FlexpathQueueNode *dataNode;
-    while(1) {
-	if((controlMsg = threaded_dequeue(&fileData->controlQueue, 
+    while (1) {
+	if ((controlMsg = threaded_dequeue(&fileData->controlQueue, 
 	    &fileData->controlMutex, &fileData->controlCondition, 0))) {
-	    if(controlMsg->type==VAR){
+	    if (controlMsg->type==VAR) {
 		Var_msg *varMsg = (Var_msg*) controlMsg->data;
 		process_var_msg(fileData, varMsg);
 		EVreturn_event_buffer(flexpathWriteData.cm,controlMsg->data);
 	    }
-	    else if(controlMsg->type==DATA_FLUSH) {
+	    else if (controlMsg->type==DATA_FLUSH) {
 		Flush_msg *flushMsg = (Flush_msg*)controlMsg->data;
 		dataNode = threaded_peek(&fileData->dataQueue, 
 					 &fileData->dataMutex, 
@@ -1241,17 +1287,17 @@ control_thread(void *arg)
 		process_data_flush(fileData, flushMsg, dataNode);
 
 	    }
-	    else if(controlMsg->type==OPEN) {
+	    else if (controlMsg->type==OPEN) {
                 op_msg *open = (op_msg*) controlMsg->data;
 		process_open_msg(fileData, open);                
 		EVreturn_event_buffer(flexpathWriteData.cm, open);
             }
-	    else if(controlMsg->type==CLOSE) {
+	    else if (controlMsg->type==CLOSE) {
                 op_msg* close = (op_msg*) controlMsg->data;
 		process_close_msg(fileData, close);
 		EVreturn_event_buffer(flexpathWriteData.cm, close);
 	    }
-	    else{
+	    else {
 		log_error("control_thread: Unrecognized Control Message\n");
 	    }
 	}
@@ -1264,10 +1310,10 @@ void
 add_open_file(FlexpathWriteFileData* newFile) 
 {
     FlexpathWriteFileData* last = flexpathWriteData.openFiles;
-    while(last && last->next) {
+    while (last && last->next) {
         last = last->next;
     }
-    if(last) {
+    if (last) {
         last->next = newFile;
     } else {
         flexpathWriteData.openFiles = newFile;
@@ -1279,7 +1325,7 @@ FlexpathWriteFileData*
 find_open_file(char* name) 
 {
     FlexpathWriteFileData* file = flexpathWriteData.openFiles;
-    while(file && strcmp(file->name, name)) {
+    while (file && strcmp(file->name, name)) {
         file = file->next;
     }
     return file;
@@ -1299,8 +1345,8 @@ adios_flexpath_init(const PairStruct *params, struct adios_method_struct *method
     flexpathWriteData.cm = CManager_create();
     atom_t CM_TRANSPORT = attr_atom_from_string("CM_TRANSPORT");
     char * transport = getenv("CMTransport");
-    if(transport == NULL){
-	if(CMlisten(flexpathWriteData.cm) == 0) {
+    if (transport == NULL) {
+	if (CMlisten(flexpathWriteData.cm) == 0) {
 	    fprintf(stderr, "error: unable to initialize connection manager.\n");
 	    exit(1);
 	}
@@ -1316,7 +1362,7 @@ adios_flexpath_init(const PairStruct *params, struct adios_method_struct *method
     
     // fork communications thread
     int forked = CMfork_comm_thread(flexpathWriteData.cm);   
-    if(!forked) {
+    if (!forked) {
 	fprintf(stderr, "Wrtier error forking comm thread\n");
     }
 }
@@ -1326,13 +1372,13 @@ adios_flexpath_open(struct adios_file_struct *fd,
 		    struct adios_method_struct *method, 
 		    MPI_Comm comm) 
 {    
-    if( fd == NULL || method == NULL) {
+    if ( fd == NULL || method == NULL) {
         perr("open: Bad input parameters\n");
         return -1;
     }
 
     // file creation
-    if(find_open_file(method->group->name)) {
+    if (find_open_file(method->group->name)) {
         // stream already open
         return 0;
     }
@@ -1343,7 +1389,7 @@ adios_flexpath_open(struct adios_file_struct *fd,
     
     fileData->maxQueueSize = 1;
     fileData->use_ctrl_thread = 1;
-    if(method->parameters) {
+    if (method->parameters) {
         sscanf(method->parameters,"QUEUE_SIZE=%d;", &fileData->maxQueueSize);
     }
    
@@ -1376,7 +1422,7 @@ adios_flexpath_open(struct adios_file_struct *fd,
     MPI_Comm_size((fileData->mpiComm), &fileData->size);
     char *recv_buff = NULL;
     char sendmsg[CONTACT_LENGTH];
-    if(fileData->rank == 0) {
+    if (fileData->rank == 0) {
         recv_buff = (char *) malloc(fileData->size*CONTACT_LENGTH*sizeof(char));
     }
         
@@ -1389,10 +1435,10 @@ adios_flexpath_open(struct adios_file_struct *fd,
         CONTACT_LENGTH, MPI_CHAR, 0, (fileData->mpiComm));
 
     // rank 0 prints contact info to file
-    if(fileData->rank == 0) {
+    if (fileData->rank == 0) {
         sprintf(writer_info_filename, "%s_%s", fd->name, "writer_info.txt");
         FILE* writer_info = fopen(writer_info_filename,"w");
-        for(i=0; i<fileData->size; i++) {
+        for (i=0; i<fileData->size; i++) {
             fprintf(writer_info, "%s\n",&recv_buff[i*CONTACT_LENGTH]); 
         }
         fclose(writer_info);
@@ -1401,7 +1447,7 @@ adios_flexpath_open(struct adios_file_struct *fd,
     // poll file - race condition issues
     FILE* reader_ready = NULL;
     sprintf(reader_ready_filename, "%s_%s", fd->name, "reader_ready.txt");
-    while(!reader_ready){
+    while (!reader_ready) {
 	reader_ready = fopen(reader_ready_filename,"r");
     }
     fclose(reader_ready);
@@ -1409,14 +1455,14 @@ adios_flexpath_open(struct adios_file_struct *fd,
     // read contact list
     sprintf(reader_info_filename, "%s_%s", fd->name, "reader_info.txt");
     FILE* reader_info = fopen(reader_info_filename, "r");
-    if(!reader_info){
+    if (!reader_info) {
 	reader_info = fopen(reader_info_filename, "r");
     }
     char in_contact[CONTACT_LENGTH] = "";
     int numBridges = 0;
     int stone_num;
     // build a bridge per line
-    while(fscanf(reader_info, "%d:%s",&stone_num, in_contact)!=EOF){
+    while (fscanf(reader_info, "%d:%s",&stone_num, in_contact)!=EOF) {
 	//fprintf(stderr, "reader contact: %d:%s\n", stone_num, in_contact);
         fileData->bridges = realloc(fileData->bridges, sizeof(FlexpathStone) * (numBridges + 1));
         attr_list contact_list = attr_list_from_string(in_contact);
@@ -1433,7 +1479,7 @@ adios_flexpath_open(struct adios_file_struct *fd,
     MPI_Barrier((fileData->mpiComm));
     
     // cleanup of reader files (writer is done with it).
-    if(fileData->rank == 0){
+    if (fileData->rank == 0) {
 	unlink(reader_info_filename);
 	unlink(reader_ready_filename);
     }
@@ -1441,14 +1487,14 @@ adios_flexpath_open(struct adios_file_struct *fd,
 	
     //process group format
     struct adios_group_struct *t = method->group;
-    if(t == NULL){
+    if (t == NULL) {
 	adios_error(err_invalid_group, "Invalid group.\n");
 	return err_invalid_group;
     }
     fileData->host_language = t->adios_host_language_fortran;
     struct adios_var_struct *fields = t->vars;
 	
-    if(fields == NULL){
+    if (fields == NULL) {
 	adios_error(err_invalid_group, "Group has no variables.\n");
 	return err_invalid_group;
     }	
@@ -1514,7 +1560,7 @@ adios_flexpath_open(struct adios_file_struct *fd,
     fileData->fm->ioFormat = register_data_format(my_context, fileData->fm->format);
     
     sprintf(writer_ready_filename, "%s_%s", fd->name, "writer_ready.txt");
-    if(fileData->rank == 0) {
+    if (fileData->rank == 0) {
         FILE* writer_info = fopen(writer_ready_filename, "w");
         fprintf(writer_info, "ready");
         fclose(writer_info);
@@ -1532,7 +1578,7 @@ extern void
 adios_flexpath_write(
     struct adios_file_struct *fd, 
     struct adios_var_struct *f, 
-    void *data, 
+    const void *data, 
     struct adios_method_struct *method) 
 {
     FlexpathWriteFileData* fileData = find_open_file(method->group->name);
@@ -1555,10 +1601,15 @@ adios_flexpath_write(
 	if (!f->dimensions) {
 	    if (data) {
 		//why wouldn't it have data?
-		memcpy(&fm->buffer[field->field_offset], data, field->field_size);                
+		if (f->type == adios_string) {
+		    char *tmpstr = strdup((char*)data);
+		    set_FMPtrField_by_name(flist, fullname, fm->buffer, tmpstr);
+		} else {
+		    memcpy(&fm->buffer[field->field_offset], data, field->field_size);
+		}
 
 		//scalar quantities can have FlexpathAltNames also so assign those
-		if(field->field_name != NULL) {
+		if (field->field_name != NULL) {
 					
 		    FlexpathDimNames *d = NULL;
 		    for (d = fm->dimList.lh_first; d != NULL; d = d->entries.le_next) {
@@ -1567,11 +1618,15 @@ adios_flexpath_write(
 			    //check if there are FlexpathAltNames
 			    FlexpathAltName *a = NULL;
 			    for (a = d->altList.lh_first; a != NULL; a = a->entries.le_next) {
-				/* fprintf(stderr, "ALTNAME: %s, DIM: %s FIELD: %s\n",  */
-				/* 	a->name, d->name, field->field_name); */
-				memcpy(&fm->buffer[a->field->field_offset], 
-				       data, 
-				       a->field->field_size);
+				if (f->type == adios_string) {
+				    char *tmpstr = strdup((char*)data);
+				    set_FMPtrField_by_name(flist, fullname, fm->buffer, tmpstr);
+				    //(strcpy(&fm->buffer[a->field->field_offset], (char*)data));
+				} else {
+				    memcpy(&fm->buffer[a->field->field_offset], 
+					   data, 
+					   a->field->field_size);
+				}
 			    }
 			}
 		    }
@@ -1608,8 +1663,8 @@ adios_flexpath_write(
 extern void 
 adios_flexpath_close(struct adios_file_struct *fd, struct adios_method_struct *method) 
 {
-    FlexpathWriteFileData* fileData = find_open_file(method->group->name);
-    void* buffer = malloc(fileData->fm->size);    
+    FlexpathWriteFileData *fileData = find_open_file(method->group->name);
+    void *buffer = malloc(fileData->fm->size);    
     memcpy(buffer, fileData->fm->buffer, fileData->fm->size);
 
     threaded_enqueue(&fileData->dataQueue, buffer, 
@@ -1618,25 +1673,21 @@ adios_flexpath_close(struct adios_file_struct *fd, struct adios_method_struct *m
 		     &fileData->dataCondition,
 		     fileData->maxQueueSize);
     
-    int c = 0;
- 
     // now gather offsets and send them via MPI to root
     struct adios_group_struct * g = fd->group;
     struct adios_var_struct * list = g->vars;
     evgroup *gp = malloc(sizeof(evgroup));    
     gp->group_name = strdup(method->group->name);
     gp->process_id = fileData->rank;
-    if(fileData->globalCount == 0){
+    if (fileData->globalCount == 0 ) {
 
 	gp->num_vars = 0;
 	gp->step = fileData->writerStep;
 	gp->vars = NULL;
-	//fileData->gp = gp;       
-	//fileData->attrs = set_size_atom(fileData->attrs, fileData->size);
 	EVsubmit_general(fileData->offsetSource, gp, evgroup_msg_free, fileData->attrs);
     }
 
-    else{	
+    else {	
         // process local offsets here	
 	int num_gbl_vars = 0;
         global_var * gbl_vars = NULL;
@@ -1644,7 +1695,7 @@ adios_flexpath_close(struct adios_file_struct *fd, struct adios_method_struct *m
 	int myrank = fileData->rank;
 	int commsize = fileData->size;
 
-	while(list){
+	while (list) {
 	    char *fullname = resolve_path_name(list->path, list->name);
 	    //int num_local_offsets = 0;
 	    uint64_t *local_offsets = NULL;
@@ -1661,7 +1712,7 @@ adios_flexpath_close(struct adios_file_struct *fd, struct adios_method_struct *m
                 reverse_dims(global_dimensions, num_local_offsets);
             }
 
-	    if(num_local_offsets > 0){
+	    if (num_local_offsets > 0) {
 		uint64_t *all_offsets = NULL;
 		uint64_t *all_local_dims = NULL;
 		
@@ -1718,7 +1769,7 @@ extern void
 adios_flexpath_finalize(int mype, struct adios_method_struct *method) 
 {
     FlexpathWriteFileData* fileData = flexpathWriteData.openFiles;
-    while(fileData) {
+    while (fileData) {
 
 	update_step_msg *stepmsg = malloc(sizeof(update_step_msg));
 	stepmsg->finalized = 1;
@@ -1727,7 +1778,7 @@ adios_flexpath_finalize(int mype, struct adios_method_struct *method)
 	EVsubmit_general(fileData->stepSource, stepmsg, update_step_msg_free, fileData->attrs);
 
         pthread_mutex_lock(&fileData->dataMutex);
-        while(fileData->dataQueue != NULL) {
+        while (fileData->dataQueue != NULL) {
 	    pthread_cond_wait(&fileData->dataCondition, &fileData->dataMutex);
 	}
 	pthread_mutex_unlock(&fileData->dataMutex);
@@ -1772,21 +1823,21 @@ adios_flexpath_get_write_buffer(struct adios_file_struct *fd,
 {
     uint64_t mem_allowed;
 
-    if (*size == 0){    
+    if (*size == 0) {    
         *buffer = 0;
         return;
     }
 
-    if (v->data && v->free_data == adios_flag_yes){   
+    if (v->adata && v->free_data == adios_flag_yes) {   
         adios_method_buffer_free (v->data_size);
-        free (v->data);
-        v->data = NULL;
+        free (v->adata);
+        v->data = v->adata = NULL;
     }
 
     mem_allowed = adios_method_buffer_alloc (*size);
-    if (mem_allowed == *size){   
+    if (mem_allowed == *size) {   
         *buffer = malloc (*size);
-        if (!*buffer){        
+        if (!*buffer) {        
             adios_method_buffer_free (mem_allowed);
             log_error ("ERROR: Out of memory allocating %llu bytes for %s in %s:%s()\n"
                     ,*size, v->name, __FILE__, __func__
@@ -1798,14 +1849,14 @@ adios_flexpath_get_write_buffer(struct adios_file_struct *fd,
             *size = 0;
             *buffer = 0;
         }
-        else{        
+        else {        
             v->got_buffer = adios_flag_yes;
             v->free_data = adios_flag_yes;
             v->data_size = mem_allowed;
             v->data = *buffer;
         }
     }
-    else{    
+    else {    
         adios_method_buffer_free (mem_allowed);
         log_error ("OVERFLOW: Cannot allocate requested buffer of %llu "
                          "bytes for %s in %s:%s()\n"
diff --git a/src/write/adios_icee.c b/src/write/adios_icee.c
index c2b59ad..31aafc0 100644
--- a/src/write/adios_icee.c
+++ b/src/write/adios_icee.c
@@ -931,7 +931,7 @@ extern void
 adios_icee_write(
     struct adios_file_struct *fd, 
     struct adios_var_struct *f, 
-    void *data, 
+    const void *data, 
     struct adios_method_struct *method) 
 {
     log_debug ("%s\n", __FUNCTION__);
@@ -1010,7 +1010,7 @@ adios_icee_write(
         }
     }
     
-    vp->data = f->data;
+    vp->data = (char*)f->data;
     if (adios_verbose_level > 5) icee_varinfo_print(vp);
 
     fp->nvars++;
diff --git a/src/write/adios_mpi.c b/src/write/adios_mpi.c
index 16eea10..8221854 100644
--- a/src/write/adios_mpi.c
+++ b/src/write/adios_mpi.c
@@ -616,7 +616,7 @@ enum ADIOS_FLAG adios_mpi_should_buffer (struct adios_file_struct * fd
                 MPI_File_read (md->fh, md->b.buff, md->b.pg_size, MPI_BYTE
                               ,&md->status
                               );
-                adios_parse_process_group_index_v1 (&md->b, &md->index->pg_root);
+                adios_parse_process_group_index_v1 (&md->b, &md->index->pg_root, &md->index->pg_tail);
 
 #if 1
                 adios_init_buffer_read_vars_index (&md->b);
@@ -878,7 +878,7 @@ enum ADIOS_FLAG adios_mpi_should_buffer (struct adios_file_struct * fd
                                   ,&md->status
                                   );
 
-                    adios_parse_process_group_index_v1 (&md->b, &md->index->pg_root);
+                    adios_parse_process_group_index_v1 (&md->b, &md->index->pg_root, &md->index->pg_tail);
 
                     // find the largest time index so we can append properly
                     struct adios_index_process_group_struct_v1 * p;
@@ -890,7 +890,10 @@ enum ADIOS_FLAG adios_mpi_should_buffer (struct adios_file_struct * fd
                             max_time_index = p->time_index;
                         p = p->next;
                     }
-                    fd->group->time_index = ++max_time_index;
+                    if (fd->mode == adios_mode_append) {
+                        ++max_time_index;
+                    }
+                    fd->group->time_index = max_time_index;
                     MPI_Bcast (&fd->group->time_index, 1, MPI_INT, 0
                               ,md->group_comm
                               );
@@ -1091,7 +1094,7 @@ enum ADIOS_FLAG adios_mpi_should_buffer (struct adios_file_struct * fd
 
 void adios_mpi_write (struct adios_file_struct * fd
                      ,struct adios_var_struct * v
-                     ,void * data
+                     ,const void * data
                      ,struct adios_method_struct * method
                      )
 {
@@ -1104,7 +1107,7 @@ void adios_mpi_write (struct adios_file_struct * fd
         {
             if (v->free_data == adios_flag_yes)
             {
-                free (v->data);
+                free (v->adata);
                 adios_method_buffer_free (v->data_size);
             }
         }
@@ -1193,11 +1196,11 @@ void adios_mpi_write (struct adios_file_struct * fd
             uint64_t to_write = var_size;
             int write_len = 0;
             int count;
-            char * buf_ptr = v->data;
+            const char * buf_ptr = v->data;
             while (total_written < var_size)
             {
                 write_len = (to_write > MAX_MPIWRITE_SIZE) ? MAX_MPIWRITE_SIZE : to_write;
-                err = MPI_File_write (md->fh, buf_ptr, write_len, MPI_BYTE, &md->status);
+                err = MPI_File_write (md->fh, (char*)buf_ptr, write_len, MPI_BYTE, &md->status);
                 MPI_Get_count(&md->status, MPI_BYTE, &count);
                 if (count != write_len)
                 {
@@ -1265,10 +1268,10 @@ void adios_mpi_get_write_buffer (struct adios_file_struct * fd
         return;
     }
 
-    if (v->data && v->free_data)
+    if (v->adata && v->free_data)
     {
         adios_method_buffer_free (v->data_size);
-        free (v->data);
+        free (v->adata);
     }
 
     mem_allowed = adios_method_buffer_alloc (*size);
@@ -1315,7 +1318,7 @@ void adios_mpi_read (struct adios_file_struct * fd
                     ,struct adios_method_struct * method
                     )
 {
-    v->data = buffer;
+    v->data = v->adata = buffer;
     v->data_size = buffer_size;
 }
 
@@ -1332,6 +1335,7 @@ static void adios_mpi_do_read (struct adios_file_struct * fd
     {
         case 1:
         case 2:
+        case 3:
         {
             // the three section headers
             struct adios_process_group_header_struct_v1 pg_header;
@@ -1379,7 +1383,7 @@ static void adios_mpi_do_read (struct adios_file_struct * fd
 
                 if (v1)
                 {
-                    var_payload.payload = v1->data;
+                    var_payload.payload = v1->adata;
                     adios_parse_var_data_payload_v1 (&md->b, &var_header
                                                     ,&var_payload
                                                     ,v1->data_size
@@ -1448,7 +1452,7 @@ void adios_mpi_close (struct adios_file_struct * fd
             struct adios_var_struct * v = fd->group->vars;
             while (v)
             {
-                v->data = 0;
+                v->data = v->adata = 0;
                 v = v->next;
             }
 
@@ -1705,9 +1709,7 @@ void adios_mpi_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         // do not merge attributes from other processes from 1.4
                         /*
@@ -1716,7 +1718,7 @@ void adios_mpi_close (struct adios_file_struct * fd
                                                         );
                         */
                         adios_merge_index_v1 (md->index, new_pg_root, 
-                                              new_vars_root, new_attrs_root);
+                                              new_vars_root, new_attrs_root, 0);
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
@@ -2136,9 +2138,7 @@ timeval_subtract (&timing.t8, &b, &a);
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         // do not merge attributes from other processes from 1.4
                         /*
@@ -2147,7 +2147,7 @@ timeval_subtract (&timing.t8, &b, &a);
                                                         );
                         */
                         adios_merge_index_v1 (md->index, new_pg_root, 
-                                              new_vars_root, new_attrs_root);
+                                              new_vars_root, new_attrs_root, 0);
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
diff --git a/src/write/adios_mpi_amr.c b/src/write/adios_mpi_amr.c
index af043dc..61d387f 100644
--- a/src/write/adios_mpi_amr.c
+++ b/src/write/adios_mpi_amr.c
@@ -132,7 +132,7 @@ struct adios_MPI_thread_data_write
     MPI_File * fh;
     uint64_t * base_offset;
     void * aggr_buff;
-    int * total_data_size;
+    uint64_t * total_data_size;
 };
 
 #if defined(__APPLE__)
@@ -823,6 +823,7 @@ struct adios_var_struct * adios_mpi_amr_copy_var (struct adios_var_struct * v)
     v_new->stats = 0;
     v_new->free_data = v->free_data;
     v_new->data = 0;
+    v_new->adata = 0;
     v_new->data_size = v->data_size;
     v_new->next = 0;
 
@@ -1016,7 +1017,7 @@ void * adios_mpi_amr_do_reopen_thread (void * param)
         MPI_File_seek (md->fh, md->b.pg_index_offset, MPI_SEEK_SET);
         MPI_File_read (md->fh, md->b.buff, md->b.pg_size, MPI_BYTE, &md->status);
 
-        adios_parse_process_group_index_v1 (&md->b, &md->index->pg_root);
+        adios_parse_process_group_index_v1 (&md->b, &md->index->pg_root, &md->index->pg_tail);
 
         // find the largest time index so we can append properly
         struct adios_index_process_group_struct_v1 * p;
@@ -1537,14 +1538,14 @@ enum ADIOS_FLAG adios_mpi_amr_should_buffer (struct adios_file_struct * fd
                     }
 
                     MPI_Bcast (&fd->group->time_index, 1, MPI_INT, 0, md->g_comm1);
-                    MPI_Bcast (&md->b.pg_index_offset, 1, MPI_INT, 0, md->g_comm1);
+                    MPI_Bcast (&md->b.pg_index_offset, 1, MPI_LONG_LONG, 0, md->g_comm1);
                 } 
                 else //non-aggregators
                 {
                     fd->base_offset = 0;
                     fd->pg_start_in_file = fd->base_offset;
                     MPI_Bcast (&fd->group->time_index, 1, MPI_INT, 0, md->g_comm1);
-                    MPI_Bcast (&md->b.pg_index_offset, 1, MPI_INT, 0, md->g_comm1);
+                    MPI_Bcast (&md->b.pg_index_offset, 1, MPI_LONG_LONG, 0, md->g_comm1);
                 }
 
                 if (md->group_comm == MPI_COMM_NULL)
@@ -1613,7 +1614,7 @@ enum ADIOS_FLAG adios_mpi_amr_should_buffer (struct adios_file_struct * fd
 
 void adios_mpi_amr_write (struct adios_file_struct * fd
                          ,struct adios_var_struct * v
-                         ,void * data
+                         ,const void * data
                          ,struct adios_method_struct * method
                          )
 {
@@ -1626,7 +1627,7 @@ void adios_mpi_amr_write (struct adios_file_struct * fd
         {
             if (v->free_data == adios_flag_yes)
             {
-                free (v->data);
+                free (v->adata);
                 adios_method_buffer_free (v->data_size);
             }
         }
@@ -1749,10 +1750,10 @@ void adios_mpi_amr_get_write_buffer (struct adios_file_struct * fd
         return;
     }
 
-    if (v->data && v->free_data)
+    if (v->adata && v->free_data)
     {
         adios_method_buffer_free (v->data_size);
-        free (v->data);
+        free (v->adata);
     }
 
     mem_allowed = adios_method_buffer_alloc (*size);
@@ -1822,6 +1823,7 @@ static void adios_mpi_amr_do_read (struct adios_file_struct * fd
     {
         case 1:
         case 2:
+        case 3:
         {
             // the three section headers
             struct adios_process_group_header_struct_v1 pg_header;
@@ -1931,6 +1933,49 @@ uint32_t adios_mpi_amr_calculate_attributes_size (struct adios_file_struct * fd)
     return overhead;
 }
 
+
+/* Help routine to send data size greater than 2 GB */
+int adios_MPI_Send(void *buf, uint64_t count, int dest, int tag,
+             MPI_Comm comm)
+{
+    while (count > INT32_MAX)
+    {
+        MPI_Send (buf, INT32_MAX, MPI_BYTE, dest, tag, comm);
+        count -= INT32_MAX;
+        buf += INT32_MAX;
+    }
+
+    if (count)
+    {
+        int temp_count = (int) count;
+        MPI_Send (buf, temp_count, MPI_BYTE, dest, tag, comm);
+    }
+
+    return 0;
+}
+
+
+/* Help routine to receive data size greater than 2 GB */
+int adios_MPI_Recv(void *buf, uint64_t count, int source,
+                    int tag, MPI_Comm comm, MPI_Status *status)
+{
+    while (count > INT32_MAX)
+    {
+        MPI_Recv (buf, INT32_MAX, MPI_BYTE, source, tag, comm, status);
+        count -= INT32_MAX;
+        buf += INT32_MAX;
+    }
+
+    if (count)
+    {
+        int temp_count = (int) count;
+        MPI_Recv (buf, temp_count, MPI_BYTE, source, tag, comm, status);
+    }
+
+    return 0;
+
+}
+
 void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                             ,struct adios_method_struct * method
                             )
@@ -1959,10 +2004,11 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
             uint64_t buffer_size = 0;
             uint64_t buffer_offset = 0;
             uint64_t index_start1;
-            int * pg_sizes = 0, * disp = 0;
+            uint64_t * pg_sizes = 0, * disp = 0;
             void * aggr_buff = 0, * recv_buff = 0;
             struct adios_MPI_thread_data_write write_thread_data;
-            int i, new_rank, new_group_size, new_rank2, new_group_size2, max_data_size = 0, total_data_size = 0, total_data_size1 = 0;
+            int i, new_rank, new_group_size, new_rank2, new_group_size2;
+            uint64_t max_data_size = 0, total_data_size = 0, total_data_size1 = 0;
             START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
             //MPI_Comm_split (md->group_comm, md->g_color1, md->rank, &md->g_comm1);
             MPI_Comm_rank (md->g_comm1, &new_rank);
@@ -2138,14 +2184,13 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
             if (fd->shared_buffer == adios_flag_yes && !md->g_merging_pgs)
             {
                 //printf ("do not merge pg\n");
-                int pg_size;
+                uint64_t pg_size;
                 MPI_Request request;
                 MPI_Status status;
 
                 pg_size = fd->bytes_written;
-
-                pg_sizes = (int *) malloc (new_group_size * 4);
-                disp = (int *) malloc (new_group_size * 4);
+                pg_sizes = (uint64_t *) malloc (new_group_size * 8);
+                disp = (uint64_t *) malloc (new_group_size * 8);
                 if (pg_sizes == 0 || disp == 0)
                 {
                     adios_error (err_no_memory, "MPI_AMR method: Cannot allocate memory "
@@ -2154,8 +2199,8 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                 }
 
                 START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-                MPI_Allgather (&pg_size, 1, MPI_INT
-                              ,pg_sizes, 1, MPI_INT
+                MPI_Allgather (&pg_size, 1, MPI_UNSIGNED_LONG_LONG
+                              ,pg_sizes, 1, MPI_UNSIGNED_LONG_LONG
                               ,md->g_comm1);
                 STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
 
@@ -2175,7 +2220,7 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                     if (aggr_buff == 0 || recv_buff == 0)
                     {
                         adios_error (err_no_memory, "MPI_AMR method (with brigade strategy): Cannot allocate "
-                                    "2 x %d bytes for aggregation buffers. "
+                                    "2 x %lu bytes for aggregation buffers. "
                                     "An aggregator process needs a buffer to hold one process' output for writing, "
                                     "while it needs another buffer to concurrently receive another process' output for "
                                     "subsequent writing.\n", 
@@ -2189,7 +2234,7 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                     if (recv_buff == 0)
                     {
                         adios_error (err_no_memory, "MPI_AMR method (with brigade strategy): Cannot allocate "
-                                    "%d bytes for receive buffer in a non-aggregator process. "
+                                    "%lu bytes for receive buffer in a non-aggregator process. "
                                     "This method needs an extra buffer in every process to pass data along "
                                     "towards the aggregator.\n", 
                                     max_data_size);
@@ -2213,8 +2258,8 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                         if (i + 1 < new_group_size)
                         {
                             START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-                            MPI_Irecv (recv_buff, pg_sizes[i + 1], MPI_BYTE, new_rank + 1
-                                      ,0, md->g_comm1, &request);
+                            adios_MPI_Recv (recv_buff, pg_sizes[i + 1], new_rank + 1
+                                      ,0, md->g_comm1, &status);
                             STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
                         }
 
@@ -2235,10 +2280,6 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
 
                         if (i + 1 < new_group_size)
                         {
-                            START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-                            MPI_Wait (&request, &status);
-                            STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-
                             memcpy (aggr_buff, recv_buff, pg_sizes[i + 1]);
                         }
                     }
@@ -2248,7 +2289,7 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                     if (new_rank == new_group_size - 1)
                     {
                         START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-                        MPI_Send (fd->buffer, pg_size, MPI_BYTE, new_rank - 1
+                        adios_MPI_Send (fd->buffer, pg_size, new_rank - 1
                                  ,0, md->g_comm1);
                         STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
                     }
@@ -2258,17 +2299,17 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                         {
                             START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
                             // Recv data from upstream rank
-                            MPI_Irecv (recv_buff, pg_sizes[i], MPI_BYTE, new_rank + 1
-                                      ,0, md->g_comm1, &request);
+                            adios_MPI_Recv (recv_buff, pg_sizes[i], new_rank + 1
+                                      ,0, md->g_comm1, &status);
 
                             if (i == new_rank + 1)
                                 // Send my data to downstream rank
-                                MPI_Send (fd->buffer, pg_size, MPI_BYTE, new_rank - 1
+                                adios_MPI_Send (fd->buffer, pg_size, new_rank - 1
                                          ,0, md->g_comm1);
 
-                            MPI_Wait (&request, &status);
+                            //MPI_Wait (&request, &status);
                             // Send it to downstream rank
-                            MPI_Send (recv_buff, pg_sizes[i], MPI_BYTE, new_rank - 1
+                            adios_MPI_Send (recv_buff, pg_sizes[i], new_rank - 1
                                      ,0, md->g_comm1);
                             STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
                         }
@@ -2350,9 +2391,7 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         adios_parse_attributes_index_v1 (&md->b
                                                         ,&new_attrs_root
@@ -2361,7 +2400,7 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                             new_pg_root = 0;
 
                         adios_merge_index_v1 (md->index, new_pg_root, 
-                                              new_vars_root, new_attrs_root);
+                                              new_vars_root, new_attrs_root, 0);
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
@@ -2489,17 +2528,17 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                             md->b.length = index_sizes [i];
                             md->b.offset = 0;
 
-                            adios_parse_process_group_index_v1 (&md->b
-                                                               ,&new_pg_root
-                                                               );
+                            adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                             adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                             adios_parse_attributes_index_v1 (&md->b
                                                             ,&new_attrs_root
                                                             );
 
+                            // global index would become unsorted on main aggregator during merging 
+                            // so sort timesteps if appending
                             adios_merge_index_v1 (md->index, new_pg_root, 
-                                                  new_vars_root, new_attrs_root);
-                            // Note: timesteps are unsorted after this merge (in case of multiple steps (append))
+                                                  new_vars_root, new_attrs_root,
+                                                  (fd->mode == adios_mode_append));
                             new_pg_root = 0;
                             new_vars_root = 0;
                             new_attrs_root = 0;
@@ -2552,14 +2591,6 @@ void adios_mpi_amr_bg_close (struct adios_file_struct * fd
                     uint64_t global_index_start = 0;
                     uint16_t flag = 0;
 
-                    if (fd->mode == adios_mode_append)
-                    {
-                        double t=MPI_Wtime();
-                        // global index become unsorted on main aggregator during merging 
-                        adios_sort_index_v1 (&md->index->pg_root
-                                ,&md->index->vars_root ,&md->index->attrs_root);
-                        log_debug ("MPI_AGGREGATE: Index sorting time = %g sec\n", MPI_Wtime()-t);
-                    }
 
                     adios_write_index_v1 (&global_index_buffer, &global_index_buffer_size
                                          ,&global_index_buffer_offset, global_index_start
@@ -2678,10 +2709,11 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
             uint64_t buffer_size = 0;
             uint64_t buffer_offset = 0;
             uint64_t index_start1;
-            int * pg_sizes = 0, * disp = 0, * sendbuf = 0, * recvbuf = 0, * attr_sizes = 0;
+            uint64_t * pg_sizes = 0, * disp = 0;
             void * aggr_buff = 0;
             struct adios_MPI_thread_data_write write_thread_data;
-            int i, new_rank, new_group_size, new_rank2, new_group_size2, total_data_size = 0, total_data_size1 = 0;;
+            int i, new_rank, new_group_size, new_rank2, new_group_size2;
+            uint64_t total_data_size = 0, total_data_size1 = 0;;
 
             START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
             //MPI_Comm_split (md->group_comm, md->g_color1, md->rank, &new_comm);
@@ -2863,12 +2895,16 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
             // if not merge PG's on the aggregator side
             if (fd->shared_buffer == adios_flag_yes && !md->g_merging_pgs)
             {
-                //printf ("do not merge pg\n");
-                int pg_size;
+                uint64_t pg_size;
 
                 pg_size = fd->bytes_written;
-                pg_sizes = (int *) malloc (new_group_size * 4);
-                disp = (int *) malloc (new_group_size * 4);
+                if (pg_size > INT32_MAX)
+                {
+                    log_warn ("Each processor writes out more than %d bytes, Not supported in aggregation mode.\n", 
+                               INT32_MAX);
+                }
+                pg_sizes = (uint64_t *) malloc (new_group_size * 8);
+                disp = (uint64_t *) malloc (new_group_size * 8);
                 if (pg_sizes == 0 || disp == 0)
                 {
                     adios_error (err_no_memory, 
@@ -2880,8 +2916,8 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
                 }
 
                 START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-                MPI_Allgather (&pg_size, 1, MPI_INT
-                              ,pg_sizes, 1, MPI_INT
+                MPI_Allgather (&pg_size, 1, MPI_UNSIGNED_LONG_LONG
+                              ,pg_sizes, 1, MPI_UNSIGNED_LONG_LONG
                               ,md->g_comm1);
                 STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
 
@@ -2895,17 +2931,11 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
 
                 if (is_aggregator (md->rank))
                 {
-                    if (total_data_size > MAX_AGG_BUF)
-                    {
-                        log_warn ("The max allowed aggregation buffer is %d. Requested %d.\n"
-                                "Need to increase the number of aggregators.\n",
-                                MAX_AGG_BUF, total_data_size);
-                    }
                     aggr_buff = malloc (total_data_size);
                     if (aggr_buff == 0)
                     {
                         adios_error (err_no_memory, 
-                                "MPI_AMR method (AG): Cannot allocate %d bytes "
+                                "MPI_AMR method (AG): Cannot allocate %lu bytes "
                                 "for aggregation buffer.\n"
                                 "Need to increase the number of aggregators.\n",
                                 total_data_size);
@@ -2917,6 +2947,8 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
                 }
 
                 START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
+                // This needs to be changed in the future to support > 2 GB data.
+                // The compile warning is kept here as a reminder. Q. Liu
                 MPI_Gatherv (fd->buffer, pg_size, MPI_BYTE
                             ,aggr_buff, pg_sizes, disp, MPI_BYTE
                             ,0, md->g_comm1);
@@ -2927,240 +2959,6 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
             if (fd->shared_buffer == adios_flag_yes && md->g_merging_pgs)
             {
                 log_warn ("MPI_AMR method (AG): Merging process blocks is not supported yet\n");
-                // Merge PG's on the aggregator side
-                struct adios_bp_buffer_struct_v1 b;
-                struct adios_process_group_header_struct_v1 pg_header;
-                struct adios_vars_header_struct_v1 vars_header;
-                int pg_size, header_size;
-                uint32_t attr_size;
-                uint64_t vars_count_offset;
-
-                // Unfortunately, we need to walk through the buffer to get vars count
-                b.buff = fd->buffer;
-                b.change_endianness = md->b.change_endianness;
-                b.offset = 0;
-                b.length = fd->bytes_written;
-
-                adios_parse_process_group_header_v1 (&b, &pg_header);
-                vars_count_offset = b.offset;
-                adios_clear_process_group_header_v1 (&pg_header);
-
-                adios_parse_vars_header_v1 (&b, &vars_header);
-                header_size = b.offset;
-                attr_size = adios_mpi_amr_calculate_attributes_size (fd);
-
-                // reset vars count
-                if (vars_header.count * new_group_size > UINT16_MAX)
-                {
-                    adios_error (err_too_many_variables, 
-                        "MPI_AMR method (AG): Variable count exceeds UINT16_MAX (%d), UINT16_MAX");
-                    return;
-                }
-                *(uint16_t *) (b.buff + vars_count_offset) = 
-                                vars_header.count * new_group_size;
-
-                // attributes size is save in the end
-                adios_mpi_amr_buffer_write (&fd->buffer, &fd->buffer_size, &fd->offset, &attr_size, SHIM_FOOTER_SIZE);
-                fd->bytes_written += SHIM_FOOTER_SIZE;
-            
-                // PG header, vars header, vars, attrs header, attrs, 4 bytes
-                if (is_aggregator(md->rank))
-                {
-                    pg_size = fd->bytes_written;
-                }
-                else
-                {
-                    // Non-aggregator process doesn't need to send pg header + vars header
-                    pg_size = fd->bytes_written - header_size;
-                }
-
-                pg_sizes = (int *) malloc (new_group_size * 4);
-                attr_sizes = (int *) malloc (new_group_size * 4);
-                disp = (int *) malloc (new_group_size * 4);
-                sendbuf = (int *) malloc (2 * 4);
-                recvbuf = (int *) malloc (new_group_size * 2 * 4);
-                if (pg_sizes == 0 || attr_sizes == 0 || disp == 0
-                 || sendbuf == 0 || recvbuf == 0)
-                {
-                    adios_error (err_no_memory, 
-                            "MPI_AMR method (AG): Cannot allocate %llu bytes "
-                            "for send/recv/merge buffers.\n",
-                            5*4*new_group_size + 2*4
-                            );
-                    return;
-                }
-  
-                sendbuf[0] = pg_size;
-                sendbuf[1] = attr_size + SHIM_FOOTER_SIZE;
-
-                START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-                MPI_Allgather (sendbuf, 2, MPI_INT
-                              ,recvbuf, 2, MPI_INT
-                              ,md->g_comm1);
-                STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-
-                for (i = 0; i < new_group_size; i++)
-                {
-                    pg_sizes[i] = recvbuf[i * 2];
-                    attr_sizes[i] = recvbuf[i * 2 + 1];
-                }
-   
-                free (sendbuf);
-                free (recvbuf);
-
-                disp[0] = 0;
-                for (i = 1; i < new_group_size; i++)
-                {
-                    disp[i] = disp[i - 1] + pg_sizes[i - 1];
-                }
-                total_data_size = disp[new_group_size - 1]
-                                + pg_sizes[new_group_size - 1];
-
-                if (is_aggregator (md->rank))
-                {
-                    aggr_buff = malloc (total_data_size);
-                    if (aggr_buff == 0)
-                    {
-                        adios_error (err_no_memory, "MPI_AMR method (AG): Cannot allocate "
-                                "%llu bytes for aggregation buffer.\n"
-                                "Need to increase the number of aggregators.\n",
-                                total_data_size);
-                        return;
-                    }
-                }
-                else
-                {
-                }
-
-                if (is_aggregator (md->rank))
-                { 
-                    uint32_t aggr_attr_size = 0;
-                    void * aggr_attr_buff, * temp_aggr_buff, * temp_aggr_attr_buff;
-                    uint16_t new_attr_count = 0, new_attr_len = 0;
-
-                    START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-                    MPI_Gatherv (fd->buffer, pg_size, MPI_BYTE
-                                ,aggr_buff, pg_sizes, disp, MPI_BYTE
-                                ,0, md->g_comm1);
-                    STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-
-                    for (i= 0; i < new_group_size; i++)
-                    {
-                        aggr_attr_size += *(uint32_t *)(aggr_buff
-                                                       + disp[i]
-                                                       + pg_sizes[i]
-                                                       - SHIM_FOOTER_SIZE
-                                                       );
-                    }
-
-                    aggr_attr_buff = malloc (aggr_attr_size);
-                    if (aggr_attr_buff == 0)
-                    {
-                        adios_error (err_no_memory, "MPI_AMR method (AG): Cannot allocate "
-                                "%llu bytes for aggregation attribute buffer.\n"
-                                "Need to increase the number of aggregators.\n",
-                                aggr_attr_size);
-                        return;
-                    }
-
-                    temp_aggr_buff = aggr_buff
-                                   + pg_sizes[0]
-                                   - SHIM_FOOTER_SIZE
-                                   - attr_size;
-                    temp_aggr_attr_buff = aggr_attr_buff;
-
-                    for (i= 0; i < new_group_size; i++)
-                    {
-                        uint32_t temp_attr_size = *(uint32_t *)(aggr_buff
-                                                               + disp[i]
-                                                               + pg_sizes[i]
-                                                               - SHIM_FOOTER_SIZE
-                                                               );
-                        void * temp_attr_ptr = aggr_buff + disp[i] + pg_sizes[i] 
-                                             - SHIM_FOOTER_SIZE - temp_attr_size;
-
-                        new_attr_count += *(uint16_t *)temp_attr_ptr;
-
-                        if (i == 0)
-                        {
-                            new_attr_len += *(uint64_t *)(temp_attr_ptr + ATTR_COUNT_SIZE);
-
-                            memcpy (temp_aggr_attr_buff, temp_attr_ptr, temp_attr_size);
-                            temp_aggr_attr_buff += temp_attr_size;
-                        }
-                        else
-                        {
-                            new_attr_len += *(uint64_t *)(temp_attr_ptr + ATTR_COUNT_SIZE)
-                                          - ATTR_COUNT_SIZE - ATTR_LEN_SIZE;
-
-                            memcpy (temp_aggr_attr_buff
-                                   ,temp_attr_ptr + ATTR_COUNT_SIZE + ATTR_LEN_SIZE
-                                   ,temp_attr_size - ATTR_COUNT_SIZE - ATTR_LEN_SIZE
-                                   );
-                            temp_aggr_attr_buff += temp_attr_size - ATTR_COUNT_SIZE - ATTR_LEN_SIZE;
-
-                            memmove (temp_aggr_buff
-                                    ,aggr_buff + disp[i]
-                                    ,pg_sizes[i] - temp_attr_size - SHIM_FOOTER_SIZE
-                                    );
-                            temp_aggr_buff += pg_sizes[i] - temp_attr_size - SHIM_FOOTER_SIZE;
-                        }
-                    }
-
-                    memcpy (temp_aggr_buff, aggr_attr_buff, aggr_attr_size);
-
-                    *(uint16_t *)temp_aggr_buff = new_attr_count;  //attrs count
-                    *(uint64_t *)(temp_aggr_buff + ATTR_COUNT_SIZE) = new_attr_len;  //attrs length
-
-                    free (aggr_attr_buff);
-                }
-                else
-                {
-                    START_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-                    MPI_Gatherv (fd->buffer + header_size, pg_size, MPI_BYTE
-                                ,aggr_buff, pg_sizes, disp, MPI_BYTE
-                                ,0, md->g_comm1);
-                    STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
-                }
-
-                if (is_aggregator(md->rank))
-                {
-#if 0
-                    uint64_t count = 0;
-                    pthread_join (t, NULL);
-          
-                    write_thread_data.fh = &md->fh;
-                    write_thread_data.base_offset = &fd->base_offset;
-                    write_thread_data.aggr_buff = aggr_buff;
-                    write_thread_data.total_data_size = &total_data_size;
- 
-                    pthread_create (&t, NULL
-                                   ,adios_mpi_amr_do_write_thread
-                                   ,(void *) &write_thread_data
-                                   );
-#endif
-
-#if 0 
-                    count = adios_mpi_amr_striping_unit_write(
-                               md->fh
-                              ,fd->base_offset
-                              ,aggr_buff
-                              ,total_data_size
-                              ,md->block_unit);
-
-                    if (count != total_data_size)
-                    {
-                        adios_error (err_unspecified, 
-                                     "Error in adios_mpi_amr_striping_unit_write()\n");
-                        return;
-                    }
-
-                    free (aggr_buff);
-#endif
-                }
-                else
-                {
-                }
             }
 
             // build index appending to any existing index
@@ -3190,50 +2988,6 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
                 free (disp);
             }
 
-            if (fd->shared_buffer == adios_flag_yes && md->g_merging_pgs)
-            {
-                if (!is_aggregator(md->rank))
-                {
-                    uint64_t var_offset_to_add = 0, attr_offset_to_add = 0;
-                    uint64_t var_base_offset = 0, attr_base_offset = 0; 
-
-                    // change to relative offset
-                    if (md->index->vars_root)
-                    {
-                        var_base_offset = md->index->vars_root->characteristics [0].offset;
-                    }
-
-                    if (md->index->attrs_root)
-                    { 
-                        attr_base_offset = md->index->attrs_root->characteristics [0].offset;
-                    }
-
-                    adios_mpi_amr_subtract_offset (var_base_offset
-                                                   ,attr_base_offset
-                                                   ,md->index
-                                                   );
-
-                    for (i = 0; i < new_group_size; i++)
-                    {
-                        attr_offset_to_add += pg_sizes[i] - attr_sizes[i];  
-                    }
-
-                    for (i = 0; i < new_rank; i++)
-                    {
-                        attr_offset_to_add += attr_sizes[i] - SHIM_FOOTER_SIZE;  
-                        var_offset_to_add += pg_sizes[i] - attr_sizes[i]; 
-                    }
-
-                    adios_mpi_amr_add_offset (0, var_offset_to_add, 
-                                              attr_offset_to_add, md->index);
-                }
-
-                // pg_sizes, attr_sizs, disp are no longer needed from this point on.
-                free (pg_sizes);
-                free (attr_sizes);
-                free (disp);
-            }
-
             // if collective, gather the indexes from the rest and call
             if (md->group_comm != MPI_COMM_NULL)
             {
@@ -3278,9 +3032,7 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         adios_parse_attributes_index_v1 (&md->b
                                                         ,&new_attrs_root
@@ -3289,7 +3041,7 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
                             new_pg_root = 0;
 
                         adios_merge_index_v1 (md->index, new_pg_root, 
-                                              new_vars_root, new_attrs_root);
+                                              new_vars_root, new_attrs_root, 0);
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
@@ -3440,16 +3192,17 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         adios_parse_attributes_index_v1 (&md->b
                                                         ,&new_attrs_root
                                                         );
 
+                        // global index would become unsorted on main aggregator during merging 
+                        // so sort timesteps if appending
                         adios_merge_index_v1 (md->index, new_pg_root, 
-                                              new_vars_root, new_attrs_root);
+                                              new_vars_root, new_attrs_root, 
+                                              (fd->mode == adios_mode_append));
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
@@ -3502,15 +3255,6 @@ void adios_mpi_amr_ag_close (struct adios_file_struct * fd
                 uint64_t global_index_start = 0;
                 uint16_t flag = 0;
 
-                if (fd->mode == adios_mode_append)
-                {
-                    double t=MPI_Wtime();
-                    // global index become unsorted on main aggregator during merging 
-                    adios_sort_index_v1 (&md->index->pg_root
-                            ,&md->index->vars_root ,&md->index->attrs_root);
-                    log_warn ("Index sorting time = %g sec\n", MPI_Wtime()-t);
-                }
-
                 adios_write_index_v1 (&global_index_buffer, &global_index_buffer_size
                                      ,&global_index_buffer_offset, global_index_start
                                      ,md->index
diff --git a/src/write/adios_mpi_bgq.c b/src/write/adios_mpi_bgq.c
index a5ef425..9cdd39f 100644
--- a/src/write/adios_mpi_bgq.c
+++ b/src/write/adios_mpi_bgq.c
@@ -29,6 +29,11 @@
 #include "core/util.h"
 #include "core/adios_logger.h"
 
+#if defined ADIOS_TIMERS || defined ADIOS_TIMER_EVENTS
+#   include "core/adios_timing.h"
+#endif
+
+
 enum ADIOS_MPI_BGQ_IO_TYPE
 {
     ADIOS_MPI_BGQ_IO_NONE   = 0,
@@ -56,6 +61,18 @@ static int adios_mpi_bgq_initialized = 0;
 // that concerns large runs. Q. Liu, 10/19/2014
 #define BLOCK_UNIT     1
 
+#if defined ADIOS_TIMERS || defined ADIOS_TIMER_EVENTS
+#   define START_TIMER(t) adios_timing_go (fd->group->timing_obj, (t) ) 
+#else
+#   define START_TIMER(t) ; 
+#endif
+
+#if defined ADIOS_TIMERS || defined ADIOS_TIMER_EVENTS
+#   define STOP_TIMER(t) adios_timing_stop (fd->group->timing_obj, (t) )
+#else
+#   define STOP_TIMER(t) ;
+#endif
+
 struct adios_MPI_data_struct
 {
     MPI_File fh;
@@ -356,6 +373,7 @@ struct adios_var_struct * adios_mpi_bgq_copy_var (struct adios_var_struct * v)
     v_new->stats = 0;
     v_new->free_data = v->free_data;
     v_new->data = 0;
+    v_new->adata = 0;
     v_new->data_size = v->data_size;
     v_new->next = 0;
 
@@ -609,6 +627,17 @@ void adios_mpi_bgq_init (const PairStruct * parameters
     adios_buffer_struct_init (&md->b);
 }
 
+#if defined ADIOS_TIMERS || defined ADIOS_TIMER_EVENTS
+// Indices for the timer object
+static int ADIOS_TIMER_MPI_BGQ_COMM = ADIOS_TIMING_MAX_USER_TIMERS + 0;
+static int ADIOS_TIMER_MPI_BGQ_IO = ADIOS_TIMING_MAX_USER_TIMERS + 1;
+static int ADIOS_TIMER_MPI_BGQ_MD = ADIOS_TIMING_MAX_USER_TIMERS + 2;
+static int ADIOS_TIMER_MPI_BGQ_AD_OPEN = ADIOS_TIMING_MAX_USER_TIMERS + 3;
+static int ADIOS_TIMER_MPI_BGQ_AD_SHOULD_BUFFER = ADIOS_TIMING_MAX_USER_TIMERS + 4;
+static int ADIOS_TIMER_MPI_BGQ_AD_WRITE = ADIOS_TIMING_MAX_USER_TIMERS + 4;
+static int ADIOS_TIMER_MPI_BGQ_AD_CLOSE = ADIOS_TIMING_MAX_USER_TIMERS + 6;
+#endif
+
 int adios_mpi_bgq_open (struct adios_file_struct * fd
                        ,struct adios_method_struct * method, MPI_Comm comm
                        )
@@ -623,6 +652,32 @@ int adios_mpi_bgq_open (struct adios_file_struct * fd
         MPI_Comm_size (md->group_comm, &md->size);
     }
 
+#if defined ADIOS_TIMERS || defined ADIOS_TIMER_EVENTS
+    int timer_count = 7;
+    char ** timer_names = (char**) malloc (timer_count * sizeof (char*) );
+    timer_names [0] = "Communication";
+    timer_names [1] = "I/O";
+    timer_names [2] = "Metadata";
+    timer_names [3] = "ad_open";
+    timer_names [4] = "ad_should_buffer";
+    timer_names [5] = "ad_write";
+    timer_names [6] = "ad_close";
+
+    // Ensure both timing objects exist
+    // timing_obj should get created at every open
+    // prev_timing_obj should only be created at the first open
+    if (fd->group)
+    {
+        if (!fd->group->timing_obj)
+            fd->group->timing_obj = adios_timing_create (timer_count, timer_names);
+
+        if (!fd->group->prev_timing_obj)
+            fd->group->prev_timing_obj = adios_timing_create (timer_count, timer_names);
+    }
+#endif
+
+    START_TIMER (ADIOS_TIMER_MPI_BGQ_AD_OPEN);
+
     // The following code is BGQ specific
 #define UNIT_A 2
 #define UNIT_B 2
@@ -682,6 +737,7 @@ int adios_mpi_bgq_open (struct adios_file_struct * fd
     // to calculate stripe sizes from output sizes of the processes
     // before we can do an open for any of the modes
 
+    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_AD_OPEN);
     return 1;
 }
 
@@ -728,6 +784,8 @@ enum ADIOS_FLAG adios_mpi_bgq_should_buffer (struct adios_file_struct * fd
     int sig;    // used for coordinating the MPI_File_open
     uint16_t flag;
 
+    START_TIMER (ADIOS_TIMER_MPI_BGQ_AD_SHOULD_BUFFER);
+
     name = malloc (strlen (method->base_path) + strlen (fd->name) + 1);
     sprintf (name, "%s%s", method->base_path, fd->name);
 
@@ -935,25 +993,27 @@ enum ADIOS_FLAG adios_mpi_bgq_should_buffer (struct adios_file_struct * fd
         adios_shared_buffer_free (&md->b);
     }
 
+    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_AD_SHOULD_BUFFER);
 
     return fd->shared_buffer;
 }
 
 void adios_mpi_bgq_write (struct adios_file_struct * fd
                          ,struct adios_var_struct * v
-                         ,void * data
+                         ,const void * data
                          ,struct adios_method_struct * method
                          )
 {
     struct adios_MPI_data_struct * md = (struct adios_MPI_data_struct *)
                                                       method->method_data;
+    START_TIMER (ADIOS_TIMER_MPI_BGQ_AD_WRITE);
     if (v->got_buffer == adios_flag_yes)
     {
         if (data != v->data)  // if the user didn't give back the same thing
         {
             if (v->free_data == adios_flag_yes)
             {
-                free (v->data);
+                free (v->adata);
                 adios_method_buffer_free (v->data_size);
             }
         }
@@ -968,6 +1028,7 @@ void adios_mpi_bgq_write (struct adios_file_struct * fd
     {
         log_warn ("The ADIOS buffer in the XML is not large enough for buffering.\n");
     }
+    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_AD_WRITE);
 }
 
 void adios_mpi_bgq_get_write_buffer (struct adios_file_struct * fd
@@ -986,10 +1047,10 @@ void adios_mpi_bgq_get_write_buffer (struct adios_file_struct * fd
         return;
     }
 
-    if (v->data && v->free_data)
+    if (v->adata && v->free_data)
     {
         adios_method_buffer_free (v->data_size);
-        free (v->data);
+        free (v->adata);
     }
 
     mem_allowed = adios_method_buffer_alloc (*size);
@@ -1035,7 +1096,7 @@ void adios_mpi_bgq_read (struct adios_file_struct * fd
                     ,struct adios_method_struct * method
                     )
 {
-    v->data = buffer;
+    v->data = v->adata = buffer;
     v->data_size = buffer_size;
 }
 
@@ -1058,6 +1119,7 @@ static void adios_mpi_bgq_do_read (struct adios_file_struct * fd
     {
         case 1:
         case 2:
+        case 3:
         {
             // the three section headers
             struct adios_process_group_header_struct_v1 pg_header;
@@ -1105,7 +1167,7 @@ static void adios_mpi_bgq_do_read (struct adios_file_struct * fd
 
                 if (v1)
                 {
-                    var_payload.payload = v1->data;
+                    var_payload.payload = v1->adata;
                     adios_parse_var_data_payload_v1 (&md->b, &var_header
                                                     ,&var_payload
                                                     ,v1->data_size
@@ -1178,6 +1240,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
     struct adios_index_var_struct_v1 * new_vars_root = 0;
     struct adios_index_attribute_struct_v1 * new_attrs_root = 0;
 
+    START_TIMER (ADIOS_TIMER_MPI_BGQ_AD_CLOSE);
     switch (fd->mode)
     {
         case adios_mode_read:
@@ -1200,7 +1263,9 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
             int i, max_data_size = 0, total_data_size = 0, total_data_size1 = 0;
             MPI_Comm new_comm2;
 
+            START_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
             MPI_Comm_split (md->group_comm, md->file_comm_rank, md->rank, &new_comm2);
+            STOP_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
 
             if (fd->shared_buffer == adios_flag_yes)
             {    
@@ -1229,6 +1294,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                             fd->base_offset - fd->pg_start_in_file + fd->bytes_written);
                 }    
 
+                START_TIMER (ADIOS_TIMER_MPI_BGQ_IO);
                 while (bytes_written < fd->bytes_written)
                 {
                     // everyone writes their data
@@ -1264,10 +1330,13 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                         }
                     }
                 }
+                STOP_TIMER (ADIOS_TIMER_MPI_BGQ_IO);
             }
 
             // build index appending to any existing index
+            START_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
             adios_build_index_v1 (fd, md->index);
+            STOP_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
 
             // if collective, gather the indexes from the rest and call
             if (md->group_comm != MPI_COMM_NULL)
@@ -1282,10 +1351,12 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                     uint32_t size = 0, total_size = 0;
                     int i;
 
+                    START_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
                     MPI_Gather (&size, 1, MPI_INT
                                ,index_sizes, 1, MPI_INT
                                ,0, md->file_comm
                                );
+                    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
 
                     for (i = 0; i < md->file_comm_size; i++)
                     {
@@ -1296,31 +1367,32 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                     recv_buffer = malloc (total_size);
                     assert (recv_buffer);
 
+                    START_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
                     MPI_Gatherv (&size, 0, MPI_BYTE
                                 ,recv_buffer, index_sizes, index_offsets
                                 ,MPI_BYTE, 0, md->file_comm
                                 );
+                    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
 
                     char * buffer_save = md->b.buff;
                     uint64_t buffer_size_save = md->b.length;
                     uint64_t offset_save = md->b.offset;
 
+                    START_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                     for (i = 1; i < md->file_comm_size; i++)
                     {
                         md->b.buff = recv_buffer + index_offsets [i];
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         adios_parse_attributes_index_v1 (&md->b
                                                         ,&new_attrs_root
                                                         );
 
                         adios_merge_index_v1 (md->index, new_pg_root,
-                                              new_vars_root ,new_attrs_root);
+                                              new_vars_root ,new_attrs_root,0);
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
@@ -1333,14 +1405,18 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                     free (recv_buffer);
                     free (index_sizes);
                     free (index_offsets);
+                    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                 }
                 else
                 {
+                    START_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                     adios_write_index_v1 (&buffer, &buffer_size, &buffer_offset
                                          ,0, md->index);
+                    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
 
                     uint32_t temp_buffer_size = buffer_offset;
 
+                    START_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
 /*
                     MPI_Gather ((uint32_t *)&buffer_size, 1, MPI_INT, 0, 0, MPI_INT
                                ,0, md->file_comm
@@ -1359,6 +1435,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                                 ,0, 0, 0, MPI_BYTE
                                 ,0, md->file_comm
                                 );
+                    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
                 }
             }
 
@@ -1369,6 +1446,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                 uint32_t flag = 0;
                 int err;
 
+                START_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                 index_start = md->b.pg_index_offset;;
 
                 adios_write_index_v1 (&buffer, &buffer_size
@@ -1421,6 +1499,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                             "of %llu bytes to file %s failed: '%s'\n",
                             md->rank, buffer_offset, fd->name, e);
                 }
+                STOP_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
             }
 
             if (md->g_have_mdf)
@@ -1435,10 +1514,12 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                         char * recv_buffer = 0;
                         uint32_t size = 0, total_size = 0;
 
+                        START_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
                         MPI_Gather (&size, 1, MPI_INT
                                    ,index_sizes, 1, MPI_INT
                                    ,0, new_comm2
                                    );
+                        STOP_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
 
                         for (i = 0; i < md->n_partitions; i++)
                         {
@@ -1449,24 +1530,25 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                         recv_buffer = malloc (total_size);
                         assert (recv_buffer);
 
+                        START_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
                         MPI_Gatherv (&size, 0, MPI_BYTE
                                     ,recv_buffer, index_sizes, index_offsets
                                     ,MPI_BYTE, 0, new_comm2
                                     );
+                        STOP_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
 
                         char * buffer_save = md->b.buff;
                         uint64_t buffer_size_save = md->b.length;
                         uint64_t offset_save = md->b.offset;
 
+                        START_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                         for (i = 1; i < md->n_partitions; i++)
                         {
                             md->b.buff = recv_buffer + index_offsets [i];
                             md->b.length = index_sizes [i];
                             md->b.offset = 0;
 
-                            adios_parse_process_group_index_v1 (&md->b
-                                                               ,&new_pg_root
-                                                               );
+                            adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                             adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                             adios_parse_attributes_index_v1 (&md->b
                                                             ,&new_attrs_root
@@ -1474,7 +1556,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
 
                             adios_merge_index_v1 (md->index
                                                  ,new_pg_root, new_vars_root
-                                                 ,new_attrs_root
+                                                 ,new_attrs_root, 0
                                                  );
                             new_pg_root = 0;
                             new_vars_root = 0;
@@ -1488,6 +1570,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                         free (recv_buffer);
                         free (index_sizes);
                         free (index_offsets);
+                        STOP_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                     }
                     else
                     {
@@ -1495,11 +1578,14 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                         uint64_t buffer_size2 = 0;
                         uint64_t buffer_offset2 = 0;
 
+                        START_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                         adios_write_index_v1 (&buffer2, &buffer_size2, &buffer_offset2
                                              ,0, md->index
                                              );
+                        STOP_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                         uint32_t temp_buffer_size2 = buffer_offset2;
 
+                        START_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
 /*
                         MPI_Gather (&buffer_size2, 1, MPI_INT
                                    ,0, 0, MPI_INT
@@ -1518,6 +1604,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                                     ,0, 0, 0, MPI_BYTE
                                     ,0, new_comm2
                                     );
+                        STOP_TIMER (ADIOS_TIMER_MPI_BGQ_COMM);
 
                         if (buffer2)
                         {
@@ -1539,6 +1626,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                     uint64_t global_index_start = 0;
                     uint16_t flag = 0;
 
+                    START_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                     adios_write_index_v1 (&global_index_buffer, &global_index_buffer_size
                                          ,&global_index_buffer_offset, global_index_start
                                          ,md->index
@@ -1566,6 +1654,7 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
                         global_index_buffer_size = 0;
                         global_index_buffer_offset = 0;
                     }
+                    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_MD);
                 }
             }
 
@@ -1606,6 +1695,20 @@ void adios_mpi_bgq_simple_close (struct adios_file_struct * fd
     md->req = 0;
     memset (&md->status, 0, sizeof (MPI_Status));
 
+    STOP_TIMER (ADIOS_TIMER_MPI_BGQ_AD_CLOSE);
+
+#if defined ADIOS_TIMERS || defined ADIOS_TIMER_EVENTS
+
+    //Finished timing this cycle, swap the timing buffers
+    adios_timing_destroy(fd->group->prev_timing_obj);
+    fd->group->prev_timing_obj = fd->group->timing_obj;
+    fd->group->timing_obj = 0;
+
+    // prev_timing_obj points to unwritten timing info, timing_obj is
+    // ready to allocate at the next open
+
+#endif
+
     return;
 }
 
@@ -1869,9 +1972,7 @@ void adios_mpi_bgq_bg_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         adios_parse_attributes_index_v1 (&md->b
                                                         ,&new_attrs_root
@@ -1879,7 +1980,7 @@ void adios_mpi_bgq_bg_close (struct adios_file_struct * fd
 
                         adios_merge_index_v1 (md->index
                                              ,new_pg_root, new_vars_root
-                                             ,new_attrs_root
+                                             ,new_attrs_root, 0
                                              );
                         new_pg_root = 0;
                         new_vars_root = 0;
@@ -1987,9 +2088,7 @@ void adios_mpi_bgq_bg_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         adios_parse_attributes_index_v1 (&md->b
                                                         ,&new_attrs_root
@@ -1997,7 +2096,7 @@ void adios_mpi_bgq_bg_close (struct adios_file_struct * fd
 
                         adios_merge_index_v1 (md->index
                                              ,new_pg_root, new_vars_root
-                                             ,new_attrs_root
+                                             ,new_attrs_root, 0
                                              );
                         new_pg_root = 0;
                         new_vars_root = 0;
@@ -2484,9 +2583,7 @@ void adios_mpi_bgq_ag_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         adios_parse_attributes_index_v1 (&md->b
                                                         ,&new_attrs_root
@@ -2494,7 +2591,7 @@ void adios_mpi_bgq_ag_close (struct adios_file_struct * fd
 
                         adios_merge_index_v1 (md->index
                                              ,new_pg_root, new_vars_root
-                                             ,new_attrs_root
+                                             ,new_attrs_root, 0
                                              );
                         new_pg_root = 0;
                         new_vars_root = 0;
@@ -2613,9 +2710,7 @@ void adios_mpi_bgq_ag_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         adios_parse_attributes_index_v1 (&md->b
                                                         ,&new_attrs_root
@@ -2623,7 +2718,7 @@ void adios_mpi_bgq_ag_close (struct adios_file_struct * fd
 
                         adios_merge_index_v1 (md->index
                                              ,new_pg_root, new_vars_root
-                                             ,new_attrs_root
+                                             ,new_attrs_root, 0
                                              );
                         new_pg_root = 0;
                         new_vars_root = 0;
diff --git a/src/write/adios_mpi_lustre.c b/src/write/adios_mpi_lustre.c
index 3b048d9..cbb5fa1 100644
--- a/src/write/adios_mpi_lustre.c
+++ b/src/write/adios_mpi_lustre.c
@@ -426,7 +426,7 @@ adios_mpi_lustre_get_striping_unit(MPI_File fh, char *filename)
 static uint64_t
 adios_mpi_lustre_striping_unit_write(MPI_File    fh,
                               MPI_Offset  offset,
-                              void        *buf,
+                              const void *buf,
                               uint64_t    len,
                               uint64_t    block_unit 
                               )
@@ -444,7 +444,7 @@ adios_mpi_lustre_striping_unit_write(MPI_File    fh,
     if (block_unit > 0) {
         MPI_Offset  rem_off = offset;
         uint64_t    rem_size = len;
-        char       *buf_ptr = buf;
+        const char       *buf_ptr = buf;
 
         err = 0;
         while (rem_size > 0) {
@@ -455,7 +455,7 @@ adios_mpi_lustre_striping_unit_write(MPI_File    fh,
 #ifdef _WKL_CHECK_STRIPE_IO
 printf("adios_mpi_lustre_striping_unit_write offset=%12lld len=%12d\n",offset,write_len);offset+=write_len;
 #endif
-            MPI_File_write (fh, buf_ptr, write_len, MPI_BYTE, &status);
+            MPI_File_write (fh, (char*)buf_ptr, write_len, MPI_BYTE, &status);
             MPI_Get_count(&status, MPI_BYTE, &ret_len);
             if (ret_len < 0) {err = ret_len; break;}
             err += ret_len;
@@ -470,11 +470,11 @@ printf("adios_mpi_lustre_striping_unit_write offset=%12lld len=%12d\n",offset,wr
         uint64_t to_write = len;
         int write_len = 0;
         int count;
-        char * buf_ptr = buf;
+        const char * buf_ptr = buf;
         while (total_written < len)
         {
             write_len = (to_write > MAX_MPIWRITE_SIZE) ? MAX_MPIWRITE_SIZE : to_write;
-            MPI_File_write (fh, buf_ptr, write_len, MPI_BYTE, &status);
+            MPI_File_write (fh, (char*)buf_ptr, write_len, MPI_BYTE, &status);
             MPI_Get_count(&status, MPI_BYTE, &count);
             if (count != write_len)
             {
@@ -695,7 +695,7 @@ enum ADIOS_FLAG adios_mpi_lustre_should_buffer (struct adios_file_struct * fd
                 MPI_File_read (md->fh, md->b.buff, md->b.pg_size, MPI_BYTE
                               ,&md->status
                               );
-                adios_parse_process_group_index_v1 (&md->b, &md->index->pg_root);
+                adios_parse_process_group_index_v1 (&md->b, &md->index->pg_root, &md->index->pg_tail);
 
 #if 1
                 adios_init_buffer_read_vars_index (&md->b);
@@ -1026,7 +1026,25 @@ enum ADIOS_FLAG adios_mpi_lustre_should_buffer (struct adios_file_struct * fd
                     MPI_File_read (md->fh, md->b.buff, md->b.pg_size, MPI_BYTE
                                   ,&md->status
                                   );
-                    adios_parse_process_group_index_v1 (&md->b ,&md->index->pg_root);
+                    adios_parse_process_group_index_v1 (&md->b ,&md->index->pg_root, &md->index->pg_tail);
+                    // find the largest time index so we can append properly
+                    struct adios_index_process_group_struct_v1 * p;
+                    uint32_t max_time_index = 0;
+                    p = md->index->pg_root;
+                    while (p)
+                    {
+                        if (p->time_index > max_time_index)
+                            max_time_index = p->time_index;
+                        p = p->next;
+                    }
+                    if (fd->mode == adios_mode_append) {
+                        ++max_time_index;
+                    }
+                    fd->group->time_index = max_time_index;
+                    MPI_Bcast (&fd->group->time_index, 1, MPI_INT, 0
+                              ,md->group_comm
+                              );
+
 
                     adios_init_buffer_read_vars_index (&md->b);
                     MPI_File_seek (md->fh, md->b.vars_index_offset
@@ -1058,6 +1076,9 @@ enum ADIOS_FLAG adios_mpi_lustre_should_buffer (struct adios_file_struct * fd
                 {
                     fd->base_offset = 0;
                     fd->pg_start_in_file = 0;
+                    MPI_Bcast (&fd->group->time_index, 1, MPI_INT, 0
+                              ,md->group_comm
+                              );
                 }
 
                 MPI_File_close (&md->fh);
@@ -1300,7 +1321,7 @@ enum ADIOS_FLAG adios_mpi_lustre_should_buffer (struct adios_file_struct * fd
 
 void adios_mpi_lustre_write (struct adios_file_struct * fd
                      ,struct adios_var_struct * v
-                     ,void * data
+                     ,const void * data
                      ,struct adios_method_struct * method
                      )
 {
@@ -1316,7 +1337,7 @@ void adios_mpi_lustre_write (struct adios_file_struct * fd
         {
             if (v->free_data == adios_flag_yes)
             {
-                free (v->data);
+                free (v->adata);
                 adios_method_buffer_free (v->data_size);
             }
         }
@@ -1406,10 +1427,10 @@ void adios_mpi_lustre_get_write_buffer (struct adios_file_struct * fd
         return;
     }
 
-    if (v->data && v->free_data)
+    if (v->adata && v->free_data)
     {
         adios_method_buffer_free (v->data_size);
-        free (v->data);
+        free (v->adata);
     }
 
     mem_allowed = adios_method_buffer_alloc (*size);
@@ -1456,7 +1477,7 @@ void adios_mpi_lustre_read (struct adios_file_struct * fd
                     ,struct adios_method_struct * method
                     )
 {
-    v->data = buffer;
+    v->data = v->adata = buffer;
     v->data_size = buffer_size;
 }
 
@@ -1520,7 +1541,7 @@ static void adios_mpi_lustre_do_read (struct adios_file_struct * fd
 
                 if (v1)
                 {
-                    var_payload.payload = v1->data;
+                    var_payload.payload = v1->adata;
                     adios_parse_var_data_payload_v1 (&md->b, &var_header
                                                     ,&var_payload
                                                     ,v1->data_size
@@ -1588,7 +1609,7 @@ void adios_mpi_lustre_close (struct adios_file_struct * fd
             struct adios_var_struct * v = fd->group->vars;
             while (v)
             {
-                v->data = 0;
+                v->data = v->adata = 0;
                 v = v->next;
             }
 
@@ -1756,9 +1777,7 @@ void adios_mpi_lustre_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         // do not merge attributes from other processes from 1.4
                         /*
@@ -1767,7 +1786,7 @@ void adios_mpi_lustre_close (struct adios_file_struct * fd
                                                         );
                          */
                         adios_merge_index_v1 (md->index, new_pg_root, 
-                                              new_vars_root, new_attrs_root);
+                                              new_vars_root, new_attrs_root, 0);
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
@@ -2008,9 +2027,7 @@ void adios_mpi_lustre_close (struct adios_file_struct * fd
                         md->b.length = index_sizes [i];
                         md->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&md->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&md->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&md->b, &new_vars_root, NULL, NULL);
                         // do not merge attributes from other processes from 1.4
                         /*
@@ -2019,7 +2036,7 @@ void adios_mpi_lustre_close (struct adios_file_struct * fd
                                                         );
                          */
                         adios_merge_index_v1 (md->index, new_pg_root, 
-                                              new_vars_root, new_attrs_root);
+                                              new_vars_root, new_attrs_root, 0);
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
diff --git a/src/write/adios_nc4.c b/src/write/adios_nc4.c
index d15b7c4..9c97966 100644
--- a/src/write/adios_nc4.c
+++ b/src/write/adios_nc4.c
@@ -290,7 +290,7 @@ static void parse_dimension_size(
             }
         }
     } else {
-        if (dim->time_index == adios_flag_yes) {
+        if (dim->is_time_index == adios_flag_yes) {
             *dimsize = NC_UNLIMITED;
             *dimsize = 1;
         } else {
@@ -318,7 +318,7 @@ static void parse_dimension_name(
             sprintf(dimname, "%s_dim", dim->attr->var->name);
         }
     } else {
-        if (dim->time_index == adios_flag_yes) {
+        if (dim->is_time_index == adios_flag_yes) {
             sprintf(dimname, "%s_dim", group->time_index_name);
         } else {
             if (dim->rank > 0) {
@@ -526,7 +526,7 @@ static int decipher_dims(
 
     dims=pvar->dimensions;
     while (dims) {
-        if ((dims->dimension.time_index == adios_flag_yes) &&
+        if ((dims->dimension.is_time_index == adios_flag_yes) &&
             (dims->dimension.var == NULL && dims->dimension.attr == NULL)) {
             has_timedim = adios_flag_yes;
             timedim_index = local_dim_count;
@@ -549,9 +549,9 @@ static int decipher_dims(
             has_localoffsets=adios_flag_yes;
             local_offset_count++;
         }
-        if (DEBUG>3) printf("gdims[%d].rank=%llu; var=%d, attr=%d, time_index=%d\n", i, dims->global_dimension.rank, dims->global_dimension.var, dims->global_dimension.attr, dims->global_dimension.time_index);
-        if (DEBUG>3) printf("ldims[%d].rank=%llu; var=%d, attr=%d, time_index=%d\n", i, dims->dimension.rank, dims->dimension.var, dims->dimension.attr, dims->dimension.time_index);
-        if (DEBUG>3) printf("loffs[%d].rank=%llu; var=%d, attr=%d, time_index=%d\n", i, dims->local_offset.rank, dims->local_offset.var, dims->local_offset.attr, dims->local_offset.time_index);
+        if (DEBUG>3) printf("gdims[%d].rank=%llu; var=%d, attr=%d, is_time_index=%d\n", i, dims->global_dimension.rank, dims->global_dimension.var, dims->global_dimension.attr, dims->global_dimension.is_time_index);
+        if (DEBUG>3) printf("ldims[%d].rank=%llu; var=%d, attr=%d, is_time_index=%d\n", i, dims->dimension.rank, dims->dimension.var, dims->dimension.attr, dims->dimension.is_time_index);
+        if (DEBUG>3) printf("loffs[%d].rank=%llu; var=%d, attr=%d, is_time_index=%d\n", i, dims->local_offset.rank, dims->local_offset.var, dims->local_offset.attr, dims->local_offset.is_time_index);
         i++;
         dims = dims->next;
     }
@@ -581,8 +581,8 @@ static int decipher_dims(
         parse_dimension_name(group, pvar_root, patt_root, &dims->global_dimension, dimname);
         //ncd_gen_name(nc4_global_dimnames[i], pvar->path, dimname);
         ncd_gen_name(nc4_global_dimnames[i], "", dimname);
-        if (DEBUG>3) printf("global_dimension[%d]->name==%s, ->rank==%llu, ->var==%d, ->attr==%d, time_index==%d\n",
-                i, nc4_global_dimnames[i], dims->global_dimension.rank, dims->global_dimension.var, dims->global_dimension.attr, dims->global_dimension.time_index);
+        if (DEBUG>3) printf("global_dimension[%d]->name==%s, ->rank==%llu, ->var==%d, ->attr==%d, is_time_index==%d\n",
+                i, nc4_global_dimnames[i], dims->global_dimension.rank, dims->global_dimension.var, dims->global_dimension.attr, dims->global_dimension.is_time_index);
         if (dims) {
             dims = dims -> next;
         }
@@ -592,8 +592,8 @@ static int decipher_dims(
         parse_dimension_name(group, pvar_root, patt_root, &dims->dimension, dimname);
         //ncd_gen_name(nc4_local_dimnames[i], pvar->path, dimname);
         ncd_gen_name(nc4_local_dimnames[i], "", dimname);
-        if (DEBUG>3) printf("local_dimension[%d]->name ==%s, ->rank==%llu, ->var==%d, ->attr==%d, time_index==%d\n",
-                i, nc4_local_dimnames[i], dims->dimension.rank, dims->dimension.var, dims->dimension.attr, dims->dimension.time_index);
+        if (DEBUG>3) printf("local_dimension[%d]->name ==%s, ->rank==%llu, ->var==%d, ->attr==%d, is_time_index==%d\n",
+                i, nc4_local_dimnames[i], dims->dimension.rank, dims->dimension.var, dims->dimension.attr, dims->dimension.is_time_index);
         if (dims) {
             dims = dims -> next;
         }
@@ -603,8 +603,8 @@ static int decipher_dims(
         parse_dimension_name(group, pvar_root, patt_root, &dims->local_offset, dimname);
         //ncd_gen_name(nc4_local_offset_names[i], pvar->path, dimname);
         ncd_gen_name(nc4_local_offset_names[i], "", dimname);
-        if (DEBUG>3) printf("local_offset[%d]->name    ==%s, ->rank==%llu, ->var==%d, ->attr==%d, time_index==%d\n",
-                i, nc4_local_offset_names[i], dims->local_offset.rank, dims->local_offset.var, dims->local_offset.attr, dims->local_offset.time_index);
+        if (DEBUG>3) printf("local_offset[%d]->name    ==%s, ->rank==%llu, ->var==%d, ->attr==%d, is_time_index==%d\n",
+                i, nc4_local_offset_names[i], dims->local_offset.rank, dims->local_offset.var, dims->local_offset.attr, dims->local_offset.is_time_index);
         if (dims) {
             dims = dims -> next;
         }
@@ -1585,7 +1585,7 @@ void adios_nc4_close(
         struct adios_var_struct * v = fd->group->vars;
         while (v)
         {
-            v->data = 0;
+            v->data = v->adata = 0;
             v = v->next;
         }
 
diff --git a/src/write/adios_nssi.c b/src/write/adios_nssi.c
index 94023c1..7840a37 100644
--- a/src/write/adios_nssi.c
+++ b/src/write/adios_nssi.c
@@ -1558,7 +1558,7 @@ void adios_nssi_close(
         struct adios_var_struct * v = f->group->vars;
         while (v)
         {
-            v->data = 0;
+            v->data = v->adata = 0;
             v = v->next;
         }
 
diff --git a/src/write/adios_phdf5.c b/src/write/adios_phdf5.c
index 425ff40..70ea2a1 100644
--- a/src/write/adios_phdf5.c
+++ b/src/write/adios_phdf5.c
@@ -62,7 +62,7 @@ void adios_phdf5_close (struct adios_file_struct * fd
                      ){}
 void adios_phdf5_write (struct adios_file_struct * fd
                        ,struct adios_var_struct * v
-                       ,void * data
+                       ,const void * data
                        ,struct adios_method_struct * method
                        ){}
 void adios_phdf5_read (struct adios_file_struct * fd
@@ -215,7 +215,7 @@ int adios_phdf5_open(struct adios_file_struct *fd
 
 void adios_phdf5_write (struct adios_file_struct * fd
                        ,struct adios_var_struct * v
-                       ,void * data
+                       ,const void * data
                        ,struct adios_method_struct * method
                        )
 {
@@ -253,7 +253,7 @@ void adios_phdf5_read (struct adios_file_struct * fd
                                                        method->method_data;
     if(fd->mode == adios_mode_read)
     {
-       v->data = buffer;
+       v->adata = buffer;
        v->data_size = buffersize;
        
        if (md->rank==0) {
@@ -267,7 +267,7 @@ void adios_phdf5_read (struct adios_file_struct * fd
               ,fd->group->adios_host_language_fortran
               ,md->rank
               ,md->size);
-       v->data = 0;
+       v->adata = 0;
        if (md->rank==0) {
            fprintf(stderr, "read var: %s! end\n", v->name);
            //fprintf(stderr, "-------------------------\n");
@@ -523,7 +523,7 @@ int hr_var (hid_t root_id
         h5_dataset_id = H5Dopen (grp_ids[level], pvar->name);
         if ( h5_dataset_id > 0) {
             H5Dread (h5_dataset_id, h5_type_id, H5S_ALL
-                          ,H5S_ALL, h5_plist_id, pvar->data
+                          ,H5S_ALL, h5_plist_id, pvar->adata
                           );
             H5Dclose (h5_dataset_id);
             err_code = 0;
@@ -588,7 +588,7 @@ int hr_var (hid_t root_id
 
         for (i=0;i<rank;i++) {
             if(myrank==0) 
-                printf("\tDIMS var:%s dim[%d]:  %d %d %d\n",pvar->name
+                printf("\tDIMS var:%s dim[%d]:  %llu %llu %llu\n",pvar->name
                          ,i, h5_globaldims[i], h5_localdims[i], h5_offsets[i]);
         }
         H5Sclose(h5_dataspace_id); 
@@ -609,7 +609,7 @@ int hr_var (hid_t root_id
                 h5_dataset_id  = H5Dopen ( grp_ids[level], pvar->name);
                 if (h5_dataset_id > 0) {
                     H5Dread (h5_dataset_id, h5_type_id, h5_memspace_id
-                            ,h5_dataspace_id, h5_plist_id, pvar->data
+                            ,h5_dataspace_id, h5_plist_id, pvar->adata
                             );
                     H5Dclose (h5_dataset_id);
                     err_code = 0;
@@ -646,7 +646,7 @@ int hr_var (hid_t root_id
             h5_dataset_id  = H5Dopen ( grp_ids[level], pvar->name);
             if ( h5_dataset_id > 0) {
                 H5Dread (h5_dataset_id, h5_type_id, H5S_ALL
-                        ,H5S_ALL, h5_plist_id, pvar->data
+                        ,H5S_ALL, h5_plist_id, pvar->adata
                         );
                 H5Dclose (h5_dataset_id);
                 err_code = 0;
@@ -774,7 +774,7 @@ int hw_var (hid_t root_id
              if (dims)
                  dims = dims -> next;
              if (debug && myrank==0) {
-                 printf("\t%s[%d]: g(%d):l(%d):o(%d)\n"
+                 printf("\t%s[%d]: g(%llu):l(%llu):o(%llu)\n"
                        ,pvar->name,i
                        ,h5_globaldims[i]
                        ,h5_localdims[i]
@@ -808,7 +808,7 @@ int hw_var (hid_t root_id
           
         h5_dataspace_id = H5Screate_simple (rank, h5_globaldims, NULL);
         if ( h5_dataspace_id < 0 && rank ==2) { 
-            fprintf (stderr, "PHDF5 ERROR: cannot create dataspace for var: %s %d %d %d\n"\
+            fprintf (stderr, "PHDF5 ERROR: cannot create dataspace for var: %s %d %llu %llu\n"\
                     ,pvar->name, rank, h5_globaldims[0], h5_globaldims[1]);
             return -1; 
          } 
@@ -853,7 +853,7 @@ int hw_var (hid_t root_id
         int  srank, dimindex = 0;
         for ( i = 0; i < rank; i++) {
             h5_localdims [i] = parse_dimension(pvar_root, patt_root, &dims->dimension);
-            if ( dims->dimension.time_index == adios_flag_yes) {
+            if ( dims->dimension.is_time_index == adios_flag_yes) {
                   is_timeindex = adios_flag_yes;
                   dimindex = i;
             }
@@ -887,7 +887,7 @@ int hw_var (hid_t root_id
                 h5_memspace_id = H5Screate_simple (rank, h5_localdims, NULL);
                 //H5Sset_extent_simple (h5_dataspace_id, rank, h5_globaldims, NULL);
                 //H5Sget_simple_extent_dims (h5_dataspace_id, h5_offsets, h5_globaldims);
-                fprintf(stderr, "var %s has time index %d %d \n"
+                fprintf(stderr, "var %s has time index %llu %llu \n"
                        ,pvar->name, h5_offsets[1], h5_globaldims[1]); 
             }
             else {
@@ -1191,7 +1191,7 @@ hsize_t parse_dimension(struct adios_var_struct *pvar_root,
         }
     }
     else {
-        if (dim->time_index == adios_flag_yes)
+        if (dim->is_time_index == adios_flag_yes)
             dimsize = 1;
         else
             dimsize = dim->rank;
diff --git a/src/write/adios_posix.c b/src/write/adios_posix.c
index 5794ff9..ae4ef9f 100644
--- a/src/write/adios_posix.c
+++ b/src/write/adios_posix.c
@@ -64,6 +64,7 @@ struct adios_POSIX_data_struct
     int rank;
     int size;
 #endif
+    int g_have_mdf;
 };
 
 
@@ -90,6 +91,7 @@ void adios_posix_init (const PairStruct * parameters
     p->rank = 0;
     p->size = 0;
 #endif
+    p->g_have_mdf = 1;
 }
 
 
@@ -114,6 +116,28 @@ int adios_posix_open (struct adios_file_struct * fd
     struct adios_POSIX_data_struct * p = (struct adios_POSIX_data_struct *)
                                                           method->method_data;
 
+    char *temp_string, *m_size;
+
+    temp_string = (char *) malloc (strlen (method->parameters) + 1);
+    strcpy (temp_string, method->parameters);
+    trim_spaces (temp_string);
+
+    if ( (m_size = strstr (temp_string, "have_metadata_file")) )
+    {
+        char * m = strchr (m_size, '=');
+        char * n = strtok (m, ";");
+
+        if (!n)
+            p->g_have_mdf = atoi (n + 1);
+        else
+            p->g_have_mdf = atoi (m + 1);
+    }
+    else
+    {
+        // by default, write metadata file. 
+        p->g_have_mdf = 1;
+    }
+
 #if defined ADIOS_TIMERS || defined ADIOS_TIMER_EVENTS
     int timer_count = 7;
     char ** timer_names = (char**) malloc (timer_count * sizeof (char*) );
@@ -276,7 +300,7 @@ START_TIMER (ADIOS_TIMER_POSIX_AD_OPEN);
 
 #ifdef HAVE_MPI
             // open metadata file
-            if (p->group_comm != MPI_COMM_SELF)
+            if (p->group_comm != MPI_COMM_SELF && p->g_have_mdf)
             {
                 if (p->rank == 0)
                 {
@@ -397,12 +421,13 @@ START_TIMER (ADIOS_TIMER_POSIX_AD_OPEN);
                 {
                     case 1:
                     case 2:
+                    case 3:
                         // read the old stuff and set the base offset
                         adios_posix_read_index_offsets (&p->b);
                         adios_parse_index_offsets_v1 (&p->b);
 
                         adios_posix_read_process_group_index (&p->b);
-                        adios_parse_process_group_index_v1 (&p->b, &p->index->pg_root);
+                        adios_parse_process_group_index_v1 (&p->b, &p->index->pg_root, &p->index->pg_tail);
 
                         // find the largest time index so we can append properly
                         struct adios_index_process_group_struct_v1 * pg;
@@ -414,7 +439,10 @@ START_TIMER (ADIOS_TIMER_POSIX_AD_OPEN);
                                 max_time_index = pg->time_index;
                             pg = pg->next;
                         }
-                        fd->group->time_index = ++max_time_index;
+                        if (fd->mode == adios_mode_append) {
+                            ++max_time_index;
+                        }
+                        fd->group->time_index = max_time_index;
 
                         adios_posix_read_vars_index (&p->b);
                         adios_parse_vars_index_v1 (&p->b, &p->index->vars_root, 
@@ -491,9 +519,10 @@ enum ADIOS_FLAG adios_posix_should_buffer (struct adios_file_struct * fd
         if (s != fd->bytes_written)
         {
             fprintf (stderr, "POSIX method tried to write %llu, "
-                             "only wrote %lld\n"
+                             "only wrote %lld. %s:%d\n"
                     ,fd->bytes_written
                     ,(int64_t)s
+                    ,__func__, __LINE__
                     );
         }
         fd->base_offset += s;
@@ -519,7 +548,7 @@ enum ADIOS_FLAG adios_posix_should_buffer (struct adios_file_struct * fd
 
 void adios_posix_write (struct adios_file_struct * fd
                        ,struct adios_var_struct * v
-                       ,void * data
+                       ,const void * data
                        ,struct adios_method_struct * method
                        )
 {
@@ -534,7 +563,7 @@ void adios_posix_write (struct adios_file_struct * fd
         {
             if (v->free_data == adios_flag_yes)
             {
-                free (v->data);
+                free (v->adata);
                 adios_method_buffer_free (v->data_size);
             }
         }
@@ -555,9 +584,10 @@ void adios_posix_write (struct adios_file_struct * fd
         if (s != fd->bytes_written)
         {
             fprintf (stderr, "POSIX method tried to write %llu, "
-                             "only wrote %lld\n"
+                             "only wrote %lld. %s:%d\n"
                     ,fd->bytes_written
                     ,(int64_t)s
+                    ,__func__, __LINE__
                     );
         }
         fd->base_offset += s;
@@ -608,9 +638,10 @@ void adios_posix_write (struct adios_file_struct * fd
         if (s != var_size)
         {
             fprintf (stderr, "POSIX method tried to write %llu, "
-                             "only wrote %lld\n"
+                             "only wrote %lld. %s:%d\n"
                     ,var_size
                     ,(int64_t)s
+                    ,__func__, __LINE__
                     );
         }
         fd->base_offset += s;
@@ -638,10 +669,10 @@ void adios_posix_get_write_buffer (struct adios_file_struct * fd
         return;
     }
 
-    if (v->data && v->free_data)
+    if (v->adata && v->free_data)
     {
         adios_method_buffer_free (v->data_size);
-        free (v->data);
+        free (v->adata);
     }
 
     mem_allowed = adios_method_buffer_alloc (*size);
@@ -689,7 +720,7 @@ void adios_posix_read (struct adios_file_struct * fd
                       ,struct adios_method_struct * method
                       )
 {
-    v->data = buffer;
+    v->data = v->adata = buffer;
     v->data_size = buffer_size;
 }
 
@@ -765,6 +796,7 @@ static void adios_posix_do_read (struct adios_file_struct * fd
     {
         case 1:
         case 2:
+        case 3:
         {
             struct adios_index_struct_v1 * index = adios_alloc_index_v1(0); // no hashtables
             struct adios_index_process_group_struct_v1 * pg_root = index->pg_root;
@@ -774,7 +806,7 @@ static void adios_posix_do_read (struct adios_file_struct * fd
             adios_parse_index_offsets_v1 (&p->b);
 
             adios_posix_read_process_group_index (&p->b);
-            adios_parse_process_group_index_v1 (&p->b, &pg_root);
+            adios_parse_process_group_index_v1 (&p->b, &pg_root, NULL);
 #if 1
             adios_posix_read_vars_index (&p->b);
             adios_parse_vars_index_v1 (&p->b, &index->vars_root, NULL, NULL);
@@ -837,7 +869,7 @@ static void adios_posix_do_read (struct adios_file_struct * fd
 
                 if (v1)
                 {
-                    var_payload.payload = v1->data;
+                    var_payload.payload = v1->adata;
                     adios_parse_var_data_payload_v1 (&p->b, &var_header
                                                     ,&var_payload
                                                     ,v1->data_size
@@ -910,9 +942,10 @@ void adios_posix_close (struct adios_file_struct * fd
                 if (s != fd->vars_start)
                 {
                     fprintf (stderr, "POSIX method tried to write %llu, "
-                                     "only wrote %lld\n"
+                                     "only wrote %lld. %s:%d\n"
                             ,fd->vars_start
                             ,(int64_t)s
+                            ,__func__, __LINE__
                             );
                 }
                 fd->offset = 0;
@@ -941,9 +974,10 @@ void adios_posix_close (struct adios_file_struct * fd
                         if (s != fd->bytes_written)
                         {
                             fprintf (stderr, "POSIX method tried to write %llu, "
-                                    "only wrote %lld\n"
+                                    "only wrote %lld. %s:%d\n"
                                     ,fd->bytes_written
                                     ,(int64_t)s
+                                    ,__func__, __LINE__
                                     );
                         }
                         fd->base_offset += s;
@@ -968,9 +1002,10 @@ void adios_posix_close (struct adios_file_struct * fd
                 if (s != p->vars_header_size)
                 {
                     fprintf (stderr, "POSIX method tried to write %llu, "
-                                     "only wrote %lld\n"
+                                     "only wrote %lld. %s:%d\n"
                             ,p->vars_header_size
                             ,(int64_t)s
+                            ,__func__, __LINE__
                             );
                 }
                 fd->offset = 0;
@@ -994,7 +1029,7 @@ void adios_posix_close (struct adios_file_struct * fd
             adios_posix_do_write (fd, method, buffer, buffer_offset); // Buffered vars written here
             STOP_TIMER (ADIOS_TIMER_POSIX_IO);
 #ifdef HAVE_MPI
-            if (p->group_comm != MPI_COMM_SELF)
+            if (p->group_comm != MPI_COMM_SELF && p->g_have_mdf)
             {
                 if (p->rank == 0)
                 {
@@ -1035,9 +1070,7 @@ void adios_posix_close (struct adios_file_struct * fd
                         p->b.length = index_sizes [i];
                         p->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&p->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&p->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&p->b, &new_vars_root, NULL, NULL);
                         // do not merge attributes from other processes from 1.4
                         /*
@@ -1047,7 +1080,7 @@ void adios_posix_close (struct adios_file_struct * fd
                         */
 
                         adios_merge_index_v1 (p->index, new_pg_root, 
-                                              new_vars_root, new_attrs_root);
+                                              new_vars_root, new_attrs_root, 0);
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
@@ -1084,13 +1117,15 @@ void adios_posix_close (struct adios_file_struct * fd
                     if (s != global_index_buffer_offset)
                     {
                         fprintf (stderr, "POSIX method tried to write %llu, "
-                                         "only wrote %lld\n"
+                                         "only wrote %lld. %s:%d\n"
                                          ,fd->bytes_written
                                          ,(int64_t)s
+                                         ,__func__, __LINE__
                                 );
                     }
 
                     close (p->mf);
+                    free (global_index_buffer);
                 }
                 else
                 {
@@ -1135,9 +1170,10 @@ void adios_posix_close (struct adios_file_struct * fd
                 if (s != fd->vars_start)
                 {
                     fprintf (stderr, "POSIX method tried to write %llu, "
-                                     "only wrote %lld\n"
+                                     "only wrote %lld. %s:%d\n"
                             ,fd->vars_start
                             ,(int64_t)s
+                            ,__func__, __LINE__
                             );
                 }
                 fd->offset = 0;
@@ -1163,9 +1199,10 @@ void adios_posix_close (struct adios_file_struct * fd
                         if (s != fd->bytes_written)
                         {
                             fprintf (stderr, "POSIX method tried to write %llu, "
-                                    "only wrote %lld\n"
+                                    "only wrote %lld. %s:%d\n"
                                     ,fd->bytes_written
                                     ,(int64_t)s
+                                    ,__func__, __LINE__
                                     );
                         }
                         fd->base_offset += s;
@@ -1190,9 +1227,10 @@ void adios_posix_close (struct adios_file_struct * fd
                 if (s != p->vars_header_size)
                 {
                     fprintf (stderr, "POSIX method tried to write %llu, "
-                                     "only wrote %lld\n"
+                                     "only wrote %lld. %s:%d\n"
                             ,p->vars_header_size
                             ,(int64_t)s
+                            ,__func__, __LINE__
                             );
                 }
                 fd->offset = 0;
@@ -1209,7 +1247,7 @@ void adios_posix_close (struct adios_file_struct * fd
             adios_write_index_v1 (&buffer, &buffer_size, &buffer_offset
                                  ,index_start, p->index);
 #ifdef HAVE_MPI
-            if (p->group_comm != MPI_COMM_SELF)
+            if (p->group_comm != MPI_COMM_SELF && p->g_have_mdf)
             {
                 if (p->rank == 0)
                 {
@@ -1251,9 +1289,7 @@ void adios_posix_close (struct adios_file_struct * fd
                         p->b.length = index_sizes [i];
                         p->b.offset = 0;
 
-                        adios_parse_process_group_index_v1 (&p->b
-                                                           ,&new_pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&p->b, &new_pg_root, NULL);
                         adios_parse_vars_index_v1 (&p->b, &new_vars_root, NULL, NULL);
                         // do not merge attributes from other processes from 1.4
                         /*
@@ -1262,19 +1298,16 @@ void adios_posix_close (struct adios_file_struct * fd
                                                         );
                          */
 
-                        adios_merge_index_v1 (p->index,new_pg_root, 
-                                              new_vars_root, new_attrs_root);
+                        // global index would become unsorted on main aggregator during merging 
+                        // so sort timesteps in this case (appending)
+                        adios_merge_index_v1 (p->index, new_pg_root, 
+                                              new_vars_root, new_attrs_root, 1);
                     
                         new_pg_root = 0;
                         new_vars_root = 0;
                         new_attrs_root = 0;
                     }
 
-                    adios_sort_index_v1 (&p->index->pg_root
-                                        ,&p->index->vars_root
-                                        ,&p->index->attrs_root
-                                        );
-
                     p->b.buff = buffer_save;
                     p->b.length = buffer_size_save;
                     p->b.offset = offset_save;
@@ -1307,9 +1340,10 @@ void adios_posix_close (struct adios_file_struct * fd
                     if (s != global_index_buffer_offset)
                     {
                         fprintf (stderr, "POSIX method tried to write %llu, "
-                                         "only wrote %lld, Mode: a\n"
+                                         "only wrote %lld, Mode: a. %s:%d\n"
                                          ,global_index_buffer_offset
                                          ,(int64_t)s
+                                         ,__func__, __LINE__
                                 );
                     }
 
@@ -1350,7 +1384,7 @@ void adios_posix_close (struct adios_file_struct * fd
             struct adios_var_struct * v = fd->group->vars;
             while (v)
             {
-                v->data = 0;
+                v->data = v->adata = 0;
                 v = v->next;
             }
 
diff --git a/src/write/adios_posix1.c b/src/write/adios_posix1.c
index a505d32..8d30a1b 100644
--- a/src/write/adios_posix1.c
+++ b/src/write/adios_posix1.c
@@ -169,14 +169,13 @@ int adios_posix1_open (struct adios_file_struct * fd
                 {
                     case 1:
                     case 2:
+                    case 3:
                         // read the old stuff and set the base offset
                         adios_posix_read_index_offsets (&p->b);
                         adios_parse_index_offsets_v1 (&p->b);
 
                         adios_posix_read_process_group_index (&p->b);
-                        adios_parse_process_group_index_v1 (&p->b
-                                                           ,&p->index->pg_root
-                                                           );
+                        adios_parse_process_group_index_v1 (&p->b, &p->index->pg_root, &p->index->pg_tail);
 
                         // find the largest time index so we can append properly
                         struct adios_index_process_group_struct_v1 * pg;
@@ -188,7 +187,10 @@ int adios_posix1_open (struct adios_file_struct * fd
                                 max_time_index = pg->time_index;
                             pg = pg->next;
                         }
-                        fd->group->time_index = ++max_time_index;
+                        if (fd->mode == adios_mode_append) {
+                            ++max_time_index;
+                        }
+                        fd->group->time_index = max_time_index;
 
                         adios_posix_read_vars_index (&p->b);
                         adios_parse_vars_index_v1 (&p->b, &p->index->vars_root, 
@@ -277,7 +279,7 @@ enum ADIOS_FLAG adios_posix1_should_buffer (struct adios_file_struct * fd
 
 void adios_posix1_write (struct adios_file_struct * fd
                        ,struct adios_var_struct * v
-                       ,void * data
+                       ,const void * data
                        ,struct adios_method_struct * method
                        )
 {
@@ -290,7 +292,7 @@ void adios_posix1_write (struct adios_file_struct * fd
         {
             if (v->free_data == adios_flag_yes)
             {
-                free (v->data);
+                free (v->adata);
                 adios_method_buffer_free (v->data_size);
             }
         }
@@ -386,10 +388,10 @@ void adios_posix1_get_write_buffer (struct adios_file_struct * fd
         return;
     }
 
-    if (v->data && v->free_data)
+    if (v->adata && v->free_data)
     {
         adios_method_buffer_free (v->data_size);
-        free (v->data);
+        free (v->adata);
     }
 
     mem_allowed = adios_method_buffer_alloc (*size);
@@ -437,7 +439,7 @@ void adios_posix1_read (struct adios_file_struct * fd
                       ,struct adios_method_struct * method
                       )
 {
-    v->data = buffer;
+    v->data = v->adata = buffer;
     v->data_size = buffer_size;
 }
 
@@ -512,6 +514,7 @@ static void adios_posix1_do_read (struct adios_file_struct * fd
     {
         case 1:
         case 2:
+        case 3:
         {
             struct adios_index_struct_v1 * index = adios_alloc_index_v1(0); // no hashtables
             struct adios_index_process_group_struct_v1 * pg_root = index->pg_root;
@@ -521,7 +524,7 @@ static void adios_posix1_do_read (struct adios_file_struct * fd
             adios_parse_index_offsets_v1 (&p->b);
 
             adios_posix_read_process_group_index (&p->b);
-            adios_parse_process_group_index_v1 (&p->b, &pg_root);
+            adios_parse_process_group_index_v1 (&p->b, &pg_root, NULL);
 #if 1
             adios_posix_read_vars_index (&p->b);
             adios_parse_vars_index_v1 (&p->b, &index->vars_root, NULL, NULL);
@@ -584,7 +587,7 @@ static void adios_posix1_do_read (struct adios_file_struct * fd
 
                 if (v1)
                 {
-                    var_payload.payload = v1->data;
+                    var_payload.payload = v1->adata;
                     adios_parse_var_data_payload_v1 (&p->b, &var_header
                                                     ,&var_payload
                                                     ,v1->data_size
@@ -832,7 +835,7 @@ void adios_posix1_close (struct adios_file_struct * fd
             struct adios_var_struct * v = fd->group->vars;
             while (v)
             {
-                v->data = 0;
+                v->data = v->adata = 0;
                 v = v->next;
             }
 
diff --git a/src/write/adios_var_merge.c b/src/write/adios_var_merge.c
index 3320718..37f9b7c 100644
--- a/src/write/adios_var_merge.c
+++ b/src/write/adios_var_merge.c
@@ -46,7 +46,7 @@ static int *proc_map;
 static int *sequence;
 
 static void aggr_chunks(char **output, int *procs, int ndims, uint64_t *ldims_list, uint64_t *gdims, uint64_t *size_list, uint64_t totalsize, int nchunks, int rank, int level, int type_size);
-static uint64_t do_spatial_aggr(int level, int *procs, int ndims, uint64_t *ldims, uint64_t *offsets, char *new_ldims, int rank,  void *data, uint64_t varsize, void *output, int type_size, MPI_Comm comm);
+static uint64_t do_spatial_aggr(int level, int *procs, int ndims, uint64_t *ldims, uint64_t *offsets, char *new_ldims, int rank,  const void *data, uint64_t varsize, void *output, int type_size, MPI_Comm comm);
 
 
 //store the info of the client processes for spatial aggregation
@@ -105,7 +105,7 @@ struct aggr_client *aggr1d_clients[2]; //fixed to maximum of 2 level of aggregat
 
 static uint64_t cast_var_data_as_uint64 (const char * parent_name
                                         ,enum ADIOS_DATATYPES type
-                                        ,void * data
+                                        ,const void * data
                                         )
 {
     if (!data)
@@ -119,37 +119,37 @@ static uint64_t cast_var_data_as_uint64 (const char * parent_name
     switch (type)
     {
         case adios_byte:
-            return (uint64_t) *(int8_t *) data;
+            return (uint64_t) *(const int8_t *) data;
 
         case adios_short:
-            return (uint64_t) *(int16_t *) data;
+            return (uint64_t) *(const int16_t *) data;
 
         case adios_integer:
-            return (uint64_t) *(int32_t *) data;
+            return (uint64_t) *(const int32_t *) data;
 
         case adios_long:
-            return (uint64_t) *(int64_t *) data;
+            return (uint64_t) *(const int64_t *) data;
 
         case adios_unsigned_byte:
-            return (uint64_t) *(uint8_t *) data;
+            return (uint64_t) *(const uint8_t *) data;
 
         case adios_unsigned_short:
-            return (uint64_t) *(uint16_t *) data;
+            return (uint64_t) *(const uint16_t *) data;
 
         case adios_unsigned_integer:
-            return (uint64_t) *(uint32_t *) data;
+            return (uint64_t) *(const uint32_t *) data;
 
         case adios_unsigned_long:
-            return (uint64_t) *(uint64_t *) data;
+            return (uint64_t) *(const uint64_t *) data;
 
         case adios_real:
-            return (uint64_t) *(float *) data;
+            return (uint64_t) *(const float *) data;
 
         case adios_double:
-            return (uint64_t) *(double *) data;
+            return (uint64_t) *(const double *) data;
 
         case adios_long_double:
-            return (uint64_t) *(long double *) data;
+            return (uint64_t) *(const long double *) data;
 
         case adios_string:
         case adios_complex:
@@ -204,7 +204,7 @@ static uint64_t get_value_for_dim (struct adios_dimension_item_struct * dimensio
     }
     else
     {
-        if (dimension->time_index == adios_flag_yes)
+        if (dimension->is_time_index == adios_flag_yes)
             dim = 1;
         else
             dim = dimension->rank;
@@ -972,7 +972,7 @@ static struct aggr_var_struct *allocate_vars(int varcnt, struct aggr_var_struct
 
 void adios_var_merge_write (struct adios_file_struct * fd
                      ,struct adios_var_struct * v
-                     ,void * data
+                     ,const void * data
                      ,struct adios_method_struct * method
                      )
 
@@ -1323,7 +1323,7 @@ static void cal_gdims(int ndims, uint64_t *p_offsets, uint64_t *offsets, uint64_
     }
 }
 
-static uint64_t do_spatial_aggr(int level, int *procs, int ndims, uint64_t *ldims, uint64_t *offsets, char *new_ldims, int rank,  void *data, uint64_t varsize, void *output, int type_size, MPI_Comm comm)
+static uint64_t do_spatial_aggr(int level, int *procs, int ndims, uint64_t *ldims, uint64_t *offsets, char *new_ldims, int rank,  const void *data, uint64_t varsize, void *output, int type_size, MPI_Comm comm)
 {
     //struct adios_var_struct * v = g->vars;
     int i, j, k, lev;
@@ -1467,7 +1467,7 @@ static uint64_t do_spatial_aggr(int level, int *procs, int ndims, uint64_t *ldim
 
             /*clients send out the data*/
             if(lev==0)
-                MPI_Send(data, varsize, MPI_BYTE, my_aggregator[ndims-1][lev], rank, comm);
+                MPI_Send((void*)data, varsize, MPI_BYTE, my_aggregator[ndims-1][lev], rank, comm);
             else
                 MPI_Send(tmpbuf, varsize, MPI_BYTE, my_aggregator[ndims-1][lev], rank, comm);
 
diff --git a/tests/C/CMakeLists.txt b/tests/C/CMakeLists.txt
index 4776b6f..acd0a00 100644
--- a/tests/C/CMakeLists.txt
+++ b/tests/C/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/tests/C)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${MXML_INCLUDE_DIR}/../lib)
 
diff --git a/tests/C/Makefile.am b/tests/C/Makefile.am
index bcd3f16..7fdb6ef 100644
--- a/tests/C/Makefile.am
+++ b/tests/C/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 SUBDIRS=flexpath_tests fgr_tests query
 
diff --git a/tests/C/Makefile.in b/tests/C/Makefile.in
index f08a844..3d58d2c 100644
--- a/tests/C/Makefile.in
+++ b/tests/C/Makefile.in
@@ -344,6 +344,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -401,8 +404,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 SUBDIRS = flexpath_tests fgr_tests query
 AUTOMAKE_OPTIONS = no-dependencies
 adios_test_c_SOURCES = adios_test_c.c
diff --git a/tests/C/fgr_tests/CMakeLists.txt b/tests/C/fgr_tests/CMakeLists.txt
index dc52e4b..53f8096 100644
--- a/tests/C/fgr_tests/CMakeLists.txt
+++ b/tests/C/fgr_tests/CMakeLists.txt
@@ -1,5 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_SOURCE_DIR}/src)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${MXML_INCLUDE_DIR}/../lib)
diff --git a/tests/C/fgr_tests/Makefile.am b/tests/C/fgr_tests/Makefile.am
index 5354372..857738d 100644
--- a/tests/C/fgr_tests/Makefile.am
+++ b/tests/C/fgr_tests/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/C/fgr_tests/Makefile.in b/tests/C/fgr_tests/Makefile.in
index ebf2a93..e25905b 100644
--- a/tests/C/fgr_tests/Makefile.in
+++ b/tests/C/fgr_tests/Makefile.in
@@ -306,6 +306,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -363,8 +366,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 posix_fgr_SOURCES = posix_fgr.c
 posix_fgr_CPPFLAGS = $(ADIOSLIB_CPPFLAGS)
diff --git a/tests/C/flexpath_tests/1D_arr_global/CMakeLists.txt b/tests/C/flexpath_tests/1D_arr_global/CMakeLists.txt
index 2207a63..e00ef35 100644
--- a/tests/C/flexpath_tests/1D_arr_global/CMakeLists.txt
+++ b/tests/C/flexpath_tests/1D_arr_global/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/tests/C/flexpath_tests/include)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 
 add_executable(writer_global writer.c ../common/utils.c)
diff --git a/tests/C/flexpath_tests/1D_arr_global/Makefile.am b/tests/C/flexpath_tests/1D_arr_global/Makefile.am
index a7877b4..1e3faca 100644
--- a/tests/C/flexpath_tests/1D_arr_global/Makefile.am
+++ b/tests/C/flexpath_tests/1D_arr_global/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/C/flexpath_tests/1D_arr_global/Makefile.in b/tests/C/flexpath_tests/1D_arr_global/Makefile.in
index 29f7ec8..4238190 100644
--- a/tests/C/flexpath_tests/1D_arr_global/Makefile.in
+++ b/tests/C/flexpath_tests/1D_arr_global/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,9 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public \
+	-I$(srcdir)/../include
 AUTOMAKE_OPTIONS = no-dependencies
 writer_global_SOURCES = writer.c ../common/utils.c
 writer_global_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/tests/C/flexpath_tests/1D_arr_global_noxml/CMakeLists.txt b/tests/C/flexpath_tests/1D_arr_global_noxml/CMakeLists.txt
index 8c644f9..415fc22 100644
--- a/tests/C/flexpath_tests/1D_arr_global_noxml/CMakeLists.txt
+++ b/tests/C/flexpath_tests/1D_arr_global_noxml/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/tests/C/flexpath_tests/include)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_SOURCE_DIR}/src)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${MXML_INCLUDE_DIR}/../lib)
diff --git a/tests/C/flexpath_tests/1D_arr_global_noxml/Makefile.am b/tests/C/flexpath_tests/1D_arr_global_noxml/Makefile.am
index fd5d416..9992565 100644
--- a/tests/C/flexpath_tests/1D_arr_global_noxml/Makefile.am
+++ b/tests/C/flexpath_tests/1D_arr_global_noxml/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/C/flexpath_tests/1D_arr_global_noxml/Makefile.in b/tests/C/flexpath_tests/1D_arr_global_noxml/Makefile.in
index 8d87feb..49d24d6 100644
--- a/tests/C/flexpath_tests/1D_arr_global_noxml/Makefile.in
+++ b/tests/C/flexpath_tests/1D_arr_global_noxml/Makefile.in
@@ -316,6 +316,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -373,8 +376,9 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public \
+	-I$(srcdir)/../include
 AUTOMAKE_OPTIONS = no-dependencies
 writer_global_noxml_SOURCES = writer.c ../common/utils.c
 writer_global_noxml_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/tests/C/flexpath_tests/Makefile.in b/tests/C/flexpath_tests/Makefile.in
index 1b01bab..8101fcf 100644
--- a/tests/C/flexpath_tests/Makefile.in
+++ b/tests/C/flexpath_tests/Makefile.in
@@ -321,6 +321,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/tests/C/flexpath_tests/global_range_select/CMakeLists.txt b/tests/C/flexpath_tests/global_range_select/CMakeLists.txt
index 29450c6..86a2552 100644
--- a/tests/C/flexpath_tests/global_range_select/CMakeLists.txt
+++ b/tests/C/flexpath_tests/global_range_select/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/test/C/flexpath_tests/include)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_SOURCE_DIR}/src)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${MXML_INCLUDE_DIR}/../lib)
diff --git a/tests/C/flexpath_tests/global_range_select/Makefile.am b/tests/C/flexpath_tests/global_range_select/Makefile.am
index 6a6167c..dd70a4a 100644
--- a/tests/C/flexpath_tests/global_range_select/Makefile.am
+++ b/tests/C/flexpath_tests/global_range_select/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/C/flexpath_tests/global_range_select/Makefile.in b/tests/C/flexpath_tests/global_range_select/Makefile.in
index c54ee4e..b76c850 100644
--- a/tests/C/flexpath_tests/global_range_select/Makefile.in
+++ b/tests/C/flexpath_tests/global_range_select/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,9 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public \
+	-I$(srcdir)/../include
 AUTOMAKE_OPTIONS = no-dependencies
 arrays_write_SOURCES = arrays_write.c
 arrays_write_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/tests/C/flexpath_tests/maya_append/CMakeLists.txt b/tests/C/flexpath_tests/maya_append/CMakeLists.txt
index 143330b..0acc19a 100644
--- a/tests/C/flexpath_tests/maya_append/CMakeLists.txt
+++ b/tests/C/flexpath_tests/maya_append/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/tests/C/flexpath_tests/include)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_SOURCE_DIR}/src)
 link_directories(${PROJECT_BINARY_DIR}/src)
 #link_directories(${MXML_INCLUDE_DIR}/../lib)
diff --git a/tests/C/flexpath_tests/maya_append/Makefile.am b/tests/C/flexpath_tests/maya_append/Makefile.am
index 034c175..9a0bfa2 100644
--- a/tests/C/flexpath_tests/maya_append/Makefile.am
+++ b/tests/C/flexpath_tests/maya_append/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/C/flexpath_tests/maya_append/Makefile.in b/tests/C/flexpath_tests/maya_append/Makefile.in
index ab0bce3..9c4595a 100644
--- a/tests/C/flexpath_tests/maya_append/Makefile.in
+++ b/tests/C/flexpath_tests/maya_append/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,9 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public \
+	-I$(srcdir)/../include
 AUTOMAKE_OPTIONS = no-dependencies
 writer_maya_SOURCES = writer.c ../common/utils.c
 writer_maya_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/tests/C/flexpath_tests/maya_noxml/CMakeLists.txt b/tests/C/flexpath_tests/maya_noxml/CMakeLists.txt
index 7c9a995..d5e6d24 100644
--- a/tests/C/flexpath_tests/maya_noxml/CMakeLists.txt
+++ b/tests/C/flexpath_tests/maya_noxml/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/tests/C/flexpath_tests/include)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_SOURCE_DIR}/src)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${MXML_INCLUDE_DIR}/../lib)
diff --git a/tests/C/flexpath_tests/maya_noxml/Makefile.am b/tests/C/flexpath_tests/maya_noxml/Makefile.am
index e875bd3..500d07e 100644
--- a/tests/C/flexpath_tests/maya_noxml/Makefile.am
+++ b/tests/C/flexpath_tests/maya_noxml/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS += -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/C/flexpath_tests/maya_noxml/Makefile.in b/tests/C/flexpath_tests/maya_noxml/Makefile.in
index b647e28..544891c 100644
--- a/tests/C/flexpath_tests/maya_noxml/Makefile.in
+++ b/tests/C/flexpath_tests/maya_noxml/Makefile.in
@@ -315,6 +315,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -372,8 +375,9 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public \
+	-I$(srcdir)/../include
 AUTOMAKE_OPTIONS = no-dependencies
 writer_maya_noxml_SOURCES = writer.c ../common/utils.c
 writer_maya_noxml_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/tests/C/flexpath_tests/scalar/CMakeLists.txt b/tests/C/flexpath_tests/scalar/CMakeLists.txt
index c33201e..a4a2dfc 100644
--- a/tests/C/flexpath_tests/scalar/CMakeLists.txt
+++ b/tests/C/flexpath_tests/scalar/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/tests/C/flexpath_tests/include)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_SOURCE_DIR}/src)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${MXML_INCLUDE_DIR}/../lib)
diff --git a/tests/C/flexpath_tests/scalar/Makefile.am b/tests/C/flexpath_tests/scalar/Makefile.am
index f976ecf..8b383f1 100644
--- a/tests/C/flexpath_tests/scalar/Makefile.am
+++ b/tests/C/flexpath_tests/scalar/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS += -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../include
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/C/flexpath_tests/scalar/Makefile.in b/tests/C/flexpath_tests/scalar/Makefile.in
index dad98d1..ce4a704 100644
--- a/tests/C/flexpath_tests/scalar/Makefile.in
+++ b/tests/C/flexpath_tests/scalar/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,9 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public -I$(srcdir)/../include
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public \
+	-I$(srcdir)/../include
 AUTOMAKE_OPTIONS = no-dependencies
 writer_scalar_SOURCES = writer.c ../common/utils.c
 writer_scalar_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/tests/C/query/Makefile.in b/tests/C/query/Makefile.in
index bb00be3..24f18ab 100644
--- a/tests/C/query/Makefile.in
+++ b/tests/C/query/Makefile.in
@@ -323,6 +323,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/tests/C/query/alacrity/CMakeLists.txt b/tests/C/query/alacrity/CMakeLists.txt
index b747434..0d53e01 100644
--- a/tests/C/query/alacrity/CMakeLists.txt
+++ b/tests/C/query/alacrity/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${CMAKE_CURRENT_BINARY_DIR}../common)
 link_directories(${MXML_INCLUDE_DIR}/../lib)
diff --git a/tests/C/query/alacrity/Makefile.am b/tests/C/query/alacrity/Makefile.am
index 805d677..16340cb 100644
--- a/tests/C/query/alacrity/Makefile.am
+++ b/tests/C/query/alacrity/Makefile.am
@@ -1,6 +1,6 @@
 INCLUDES = $(all_includes)
 INCLUDES += $(ADIOSLIB_CPPFLAGS)
-INCLUDES += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../common/
+INCLUDES += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(srcdir)/../common/
 
 AUTOMAKE_OPTIONS = no-dependencies
 if HAVE_ALACRITY
diff --git a/tests/C/query/alacrity/Makefile.in b/tests/C/query/alacrity/Makefile.in
index faa2eec..45adf06 100644
--- a/tests/C/query/alacrity/Makefile.in
+++ b/tests/C/query/alacrity/Makefile.in
@@ -353,6 +353,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -410,7 +413,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-INCLUDES = $(all_includes) $(ADIOSLIB_CPPFLAGS) -I$(top_srcdir)/src \
+INCLUDES = $(all_includes) $(ADIOSLIB_CPPFLAGS) \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public -I$(srcdir)/../common/
 AUTOMAKE_OPTIONS = no-dependencies
 #alac_internal_test 
diff --git a/tests/C/query/common/CMakeLists.txt b/tests/C/query/common/CMakeLists.txt
index f8f7fa1..979e788 100644
--- a/tests/C/query/common/CMakeLists.txt
+++ b/tests/C/query/common/CMakeLists.txt
@@ -1,5 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${MXML_INCLUDE_DIR}/../lib)
 include_directories(${MXML_INCLUDE_DIR})
diff --git a/tests/C/query/common/Makefile.am b/tests/C/query/common/Makefile.am
index a657f25..19eaf36 100644
--- a/tests/C/query/common/Makefile.am
+++ b/tests/C/query/common/Makefile.am
@@ -1,6 +1,6 @@
 INCLUDES = $(all_includes)
 INCLUDES += $(ADIOSLIB_CPPFLAGS)
-INCLUDES += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+INCLUDES += -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/C/query/common/Makefile.in b/tests/C/query/common/Makefile.in
index 5f4e073..343388b 100644
--- a/tests/C/query/common/Makefile.in
+++ b/tests/C/query/common/Makefile.in
@@ -333,6 +333,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -390,7 +393,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-INCLUDES = $(all_includes) $(ADIOSLIB_CPPFLAGS) -I$(top_srcdir)/src \
+INCLUDES = $(all_includes) $(ADIOSLIB_CPPFLAGS) \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 noinst_LIBRARIES = libparse_test_query_xml.a
diff --git a/tests/C/query/fastbit/CMakeLists.txt b/tests/C/query/fastbit/CMakeLists.txt
index ef31d9b..c1db402 100644
--- a/tests/C/query/fastbit/CMakeLists.txt
+++ b/tests/C/query/fastbit/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${CMAKE_CURRENT_BINARY_DIR}../common)
 link_directories(${MXML_INCLUDE_DIR}/../lib)
diff --git a/tests/C/query/fastbit/Makefile.am b/tests/C/query/fastbit/Makefile.am
index 31d70fa..f8c8af2 100644
--- a/tests/C/query/fastbit/Makefile.am
+++ b/tests/C/query/fastbit/Makefile.am
@@ -3,7 +3,7 @@ INCLUDES = $(all_includes)
 # ${ADIOSREADLIB_CPPFLAGS} has all the flags like -DFASTBIT -DALACRITY
 # as well as related includes, so it is needed here
 # 
-INCLUDES += -I$(top_srcdir)/src/ -I$(top_srcdir)/src/public/ $(MXML_CPPFLAGS)
+INCLUDES += -I$(top_builddir)/src/public  -I$(top_srcdir)/src/ -I$(top_srcdir)/src/public/ $(MXML_CPPFLAGS)
 
 AUTOMAKE_OPTIONS = no-dependencies
 
@@ -21,4 +21,4 @@ fastbit_tests_LDADD = $(top_builddir)/src/libadiosread_nompi.a $(top_builddir)/s
 fastbit_tests_LDFLAGS = $(ADIOSREADLIB_LDFLAGS) ${MXML_LDFLAGS}
 
 endif # HAVE_FASTBIT
-CC=$(MPICC)
\ No newline at end of file
+CC=$(MPICC)
diff --git a/tests/C/query/fastbit/Makefile.in b/tests/C/query/fastbit/Makefile.in
index 0a8a243..ee2eae7 100644
--- a/tests/C/query/fastbit/Makefile.in
+++ b/tests/C/query/fastbit/Makefile.in
@@ -315,6 +315,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -376,8 +379,9 @@ top_srcdir = @top_srcdir@
 # ${ADIOSREADLIB_CPPFLAGS} has all the flags like -DFASTBIT -DALACRITY
 # as well as related includes, so it is needed here
 # 
-INCLUDES = $(all_includes) -I$(top_srcdir)/src/ \
-	-I$(top_srcdir)/src/public/ $(MXML_CPPFLAGS)
+INCLUDES = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src/ -I$(top_srcdir)/src/public/ \
+	$(MXML_CPPFLAGS)
 AUTOMAKE_OPTIONS = no-dependencies
 @HAVE_FASTBIT_TRUE at fastbit_tests_SOURCES = fastbit_tests.c
 @HAVE_FASTBIT_TRUE at fastbit_tests_CPPFLAGS = ${MACRODEFFLAG}_NOMPI 
diff --git a/tests/C/query/fastbit/fastbit_tests.c b/tests/C/query/fastbit/fastbit_tests.c
index 462c072..c8e60ef 100644
--- a/tests/C/query/fastbit/fastbit_tests.c
+++ b/tests/C/query/fastbit/fastbit_tests.c
@@ -42,20 +42,60 @@ long _stageRefreshMillis = 0;
 long _lastMeasuredMillis = 0;
 long _queryStartMillis = 0;
 
-void logReport(int stage) {
+#define  logTimeMillis(...) {	    \
+    long ms = fastbit_adios_getCurrentTimeMillis(); \
+    long d = ms - _lastMeasuredMillis; \
+    printf("   ELAPSED: %ld millis\t", d);	\
+    long sec = d/1000; \
+    if (sec > 0 ) 					\
+       printf(" = %d sec \t", d/1000);		\
+    long min = sec/60; \
+    if (min > 0) \
+        printf(" = %d min:%d sec ", min, (sec-min*60)); \
+    printf(", "); \
+    fprintf ( stdout, __VA_ARGS__);		\
+    fflush(stdout); \
+    printf("\n"); \
+    _lastMeasuredMillis = ms; \
+  }
+
+
+void logReport(int stage, ADIOS_QUERY* q) {
   long ms = fastbit_adios_getCurrentTimeMillis();
 
-  if (stage == -1) { // init                                                                                                                                             
+  if (stage == -1) { // init
       _lastMeasuredMillis = ms;
       _stageRefreshMillis = ms;
       _queryStartMillis   = ms;
-  } else if (stage == 0) { // query                                                                                                               
-      printf("\n==> Total time spent to process this query: %ld millis.\n", ms - _queryStartMillis);
+  } else if (stage == 0) { // query                                                                      
+    long m = ms-_queryStartMillis;
+    long s = m/1000;
+    long d = s/60;
+    if ((d == 0) && (s == 0)) {
+       printf("   [Total time] processing this query: %ld millis, query: %s\n", m, q->condition);
+    } else if (d == 0) {
+      printf("   [Total time] processing this query: %ld millis = %ld sec, query: %s\n", m, s, q->condition);
+    } else {
+      printf("   [Total time] processing this query: %ld millis = %ld min: %ld sec, query: %s\n", m, d, s-d*60, q->condition);
+    }
+  } else if (stage == 1) { // query                                                                      
+    long m = ms-_queryStartMillis;
+    long s = m/1000;
+    long d = s/60;
+    if ((d == 0) && (s == 0)) {
+       printf("   [Total time] getResultCoodinates this query: %ld millis, query: %s\n", m, q->condition);
+    } else if (d == 0) {
+      printf("   [Total time] getResultCoordinates this query: %ld millis = %ld sec, query: %s\n", m, s, q->condition);
+    } else {
+      printf("   [Total time] getResultCoordinates this query: %ld millis = %ld min: %ld sec, query: %s\n", m, d, s-d*60, q->condition);
+    }
   }
-}
 
+}
 
-void logTimeMillis(const char* notes)
+/*
+//void logTimeMillis(const char* notes)
+void logTimeMillis(__VA_ARGS__)
 {
   long ms = fastbit_adios_getCurrentTimeMillis();
 
@@ -64,11 +104,14 @@ void logTimeMillis(const char* notes)
     _stageRefreshMillis = ms;
   } else {
     long d = ms - _lastMeasuredMillis;
-    printf("   ELAPSED millis: %ld \t%s\n", d, notes);
+    //printf("   ELAPSED millis: %ld \t%s\n", d, notes);
+    printf("   ELAPSED millis: %ld \t", d);
+    printf(__VA_ARGS__);
+    printf("\n");
   }
   _lastMeasuredMillis = ms;
 }
-
+*/
 
 static int getTotalByteSize (ADIOS_FILE* f, ADIOS_VARINFO* v, ADIOS_SELECTION* sel,
                              uint64_t* total_byte_size, uint64_t* dataSize, int timestep)
@@ -377,28 +420,48 @@ double getCurrentValue(void* data, uint64_t idx, enum ADIOS_DATATYPES type)
   return 0;
 }
 
-void manualCheck(ADIOS_QUERY* q, int timestep) {
+void manualCheck(ADIOS_QUERY* q, int timestep, int64_t compareHits) {
   if ((q->left == NULL) && (q->right == NULL)) {    
       printf ("... manual check: \n");
+
       // proceed
       uint64_t totalByteSize;
       uint64_t totalSize;
       
       getTotalByteSize(q->file, q->varinfo, q->sel, &totalByteSize, &totalSize, timestep);
-      
+            
       void* output = malloc (totalByteSize);
 
+      if (output == NULL) {
+	logTimeMillis(" unable to allocate memory for %ld bytes/ skip. \n", totalByteSize);
+	return;
+      }
       adios_schedule_read (q->file, q->sel, q->varName, timestep, 1, output);
       adios_perform_reads (q->file, 1);
 
+      logTimeMillis("    adios reading data out from query: %s, variablesize: %ld\n", q->condition, totalSize);
       uint64_t hits=0;
       uint64_t k=0; 
 
       char* endptr;
       double vv = strtod(q->predicateValue, &endptr);
+      
+      //double min, max;
 
       for (k=0; k<totalSize; k++) {
 	double curr = getCurrentValue(output, k, q->varinfo->type);
+	/*
+	if (k==0) {
+	  min=curr; max=curr;
+	} else {
+	  if (curr < min) {
+	    min = curr;
+	  } else if (curr > max) {
+	    max = curr;
+	  }
+	}
+	*/
+	
 	//printf ("curr=%lg, vv=%lg\n", curr, vv);
 	if (curr == vv) {
 	  if ((q->predicateOp == ADIOS_EQ) || (q->predicateOp == ADIOS_LTEQ) || (q->predicateOp == ADIOS_GTEQ)) {
@@ -415,7 +478,14 @@ void manualCheck(ADIOS_QUERY* q, int timestep) {
 	}	  
       }
       free(output);
-      printf("... double check found %d hits\n", hits);
+      printf("... double check found %d hits ", hits);
+
+      int64_t diff = compareHits - hits;
+      if (diff == 0) {
+	printf("  SUCCESS! \n");
+      } else {
+	printf("  oh no! expecting %d\n", compareHits);
+      }
       return;
   }
   printf("Skip manual check on composite query\n");
@@ -455,6 +525,8 @@ int parseQueryXml(const char* xmlQueryFileName)
     printf("No content in file %s.\n", xmlQueryFileName);
     return -1;
   }
+  
+  printf("Reading: %s\n", xmlQueryFileName);
 
   mxml_node_t* tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
   fclose(fp);
@@ -503,49 +575,99 @@ int parseQueryXml(const char* xmlQueryFileName)
 	return -1;
       }
 
+      logReport(-1, NULL);
+      printf("\n ... reading file: %s\n", bpFileName);
+
       f = adios_read_open_file (bpFileName, ADIOS_READ_METHOD_BP, comm_dummy);
       if (f == NULL) {
 	printf("::%s\n", adios_errmsg());
 	return -1;
       }
 
+      logTimeMillis(" adios file read.\n");
       ADIOS_QUERY* q = constructQuery(queryNode, f, queryName, batchSize);
 
       ADIOS_SELECTION* outputBox = getOutputSelection(queryNode);
-      logReport(-1); // init timer
+      logReport(-1, q); // init timer
 
       //adios_query_set_method(q, ADIOS_QUERY_METHOD_FASTBIT);
       int timestep = 0;
+      fastbit_set_verbose_level(0);
       //ADIOS_SELECTION* noBox = 0;
       while (timestep <= f->last_step) {
-	printf("\n ...... query=%s, %s, [TimeStep=%d of %d]\n",queryName, q->condition, timestep, f->last_step);
+	printf("\n==> query=%s, %s, [TimeStep=%d of %d]\n",queryName, q->condition, timestep, f->last_step);
+#ifdef ESTIMATE
 	int64_t est = adios_query_estimate(q, timestep);
-	logTimeMillis(" estimated.");
-	printf("\n=> query %s: %s, \n\t estimated  %ld hits on timestep: %d\n", queryName, q->condition, est, timestep);
+	logTimeMillis(" estimated. %s", q->condition);
+	printf("\n .. query %s: %s, \t estimated  %ld hits on timestep: %d\n", queryName, q->condition, est, timestep);
+#endif
 	ADIOS_SELECTION* currBatch = NULL;
 	int hasMore = 1; 
+
+	int readBatchCounter = 1; // 1 = no read back
+	int64_t numHits = 0;
 	while (hasMore > 0) {
 	  hasMore = adios_query_evaluate(q, outputBox, timestep, batchSize, &currBatch);
-	  logTimeMillis(" evaluated one batch.");
+	  logTimeMillis(" evaluated one batch: %s \n", q->condition);
+	  if (numHits == 0) {
+	    logReport(0, q);
+	  }
 	  if (currBatch != NULL) {
-	    printf("\n=> evaluated: %ld hits for %s\n", currBatch->u.points.npoints, q->condition);
+	    int currBatchSize = currBatch->u.points.npoints;
+	    numHits += currBatchSize;
+	    printf("\n   evaluated: %ld hits for %s\n", currBatchSize, q->condition);
+	    
+	    if (readBatchCounter < 1) {
+	        if (currBatchSize <= 1048576) { // takes too long otherwise
+	            readBatchCounter ++;
+		    printf("\n   sample once on reading data out from ADIOS\n");
+		    ADIOS_QUERY* leaf = q;
+		    while (leaf->varinfo == NULL) {
+		        leaf = leaf->left;
+		    }
+		    uint64_t output_byte_size = common_read_type_size (leaf->varinfo->type, leaf->varinfo->value);
+		    output_byte_size *= currBatchSize;
+		    
+		    void* output = malloc (output_byte_size+1000);
+		    if (output == NULL) {
+		      logTimeMillis(".. unable to allocate enough memory for %ld bytes. Skip.\n", output_byte_size+1000);
+		    } else {
+		      adios_schedule_read (leaf->file, currBatch, leaf->varName, timestep, 1, output);
+		      adios_perform_reads (leaf->file, 1);
+		      logTimeMillis(" .. read batch data out from ADIOS, batchsize=%ld,  for: %s out of %ld\n", currBatchSize, leaf->condition, leaf->rawDataSize);
+		      free(output);
+		    }
+		}
+	    }
+	  } else {
+	    printf("\n   evaluated 0 hits for %s\n", q->condition);
 	  }
+
 	  if (currBatch != NULL) {
 	    free (currBatch->u.points.points);
 	    adios_selection_delete(currBatch);
 	  }
 	}
-	logReport(0);
-	manualCheck(q, timestep);
-	logTimeMillis(" manual check done.");
-	timestep ++;
+
+	logReport(1, q);
+	logReport(-1, NULL);
+
+	//printf("\n skipping manual check. not enough memory\n");
+	printf("\n numHits = %ld, %s\n", numHits, q->condition);
+	if (numHits > 5000000) {
+	  //manualCheck(q, timestep, numHits);
+	} else {
+	  //printf("\n numHits = %ld\n", numHits);
+	}
+
+	logTimeMillis(" sequential scan done! %s\n", q->condition);
+	timestep ++;      
       }
-      
       recursive_free(q);
       adios_read_close(f);
-      
+	
       //mxmlDelete(queryNode);
-   }
+    }
   
   mxmlDelete(testsNode);
   mxmlDelete(tree);    
@@ -926,94 +1048,16 @@ void doubleCheckWithIdxOnBlock(ADIOS_FILE* dataFile, const char* basefileName, i
 }
 */
 
-void usage(char* prog)
-{
-  printf("Usage: %s <BP-file> [query]\n e.g. ./test_v1 my.bp \"x1 > 10\" \n", prog);
-}
 
 int main (int argc, char ** argv) 
 {
 
-  parseQueryXml("query.xml");
-  return 0;
-
-
-#if 0
-  
-    if (argc < 2) {
-        usage(argv[0]);
-	return 1;
-    }
-
-    ADIOS_FILE * f;
-    MPI_Comm    comm_dummy = 0;  /* MPI_Comm is defined through adios_read.h */
-
-    f = adios_read_open_file (argv[1], ADIOS_READ_METHOD_BP, comm_dummy);
-    if (f == NULL) {
-        printf ("::%s\n", adios_errmsg());
-	return -1;
-    }
-
-    const char* varName1 = "/Timestep_0/cells/X";
-    const char* varName2 = "/Timestep_0/cells/Y";
-
-    if (argc > 2) {
-      varName1 = argv[2];
-    } 
-
-
-    if (argc > 3) {
-      int blockNum = 0; // relative to timestep
-      int timestep = 1;
-      const char* lessThanVal = argv[3];
-      if (argc > 4) { // e.g.  ./query_fastbit data/record20110203.bp "/var/v1" 1.000 2
-	timestep = atoi(argv[4]);
-      }
-
-      /*    
-      if (argc > 5) {	
-	printf("arg: dataFile var1 value timestep var2\n");
-	varName2 = argv[5];
-	const char* greaterThanVal = argv[6];
-
-	testDefaultBoundBox(f, varName1, varName2,  timestep, lessThanVal, greaterThanVal);
-      }
-      */
-      
-	//testUseOneWriteBlockSimpleLessThan(f, blockNum, varName1, lessThanVal, timestep); 
-	enum ADIOS_PREDICATE_MODE lessT = ADIOS_LT;
-	testNoBoxOnSelection(f, varName1, lessThanVal, timestep, lessT);
-	//testNoBoxOnSelection(f, varName1, lessThanVal, timestep, lessT);
-	enum ADIOS_PREDICATE_MODE greaterT = ADIOS_GT;
-	testNoBoxOnSelection(f, varName1, lessThanVal, timestep, greaterT);
-	//testNoBoxOnSelection(f, varName1, lessThanVal, timestep, greaterT);
-	//testOneBoundBox(f, varName1, lessThanVal, timestep);
-
-	//const char* greaterThanVal = argv[5];
-	//testTwoBoundBoxes(f, varName1, lessThanVal, greaterThanVal, timestep);
-	//}
-
-      /*
-      ADIOS_VARINFO* v = adios_inq_var(f, varName1);
-      doubleCheckWithIdxOnBlock(f, argv[1], blockNum, v, timestep, atof(lessThanVal));
-
-      //uint64_t point[] = {33,31,31};
-      //printf("testing global block #: %d\n", getGlobalBlockNumForPoint(v,point,timestep));
-
-      adios_free_varinfo(v);
-      */
-    }
-    
-    //testNoBoxOnSelection(f, varName1);
-    //testMultiBoundBox(f, varName1, varName1);
-    //testAllDifferentBoundBoxes(f, varName1, varName2);
-    //testUseOneWriteBlock(f, 0, varName1, varName2); 
-
+  if (argc == 1) {
+    parseQueryXml("query.xml");
+    return 0;
+  } else {
+    parseQueryXml(argv[1]);
+    return 0;
+  }
     
-    //testOneBoundBoxForAllVar(f, varName1, varName2); 
-    //testOnePointList(f, varName1, varName2);
-
-    adios_read_close(f);
-    return 1;
-#endif    
 }
diff --git a/tests/Fortran/CMakeLists.txt b/tests/Fortran/CMakeLists.txt
index f389eb1..b861a29 100644
--- a/tests/Fortran/CMakeLists.txt
+++ b/tests/Fortran/CMakeLists.txt
@@ -1,4 +1,4 @@
-include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/tests/Fortran)
 link_directories(${PROJECT_BINARY_DIR}/tests/Fortran)
 
diff --git a/tests/Fortran/Makefile.am b/tests/Fortran/Makefile.am
index 476efb8..c401935 100644
--- a/tests/Fortran/Makefile.am
+++ b/tests/Fortran/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_builddir)/src
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_builddir)/src
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/Fortran/Makefile.in b/tests/Fortran/Makefile.in
index b2b7e2b..83f511b 100644
--- a/tests/Fortran/Makefile.in
+++ b/tests/Fortran/Makefile.in
@@ -303,6 +303,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -360,7 +363,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_builddir)/src
 AUTOMAKE_OPTIONS = no-dependencies
 
 #adios_test_f_SOURCES = adios_test_f.F90 adios_module.F90
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 7862227..8cb8cfa 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -321,6 +321,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/tests/bp_read/CMakeLists.txt b/tests/bp_read/CMakeLists.txt
index fc094a5..354a999 100644
--- a/tests/bp_read/CMakeLists.txt
+++ b/tests/bp_read/CMakeLists.txt
@@ -1,7 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/tests/bp_read)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src)
-include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/tests/bp_read)
 
 set(genbp_CPPFLAGS "${ADIOSLIB_CPPFLAGS}")
diff --git a/tests/bp_read/Makefile.am b/tests/bp_read/Makefile.am
index 0011a8b..3ec0453 100644
--- a/tests/bp_read/Makefile.am
+++ b/tests/bp_read/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public  -I$(top_builddir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/bp_read/Makefile.in b/tests/bp_read/Makefile.in
index 13d1612..af03554 100644
--- a/tests/bp_read/Makefile.in
+++ b/tests/bp_read/Makefile.in
@@ -345,6 +345,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -402,8 +405,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_builddir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 
 # read_coords read_phi read_parts_global read_gena read_gena_pncd read_pixie_all
diff --git a/tests/bp_read/bp_read_f.F90 b/tests/bp_read/bp_read_f.F90
index 713a2e0..8eaf57b 100644
--- a/tests/bp_read/bp_read_f.F90
+++ b/tests/bp_read/bp_read_f.F90
@@ -162,12 +162,12 @@ subroutine processArgs(path)
     character(len=256), intent(out) :: path
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     integer :: numargs
diff --git a/tests/bp_read/bp_read_f_v1.F90 b/tests/bp_read/bp_read_f_v1.F90
index 127a067..81fbb85 100644
--- a/tests/bp_read/bp_read_f_v1.F90
+++ b/tests/bp_read/bp_read_f_v1.F90
@@ -173,12 +173,12 @@ subroutine processArgs(path)
     character(len=256), intent(out) :: path
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     integer :: numargs
diff --git a/tests/genarray/CMakeLists.txt b/tests/genarray/CMakeLists.txt
index e822620..8342037 100644
--- a/tests/genarray/CMakeLists.txt
+++ b/tests/genarray/CMakeLists.txt
@@ -1,5 +1,5 @@
 include_directories(${PROJECT_SOURCE_DIR}/src)
-include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src  ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/tests/genarray)
 include_directories(${PROJECT_BINARY_DIR}/tests/genarray)
 link_directories(${PROJECT_BINARY_DIR}/tests/genarray)
diff --git a/tests/genarray/Makefile.am b/tests/genarray/Makefile.am
index e1c5ca4..9b569c2 100644
--- a/tests/genarray/Makefile.am
+++ b/tests/genarray/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_builddir)/src
+AM_CPPFLAGS += -I$(top_builddir)/src/public  -I$(top_builddir)/src
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/tests/genarray/Makefile.in b/tests/genarray/Makefile.in
index bd072a8..5d0f107 100644
--- a/tests/genarray/Makefile.in
+++ b/tests/genarray/Makefile.in
@@ -327,6 +327,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -384,7 +387,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_builddir)/src
 AUTOMAKE_OPTIONS = no-dependencies
 genarray_SOURCES = genarray.F90
 genarray_CPPFLAGS = $(AM_CPPFLAGS) $(ADIOSLIB_CPPFLAGS)
diff --git a/tests/genarray/copyarray.F90 b/tests/genarray/copyarray.F90
index adcc8af..364ddf1 100644
--- a/tests/genarray/copyarray.F90
+++ b/tests/genarray/copyarray.F90
@@ -273,12 +273,12 @@ subroutine processArgs()
     use copyarray_comm
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     character(len=256) :: npx_str, npy_str, npz_str, ndx_str, ndy_str, ndz_str
diff --git a/tests/genarray/copyarray2D.F90 b/tests/genarray/copyarray2D.F90
index 2267639..f3d8259 100644
--- a/tests/genarray/copyarray2D.F90
+++ b/tests/genarray/copyarray2D.F90
@@ -341,12 +341,12 @@ subroutine processArgs()
     use copyarray2D_comm
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     character(len=256) :: npx_str, npy_str, ndx_str, ndy_str, time_str
diff --git a/tests/genarray/genarray.F90 b/tests/genarray/genarray.F90
index ea329f9..6d22f6e 100644
--- a/tests/genarray/genarray.F90
+++ b/tests/genarray/genarray.F90
@@ -215,12 +215,12 @@ subroutine processArgs()
     use genarray_comm
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     character(len=256) :: npx_str, npy_str, npz_str, ndx_str, ndy_str, ndz_str
diff --git a/tests/genarray/genarray2D.F90 b/tests/genarray/genarray2D.F90
index 71c6712..87baccb 100644
--- a/tests/genarray/genarray2D.F90
+++ b/tests/genarray/genarray2D.F90
@@ -263,12 +263,12 @@ subroutine processArgs()
     use genarray2D_comm
 
 #ifndef __GFORTRAN__
-#ifndef __GNUC__
+!#ifndef __GNUC__
     interface
          integer function iargc()
          end function iargc
     end interface
-#endif
+!#endif
 #endif
 
     character(len=256) :: npx_str, npy_str, ndx_str, ndy_str, time_str
diff --git a/tests/suite/Makefile.in b/tests/suite/Makefile.in
index 49b1938..80689df 100644
--- a/tests/suite/Makefile.in
+++ b/tests/suite/Makefile.in
@@ -321,6 +321,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/tests/suite/programs/CMakeLists.txt b/tests/suite/programs/CMakeLists.txt
index 8bb7160..16435e0 100644
--- a/tests/suite/programs/CMakeLists.txt
+++ b/tests/suite/programs/CMakeLists.txt
@@ -2,6 +2,7 @@ include_directories(${PROJECT_SOURCE_DIR}/tests/suite)
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/tests/suite/programs)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_BINARY_DIR}/tests/suite/programs)
 link_directories(${PROJECT_BINARY_DIR}/tests/suite/programs)
 
diff --git a/tests/suite/programs/Makefile.am b/tests/suite/programs/Makefile.am
index ce1a2f4..5e4e911 100644
--- a/tests/suite/programs/Makefile.am
+++ b/tests/suite/programs/Makefile.am
@@ -36,6 +36,8 @@ check_C=local_array_time \
 
 test_C=hashtest copy_subvolume transforms_specparse group_free_test
 
+SUBDIRS=examples
+
 endif
 
 if BUILD_FORTRAN
@@ -52,10 +54,10 @@ check_PROGRAMS=$(check_C) $(check_Fortran) $(check_readonly_C) $(check_readonly_
 TESTS=$(test_C)
 
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public  -I$(top_builddir)/src -I$(top_srcdir)/src/public
 
 all-local:
-	test "$(srcdir)" = "$(builddir)" || cp $(srcdir)/*.xml $(builddir)
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
 
 #############################
 # Build rules for each test #
@@ -195,7 +197,7 @@ transforms_writeblock_read_LDFLAGS = $(AM_LDFLAGS) $(ADIOSREADLIB_LDFLAGS)
 copy_subvolume_SOURCES=copy_subvolume.c
 copy_subvolume_LDADD = $(top_builddir)/src/libadiosread_nompi.a $(ADIOSREADLIB_SEQ_LDADD)
 copy_subvolume_LDFLAGS = $(AM_LDFLAGS) $(ADIOSREADLIB_SEQ_LDFLAGS)
-copy_subvolume_CPPFLAGS = -I$(top_srcdir)/src $(ADIOSREADLIB_SEQ_CPPFLAGS)
+copy_subvolume_CPPFLAGS = -I$(top_srcdir)/src $(ADIOSREADLIB_SEQ_CPPFLAGS) -I$(top_builddir)/src/public
 #copy_subvolume.o: copy_subvolume.c
 
 transforms_specparse_SOURCES=transforms_specparse.c
@@ -213,7 +215,7 @@ hashtest.o: hashtest.c
 group_free_test_SOURCES=group_free_test.c
 group_free_test_LDADD = $(top_builddir)/src/libadios_nompi.a $(ADIOSLIB_SEQ_LDADD)
 group_free_test_LDFLAGS = $(AM_LDFLAGS) $(ADIOSLIB_SEQ_LDFLAGS)
-group_free_test_CPPFLAGS = -I$(top_srcdir)/src $(ADIOSLIB_SEQ_CPPFLAGS)
+group_free_test_CPPFLAGS = -I$(top_srcdir)/src $(ADIOSLIB_SEQ_CPPFLAGS) -I$(top_builddir)/src/public
 group_free_test.o: group_free_test.c
 
 EXTRA_DIST = adios_amr_write.xml adios_amr_write_2vars.xml \
diff --git a/tests/suite/programs/Makefile.in b/tests/suite/programs/Makefile.in
index 4a598c7..c286f10 100644
--- a/tests/suite/programs/Makefile.in
+++ b/tests/suite/programs/Makefile.in
@@ -374,11 +374,49 @@ DIST_SOURCES = $(adios_amr_write_SOURCES) \
 	$(transforms_specparse_SOURCES) \
 	$(transforms_writeblock_read_SOURCES) $(two_groups_SOURCES) \
 	$(write_alternate_SOURCES) $(write_read_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 am__tty_colors = \
 red=; grn=; lgn=; blu=; std=
+DIST_SUBDIRS = examples
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ADIOSLIB_CFLAGS = @ADIOSLIB_CFLAGS@
 ADIOSLIB_CPPFLAGS = @ADIOSLIB_CPPFLAGS@
@@ -577,6 +615,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -671,10 +712,11 @@ check_readonly_C =
 @BUILD_WRITE_TRUE@	transforms_writeblock_read
 
 @BUILD_WRITE_TRUE at test_C = hashtest copy_subvolume transforms_specparse group_free_test
+ at BUILD_WRITE_TRUE@SUBDIRS = examples
 @BUILD_FORTRAN_TRUE at check_readonly_Fortran = 
 @BUILD_FORTRAN_TRUE@@BUILD_WRITE_TRUE at check_Fortran = posix_method
-AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_builddir)/src -I$(top_srcdir)/src/public
 
 #############################
 # Build rules for each test #
@@ -765,7 +807,7 @@ transforms_writeblock_read_LDFLAGS = $(AM_LDFLAGS) $(ADIOSREADLIB_LDFLAGS)
 copy_subvolume_SOURCES = copy_subvolume.c
 copy_subvolume_LDADD = $(top_builddir)/src/libadiosread_nompi.a $(ADIOSREADLIB_SEQ_LDADD)
 copy_subvolume_LDFLAGS = $(AM_LDFLAGS) $(ADIOSREADLIB_SEQ_LDFLAGS)
-copy_subvolume_CPPFLAGS = -I$(top_srcdir)/src $(ADIOSREADLIB_SEQ_CPPFLAGS)
+copy_subvolume_CPPFLAGS = -I$(top_srcdir)/src $(ADIOSREADLIB_SEQ_CPPFLAGS) -I$(top_builddir)/src/public
 #copy_subvolume.o: copy_subvolume.c
 transforms_specparse_SOURCES = transforms_specparse.c
 transforms_specparse_LDADD = $(top_builddir)/src/libadios_nompi.a $(ADIOSLIB_SEQ_LDADD)
@@ -779,7 +821,7 @@ hashtest_CPPFLAGS = -I$(top_srcdir)/src
 group_free_test_SOURCES = group_free_test.c
 group_free_test_LDADD = $(top_builddir)/src/libadios_nompi.a $(ADIOSLIB_SEQ_LDADD)
 group_free_test_LDFLAGS = $(AM_LDFLAGS) $(ADIOSLIB_SEQ_LDFLAGS)
-group_free_test_CPPFLAGS = -I$(top_srcdir)/src $(ADIOSLIB_SEQ_CPPFLAGS)
+group_free_test_CPPFLAGS = -I$(top_srcdir)/src $(ADIOSLIB_SEQ_CPPFLAGS) -I$(top_builddir)/src/public
 EXTRA_DIST = adios_amr_write.xml adios_amr_write_2vars.xml \
              posix_method.xml local_array_time.xml  \
              write_alternate.xml write_read.xml transforms.xml \
@@ -791,7 +833,7 @@ FCLINK = \
 	$(LIBTOOL) --mode=link --tag F77 $(FC) \
 	$(AM_FCFLAGS) $(FCFLAGS) $(LDFLAGS) -o $@
 
-all: all-am
+all: all-recursive
 
 .SUFFIXES:
 .SUFFIXES: .F90 .c .lo .o .obj
@@ -1049,6 +1091,76 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
@@ -1059,10 +1171,23 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	mkid -fID $$unique
 tags: TAGS
 
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	set x; \
 	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
@@ -1081,7 +1206,7 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  fi; \
 	fi
 ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
@@ -1223,21 +1348,50 @@ distdir: $(DISTFILES)
 	    || exit 1; \
 	  fi; \
 	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
 check-am: all-am
 	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
 	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
+check: check-recursive
 all-am: Makefile all-local
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
 
 install-am: all-am
 	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
-installcheck: installcheck-am
+installcheck: installcheck-recursive
 install-strip:
 	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
@@ -1255,96 +1409,98 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
+clean: clean-recursive
 
 clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
 	mostlyclean-am
 
-distclean: distclean-am
+distclean: distclean-recursive
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
 	distclean-tags
 
-dvi: dvi-am
+dvi: dvi-recursive
 
 dvi-am:
 
-html: html-am
+html: html-recursive
 
 html-am:
 
-info: info-am
+info: info-recursive
 
 info-am:
 
 install-data-am:
 
-install-dvi: install-dvi-am
+install-dvi: install-dvi-recursive
 
 install-dvi-am:
 
 install-exec-am:
 
-install-html: install-html-am
+install-html: install-html-recursive
 
 install-html-am:
 
-install-info: install-info-am
+install-info: install-info-recursive
 
 install-info-am:
 
 install-man:
 
-install-pdf: install-pdf-am
+install-pdf: install-pdf-recursive
 
 install-pdf-am:
 
-install-ps: install-ps-am
+install-ps: install-ps-recursive
 
 install-ps-am:
 
 installcheck-am:
 
-maintainer-clean: maintainer-clean-am
+maintainer-clean: maintainer-clean-recursive
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
-mostlyclean: mostlyclean-am
+mostlyclean: mostlyclean-recursive
 
 mostlyclean-am: mostlyclean-compile mostlyclean-generic \
 	mostlyclean-libtool
 
-pdf: pdf-am
+pdf: pdf-recursive
 
 pdf-am:
 
-ps: ps-am
+ps: ps-recursive
 
 ps-am:
 
 uninstall-am:
 
-.MAKE: check-am install-am install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \
+	ctags-recursive install-am install-strip tags-recursive
 
-.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \
-	clean clean-checkPROGRAMS clean-generic clean-libtool ctags \
-	distclean distclean-compile distclean-generic \
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am all-local check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
+	ctags-recursive distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
 	install-data-am install-dvi install-dvi-am install-exec \
 	install-exec-am install-html install-html-am install-info \
 	install-info-am install-man install-pdf install-pdf-am \
 	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
+	installcheck-am installdirs installdirs-am maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am
+	tags tags-recursive uninstall uninstall-am
 
 
 all-local:
-	test "$(srcdir)" = "$(builddir)" || cp $(srcdir)/*.xml $(builddir)
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
 posix_method.o: gwrite_posix_method.fh 
 gwrite_posix_method.fh: posix_method.xml
 	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/posix_method.xml
diff --git a/tests/suite/programs/adios_transforms.xml b/tests/suite/programs/adios_transforms.xml
index 414a217..d01562d 100644
--- a/tests/suite/programs/adios_transforms.xml
+++ b/tests/suite/programs/adios_transforms.xml
@@ -20,7 +20,7 @@
 
 <method group="transform" method="MPI"/>
 
-<buffer size-MB="500" allocate-time="now"/>
+<buffer size-MB="5" allocate-time="now"/>
 
 </adios-config>
 
diff --git a/tests/suite/programs/adios_transforms_read_write.c b/tests/suite/programs/adios_transforms_read_write.c
index 38470a1..6a8927e 100644
--- a/tests/suite/programs/adios_transforms_read_write.c
+++ b/tests/suite/programs/adios_transforms_read_write.c
@@ -50,6 +50,7 @@ int read_box (char *filename)
     MPI_Comm                comm                = MPI_COMM_WORLD;
 
     enum ADIOS_READ_METHOD        method  = ADIOS_READ_METHOD_BP;
+    adios_read_init_method (method, comm, "");
     ADIOS_FILE              *f       = adios_read_open_file (filename, method, comm);
     ADIOS_VARINFO           *varinfo = adios_inq_var (f, varname_xform [0]);
     ADIOS_SELECTION         *sel1;
@@ -134,7 +135,7 @@ int read_box (char *filename)
 
     adios_free_varinfo (varinfo);
     adios_read_close (f);
-    adios_read_finalize_method (ADIOS_READ_METHOD_BP);
+    adios_read_finalize_method (method);
 
     return retval;
 }
diff --git a/tests/suite/programs/big_file.c b/tests/suite/programs/big_file.c
index 0cc1a02..11baa1e 100644
--- a/tests/suite/programs/big_file.c
+++ b/tests/suite/programs/big_file.c
@@ -56,7 +56,7 @@ void alloc_vars()
     size_t n;
 
     n = (size_t)ldim1 * (size_t)ldim2;
-    log ("Allocate 2 arrays of %llu integers...\n",n);
+    log ("Allocate 2 arrays of %llu integers...\n",(unsigned long long)n);
     a2  = (int*) malloc (n * sizeof(int));
     r2  = (int*) malloc (n * sizeof(int));
 }
@@ -81,7 +81,7 @@ void set_vars(int step)
     set_offsets();
 
     n = (size_t)ldim1 * (size_t)ldim2;
-    log ("  Fill up array of %llu elements to value %d...\n",n,v);
+    log ("  Fill up array of %llu elements to value %d...\n",(unsigned long long)n,v);
     for (i=0; i<n; i++) a2[i] = v;
 }
 
@@ -202,7 +202,7 @@ int write_file (int step)
     te = MPI_Wtime();
 
     if (rank==0) {
-        log ("  Write time for step %d was %6.3lf seconds\n", rank, step, te-tb);
+        log ("  Write time for step %d was %6.3lf seconds\n", step, te-tb);
     }
     MPI_Barrier (comm);
     return 0;
@@ -287,7 +287,7 @@ int read_file ()
     log ("Read and check data in %s\n", FILENAME);
     f = adios_read_open_file (FILENAME, ADIOS_READ_METHOD_BP, comm);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
diff --git a/tests/suite/programs/blocks.c b/tests/suite/programs/blocks.c
index e5453d8..c541fa2 100644
--- a/tests/suite/programs/blocks.c
+++ b/tests/suite/programs/blocks.c
@@ -180,7 +180,7 @@ void print_written_info()
     printf ("\n------- Information recorded on rank 0 (read will compare to this info)  --------\n");
     for (s = 0; s < nsteps; s++) {
         printf ("Step %d:\n", s);
-        printf ("  Global dim = %d\n", gdims[s]);
+        printf ("  Global dim = %llu\n", gdims[s]);
         for (r = 0; r < size; r++) {
             for (b = 0; b < nblocks_per_step; b++) {
                 printf ("  rank %d: block %d: size=%llu, offset=%llu\n", r, b+1, 
@@ -498,7 +498,7 @@ int read_scalar_stepbystep ()
             if (value != 
                     block_count [f->current_step*nblocks_per_step*size]) 
             {
-                printf ("\tERROR expected = %d", 
+                printf ("\tERROR expected = %llu", 
                         block_count [f->current_step*nblocks_per_step*size]);
                 nerrors++;
             }
diff --git a/tests/suite/programs/build_standard_dataset.c b/tests/suite/programs/build_standard_dataset.c
index dd46903..efb0773 100644
--- a/tests/suite/programs/build_standard_dataset.c
+++ b/tests/suite/programs/build_standard_dataset.c
@@ -753,7 +753,8 @@ int main(int argc, char **argv) {
 			dataset = &DATASETS[i];
 
 	if (dataset == NULL) {
-		fprintf(stderr, "Error: '%s' does not name a dataset packaged in this executable\n");
+		fprintf(stderr, "Error: '%s' does not name a dataset packaged in this executable\n", 
+                        dataset_id);
 		usage_and_exit();
 	}
 
diff --git a/tests/suite/programs/connect_to_space_subset.c b/tests/suite/programs/connect_to_space_subset.c
index d518bae..e5e515e 100644
--- a/tests/suite/programs/connect_to_space_subset.c
+++ b/tests/suite/programs/connect_to_space_subset.c
@@ -154,7 +154,7 @@ int write_file (int step)
     uint64_t       groupsize=0, totalsize;
 
     log ("Write step %d to %s\n", step, FILENAME);
-    adios_open (&fh, "connect", FILENAME, (step ? "a" : "w"), &subcomm);
+    adios_open (&fh, "connect", FILENAME, (step ? "a" : "w"), subcomm);
     
     groupsize  = 3 * sizeof(int);                           // dimensions 
     groupsize += ldim1 * sizeof(int);                       // 1D 
diff --git a/tests/suite/programs/examples/Makefile.am b/tests/suite/programs/examples/Makefile.am
new file mode 100644
index 0000000..8eff78f
--- /dev/null
+++ b/tests/suite/programs/examples/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS=attributes scalars local_array global_array global_array_time
diff --git a/examples/Fortran/Makefile.in b/tests/suite/programs/examples/Makefile.in
similarity index 98%
copy from examples/Fortran/Makefile.in
copy to tests/suite/programs/examples/Makefile.in
index 26a22d6..1db0735 100644
--- a/examples/Fortran/Makefile.in
+++ b/tests/suite/programs/examples/Makefile.in
@@ -33,7 +33,7 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-subdir = examples/Fortran
+subdir = tests/suite/programs/examples
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/ac_alacrity.m4 \
@@ -321,6 +321,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -378,7 +381,7 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = scalars arrays global-array global-array-time schema 
+SUBDIRS = attributes scalars local_array global_array global_array_time
 all: all-recursive
 
 .SUFFIXES:
@@ -391,9 +394,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Fortran/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/suite/programs/examples/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu examples/Fortran/Makefile
+	  $(AUTOMAKE) --gnu tests/suite/programs/examples/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -725,7 +728,6 @@ uninstall-am:
 	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
 	uninstall uninstall-am
 
-#time-index
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/tests/suite/programs/examples/attributes/CMakeLists.txt b/tests/suite/programs/examples/attributes/CMakeLists.txt
new file mode 100644
index 0000000..1e10707
--- /dev/null
+++ b/tests/suite/programs/examples/attributes/CMakeLists.txt
@@ -0,0 +1,34 @@
+include_directories(${PROJECT_SOURCE_DIR}/src/public)
+include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_SOURCE_DIR}/test/suite/programs/examples/attributes)
+include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
+link_directories(${PROJECT_BINARY_DIR}/test/suite/programs/examples/attributes)
+
+add_executable(attributes_write_C attributes_write_C.c)
+if(MPI_COMPILE_FLAGS)
+  set_target_properties(attributes_write_C PROPERTIES COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
+endif()
+if(MPI_LINK_FLAGS)
+  set_target_properties(attributes_write_C PROPERTIES LINK_FLAGS "${MPI_C_LINK_FLAGS}")
+endif()
+target_link_libraries(attributes_write_C adios ${ADIOSLIB_LDADD} ${MPI_C_LIBRARIES})
+add_custom_command(
+	OUTPUT gwrite_temperature.ch
+	COMMAND ${PROJECT_SOURCE_DIR}/utils/gpp/gpp.py ${PROJECT_SOURCE_DIR}/tests/suite/programs/examples/attributes/attributes_C.xml
+	DEPENDS attributes_C.xml
+	)
+
+
+add_executable(attributes_read_C attributes_read_C.c)
+if(MPI_COMPILE_FLAGS)
+  set_target_properties(attributes_read_C PROPERTIES COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
+endif()
+if(MPI_LINK_FLAGS)
+  set_target_properties(attributes_read_C PROPERTIES LINK_FLAGS "${MPI_C_LINK_FLAGS}")
+endif()
+target_link_libraries(attributes_read_C adiosread ${ADIOSREADLIB_LDADD} ${MPI_C_LIBRARIES})
+#set_target_properties(attributes_read PROPERTIES COMPILE_FLAGS "-DADIOS_USE_READ_API_1")
+
+#install(FILES attributes.xml gwrite_temperature.ch gread_temperature.ch DESTINATION ${PROJECT_BINARY_DIR}/examples/C/attributes)
+
diff --git a/tests/suite/programs/examples/attributes/Makefile.am b/tests/suite/programs/examples/attributes/Makefile.am
new file mode 100644
index 0000000..eb59840
--- /dev/null
+++ b/tests/suite/programs/examples/attributes/Makefile.am
@@ -0,0 +1,27 @@
+AM_CPPFLAGS = $(all_includes)
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+
+AUTOMAKE_OPTIONS = no-dependencies
+
+all-local:
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+
+check_PROGRAMS = attributes_write_C attributes_read_C
+
+attributes_write_C_SOURCES = attributes_write_C.c
+attributes_write_C_LDADD = $(top_builddir)/src/libadios.a 
+attributes_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+attributes_write_C_LDADD += $(ADIOSLIB_LDADD)
+attributes_write_C.o: gwrite_temperature.ch 
+gwrite_temperature.ch: attributes_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/attributes_C.xml
+
+attributes_read_C_SOURCES = attributes_read_C.c
+attributes_read_C_LDADD = $(top_builddir)/src/libadiosread.a
+attributes_read_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+attributes_read_C_LDADD += $(ADIOSREADLIB_LDADD)
+
+CLEANFILES = *.bp *.ch *.fh
+CC=$(MPICC)
+EXTRA_DIST = attributes_C.xml 
+
diff --git a/examples/C/attributes/Makefile.in b/tests/suite/programs/examples/attributes/Makefile.in
similarity index 87%
copy from examples/C/attributes/Makefile.in
copy to tests/suite/programs/examples/attributes/Makefile.in
index 90126cd..61448e4 100644
--- a/examples/C/attributes/Makefile.in
+++ b/tests/suite/programs/examples/attributes/Makefile.in
@@ -14,7 +14,6 @@
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
-
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
@@ -34,8 +33,9 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-noinst_PROGRAMS = attributes_write$(EXEEXT) attributes_read$(EXEEXT)
-subdir = examples/C/attributes
+check_PROGRAMS = attributes_write_C$(EXEEXT) \
+	attributes_read_C$(EXEEXT)
+subdir = tests/suite/programs/examples/attributes
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/ac_alacrity.m4 \
@@ -82,22 +82,21 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_attributes_read_OBJECTS = attributes_read.$(OBJEXT)
-attributes_read_OBJECTS = $(am_attributes_read_OBJECTS)
+am_attributes_read_C_OBJECTS = attributes_read_C.$(OBJEXT)
+attributes_read_C_OBJECTS = $(am_attributes_read_C_OBJECTS)
 am__DEPENDENCIES_1 =
-attributes_read_DEPENDENCIES = $(top_builddir)/src/libadiosread.a \
+attributes_read_C_DEPENDENCIES = $(top_builddir)/src/libadiosread.a \
 	$(am__DEPENDENCIES_1)
-attributes_read_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+attributes_read_C_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(attributes_read_LDFLAGS) $(LDFLAGS) -o $@
-am_attributes_write_OBJECTS = attributes_write.$(OBJEXT)
-attributes_write_OBJECTS = $(am_attributes_write_OBJECTS)
-attributes_write_DEPENDENCIES = $(top_builddir)/src/libadios.a \
+	$(attributes_read_C_LDFLAGS) $(LDFLAGS) -o $@
+am_attributes_write_C_OBJECTS = attributes_write_C.$(OBJEXT)
+attributes_write_C_OBJECTS = $(am_attributes_write_C_OBJECTS)
+attributes_write_C_DEPENDENCIES = $(top_builddir)/src/libadios.a \
 	$(am__DEPENDENCIES_1)
-attributes_write_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+attributes_write_C_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(attributes_write_LDFLAGS) $(LDFLAGS) -o $@
+	$(attributes_write_C_LDFLAGS) $(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp =
 am__depfiles_maybe =
@@ -110,8 +109,9 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
-SOURCES = $(attributes_read_SOURCES) $(attributes_write_SOURCES)
-DIST_SOURCES = $(attributes_read_SOURCES) $(attributes_write_SOURCES)
+SOURCES = $(attributes_read_C_SOURCES) $(attributes_write_C_SOURCES)
+DIST_SOURCES = $(attributes_read_C_SOURCES) \
+	$(attributes_write_C_SOURCES)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,19 +373,20 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
-attributes_write_SOURCES = attributes_write.c
-attributes_write_LDADD = $(top_builddir)/src/libadios.a \
+attributes_write_C_SOURCES = attributes_write_C.c
+attributes_write_C_LDADD = $(top_builddir)/src/libadios.a \
 	$(ADIOSLIB_LDADD)
-attributes_write_LDFLAGS = $(ADIOSLIB_LDFLAGS)
-attributes_read_SOURCES = attributes_read.c
-attributes_read_LDADD = $(top_builddir)/src/libadiosread.a \
+attributes_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+attributes_read_C_SOURCES = attributes_read_C.c
+attributes_read_C_LDADD = $(top_builddir)/src/libadiosread.a \
 	$(ADIOSREADLIB_LDADD)
-attributes_read_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
-CLEANFILES = *.bp
-EXTRA_DIST = attributes.xml gwrite_temperature.ch gread_temperature.ch
+attributes_read_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+CLEANFILES = *.bp *.ch *.fh
+EXTRA_DIST = attributes_C.xml 
 all: all-am
 
 .SUFFIXES:
@@ -396,9 +400,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/C/attributes/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/suite/programs/examples/attributes/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu examples/C/attributes/Makefile
+	  $(AUTOMAKE) --gnu tests/suite/programs/examples/attributes/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -418,20 +422,20 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
 	echo " rm -f" $$list; \
 	rm -f $$list || exit $$?; \
 	test -n "$(EXEEXT)" || exit 0; \
 	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
 	echo " rm -f" $$list; \
 	rm -f $$list
-attributes_read$(EXEEXT): $(attributes_read_OBJECTS) $(attributes_read_DEPENDENCIES) 
-	@rm -f attributes_read$(EXEEXT)
-	$(attributes_read_LINK) $(attributes_read_OBJECTS) $(attributes_read_LDADD) $(LIBS)
-attributes_write$(EXEEXT): $(attributes_write_OBJECTS) $(attributes_write_DEPENDENCIES) 
-	@rm -f attributes_write$(EXEEXT)
-	$(attributes_write_LINK) $(attributes_write_OBJECTS) $(attributes_write_LDADD) $(LIBS)
+attributes_read_C$(EXEEXT): $(attributes_read_C_OBJECTS) $(attributes_read_C_DEPENDENCIES) 
+	@rm -f attributes_read_C$(EXEEXT)
+	$(attributes_read_C_LINK) $(attributes_read_C_OBJECTS) $(attributes_read_C_LDADD) $(LIBS)
+attributes_write_C$(EXEEXT): $(attributes_write_C_OBJECTS) $(attributes_write_C_DEPENDENCIES) 
+	@rm -f attributes_write_C$(EXEEXT)
+	$(attributes_write_C_LINK) $(attributes_write_C_OBJECTS) $(attributes_write_C_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -537,8 +541,9 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
 check: check-am
-all-am: Makefile $(PROGRAMS) all-local
+all-am: Makefile all-local
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -568,7 +573,7 @@ maintainer-clean-generic:
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
 	mostlyclean-am
 
 distclean: distclean-am
@@ -635,10 +640,10 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
-	clean-generic clean-libtool clean-noinstPROGRAMS ctags \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
@@ -653,7 +658,10 @@ uninstall-am:
 
 
 all-local:
-	test "$(srcdir)" = "$(builddir)" || cp $(srcdir)/*.xml $(builddir)
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+attributes_write_C.o: gwrite_temperature.ch 
+gwrite_temperature.ch: attributes_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/attributes_C.xml
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/tests/suite/programs/examples/attributes/attributes_C.xml b/tests/suite/programs/examples/attributes/attributes_C.xml
new file mode 100644
index 0000000..f9988fb
--- /dev/null
+++ b/tests/suite/programs/examples/attributes/attributes_C.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<adios-config host-language="C">
+    <adios-group name="temperature">
+        <var name="NX"   type="integer"/>
+        <var name="size" type="integer"/>
+        <var name="rank" type="integer"/>
+        <var name="mean" type="double"/>
+        <var name="date" type="string" gwrite="str"/>
+
+        <global-bounds dimensions="size,NX" offsets="rank,0">
+           <var name="temperature" gwrite="t" gread="t" type="double" dimensions="1,NX"/>
+        </global-bounds>
+
+        <!-- an integer attribute set to 1 -->
+        <attribute name="temperature/number of levels" 
+                   type="integer" 
+                   value="1"/>
+
+        <!-- a string attribute -->
+        <attribute name="temperature/description"
+                   value="Global array written from 'size' processes" 
+                   type="string"/>
+
+        <!-- attributes inheriting the type and value of the scalar variables -->
+        <attribute name="temperature/mean value"     var="mean"/>
+        <attribute name="temperature/date of coding" var="date"/>
+    </adios-group>
+
+    <method group="temperature" method="MPI"/>
+
+    <buffer size-MB="2" allocate-time="now"/>
+
+</adios-config>
+
diff --git a/examples/C/attributes/attributes_read.c b/tests/suite/programs/examples/attributes/attributes_read_C.c
similarity index 51%
copy from examples/C/attributes/attributes_read.c
copy to tests/suite/programs/examples/attributes/attributes_read_C.c
index d032252..66b341a 100644
--- a/examples/C/attributes/attributes_read.c
+++ b/tests/suite/programs/examples/attributes/attributes_read_C.c
@@ -16,6 +16,7 @@
 #include <string.h>
 #include "mpi.h"
 #include "adios_read.h"
+#include "core/adios_logger.h"
 
 int main (int argc, char ** argv) 
 {
@@ -31,10 +32,11 @@ int main (int argc, char ** argv)
     MPI_Comm_size (comm, &size);
 
     adios_read_init_method (method, comm, "verbose=3");
-    ADIOS_FILE * f = adios_read_open ("attributes.bp", method, comm, ADIOS_LOCKMODE_NONE, 0.0);
+    adios_logger_open ("log_read_C", rank);
+    ADIOS_FILE * f = adios_read_open ("attributes_C.bp", method, comm, ADIOS_LOCKMODE_NONE, 0.0);
     if (f == NULL)
     {
-        printf ("%s\n", adios_errmsg());
+        log_error ("%s\n", adios_errmsg());
         return -1;
     }
 
@@ -43,21 +45,34 @@ int main (int argc, char ** argv)
 
         adios_get_attr (f, f->attr_namelist[i], &attr_type, &attr_size, &data);
 
-        printf ("rank %d: attr: %s %s = ", rank, adios_type_to_string(attr_type), f->attr_namelist[i]);
-        switch (attr_type)  
+        log_test("rank %d: attr: %s %s = ", rank, adios_type_to_string(attr_type), f->attr_namelist[i]);
+        int type_size = adios_type_size (attr_type, data);
+        int nelems = attr_size / type_size;
+        int k;
+        char *p = (char*)data;
+        for (k=0; k<nelems; k++) 
         {
-            case adios_integer:
-                printf ("%d\n", *(int *)data);
-                break;
-            case adios_double:
-                printf ("%e\n", *(double *)data);
-                break;
-            case adios_string:
-                printf ("%s\n", (char *)data);
-                break;
-            default:
-                printf ("??????\n");
+            if (k>0) log_test(", ");
+            switch (attr_type)  
+            {
+                case adios_integer:
+                    log_test ("%d", *(int *)p);
+                    break;
+                case adios_double:
+                    log_test ("%e", *(double *)p);
+                    break;
+                case adios_string:
+                    log_test ("\"%s\"", (char *)p);
+                    break;
+                case adios_string_array:
+                    log_test ("\"%s\"", *(char **)p);
+                    break;
+                default:
+                    log_test ("??????\n");
+            }
+            p=p+type_size;
         }
+        log_test("\n");
         free (data);
         data = 0;
     }
@@ -65,6 +80,7 @@ int main (int argc, char ** argv)
     adios_read_close (f);
     MPI_Barrier (comm);
     adios_read_finalize_method (ADIOS_READ_METHOD_BP);
+    adios_logger_close();
     MPI_Finalize ();
     return 0;
 }
diff --git a/tests/suite/programs/examples/attributes/attributes_write_C.c b/tests/suite/programs/examples/attributes/attributes_write_C.c
new file mode 100644
index 0000000..04b5dd7
--- /dev/null
+++ b/tests/suite/programs/examples/attributes/attributes_write_C.c
@@ -0,0 +1,53 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/* ADIOS C Example: write some attributes along with variables
+*/
+#include <stdio.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios.h"
+int main (int argc, char ** argv) 
+{
+    char        filename [256];
+    int         rank, size, i;
+    int         NX = 10; 
+    double      t[NX], mean = 0;
+    MPI_Comm    comm = MPI_COMM_WORLD;
+    const char * str = "Nov, 2009";
+
+    /* ADIOS variables declarations for matching gwrite_temperature.ch */
+    uint64_t    adios_groupsize, adios_totalsize;
+    int64_t     adios_handle;
+
+    MPI_Init (&argc, &argv);
+    MPI_Comm_rank (comm, &rank);
+    MPI_Comm_size (comm, &size);
+
+    for (i = 0; i < NX; i++)
+    {
+        t[i] = rank * NX + i;
+        mean += t[i];
+    }
+
+    mean /= NX;
+
+    strcpy (filename, "attributes_C.bp");
+
+    adios_init ("attributes_C.xml", comm);
+
+    adios_open (&adios_handle, "temperature", filename, "w", comm);
+#include "gwrite_temperature.ch"
+    adios_close (adios_handle);
+
+    MPI_Barrier (comm);
+
+    adios_finalize (rank);
+
+    MPI_Finalize ();
+    return 0;
+}
diff --git a/tests/suite/programs/examples/global_array/CMakeLists.txt b/tests/suite/programs/examples/global_array/CMakeLists.txt
new file mode 100644
index 0000000..5edea06
--- /dev/null
+++ b/tests/suite/programs/examples/global_array/CMakeLists.txt
@@ -0,0 +1,64 @@
+include_directories(${PROJECT_SOURCE_DIR}/src/public)
+include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_SOURCE_DIR}/test/suite/programs/examples/global_array)
+include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
+link_directories(${PROJECT_BINARY_DIR}/test/suite/programs/examples/global_array)
+
+add_executable(global_array_write_C global_array_write_C.c)
+target_link_libraries(global_array_write_C adios ${ADIOSLIB_LDADD})
+add_custom_command(
+	OUTPUT gwrite_temperature.ch
+	COMMAND ${PROJECT_SOURCE_DIR}/utils/gpp/gpp.py ${PROJECT_SOURCE_DIR}/tests/suite/programs/examples/global_array/global_array_C.xml
+	DEPENDS global_array_C.xml
+	)
+
+add_executable(global_array_write_noxml_C global_array_write_noxml_C.c)
+target_link_libraries(global_array_write_noxml_C adios ${ADIOSLIB_LDADD})
+
+add_executable(global_array_write_byid_noxml_C global_array_write_byid_noxml_C.c)
+target_link_libraries(global_array_write_byid_noxml_C adios ${ADIOSLIB_LDADD})
+
+add_executable(global_array_aggregate_by_color_C global_array_aggregate_by_color_C.c)
+target_link_libraries(global_array_aggregate_by_color_C adios ${ADIOSLIB_LDADD})
+
+add_executable(global_array_read_C global_array_read_C.c)
+target_link_libraries(global_array_read_C adiosread ${ADIOSREADLIB_LDADD})
+
+add_executable(global_array_read_noxml_C global_array_read_noxml_C.c)
+target_link_libraries(global_array_read_noxml_C adiosread ${ADIOSREADLIB_LDADD})
+
+add_executable(global_array_read_byid_noxml_C global_array_read_byid_noxml_C.c)
+target_link_libraries(global_array_read_byid_noxml_C adiosread ${ADIOSREADLIB_LDADD})
+
+#set_target_properties(global_array_read_noxml_C PROPERTIES COMPILE_FLAGS "-DADIOS_USE_READ_API_1")
+
+set (PROGS global_array_write_C global_array_read_C global_array_write_noxml_C global_array_read_noxml_C)
+
+foreach (PROG ${PROGS} )
+  if(MPI_COMPILE_FLAGS)
+    set_target_properties(${PROG} PROPERTIES COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
+  endif()
+  if(MPI_LINK_FLAGS)
+    set_target_properties(${PROG} PROPERTIES LINK_FLAGS "${MPI_C_LINK_FLAGS}")
+  endif()
+  target_link_libraries(${PROG} adios ${MPI_C_LIBRARIES})
+endforeach()
+
+if(BUILD_FORTRAN)
+    add_executable(global_array_write_F global_array_write_F.F90)
+    target_link_libraries(global_array_write_F adiosf ${ADIOSLIB_LDADD})
+    add_custom_command(
+	OUTPUT gwrite_temperature.fh
+	COMMAND ${PROJECT_SOURCE_DIR}/utils/gpp/gpp.py ${PROJECT_SOURCE_DIR}/tests/suite/programs/examples/global_array/global_array_F.xml
+	DEPENDS global_array_F.xml
+	)
+    add_executable(global_array_write_noxml_F global_array_write_noxml_F.F90)
+    target_link_libraries(global_array_write_noxml_F adiosf ${ADIOSLIB_LDADD})
+    add_executable(global_array_write_byid_noxml_F global_array_write_byid_noxml_F.F90)
+    target_link_libraries(global_array_write_byid_noxml_F adiosf ${ADIOSLIB_LDADD})
+endif
+
+
+#install(FILES adios_global.xml gread_temperature.ch gwrite_temperature.ch job.pbs DESTINATION ${PROJECT_BINARY_DIR}/examples/C/global-array)
+
diff --git a/tests/suite/programs/examples/global_array/Makefile.am b/tests/suite/programs/examples/global_array/Makefile.am
new file mode 100644
index 0000000..d3eea1f
--- /dev/null
+++ b/tests/suite/programs/examples/global_array/Makefile.am
@@ -0,0 +1,83 @@
+AM_CPPFLAGS = $(all_includes)
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+
+AUTOMAKE_OPTIONS = no-dependencies
+
+all-local:
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+
+check_PROGRAMS = global_array_write_C global_array_read_C global_array_write_noxml_C global_array_read_noxml_C global_array_write_byid_noxml_C global_array_read_byid_noxml_C global_array_aggregate_by_color_C
+
+global_array_write_C_SOURCES = global_array_write_C.c
+global_array_write_C_LDADD = $(top_builddir)/src/libadios.a 
+global_array_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_write_C_LDADD += $(ADIOSLIB_LDADD)
+global_array_write_C.o: gwrite_temperature.ch 
+gwrite_temperature.ch: global_array_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/global_array_C.xml
+
+global_array_read_C_SOURCES = global_array_read_C.c
+global_array_read_C_LDADD = $(top_builddir)/src/libadiosread.a 
+global_array_read_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+global_array_read_C_LDADD += $(ADIOSREADLIB_LDADD)
+
+global_array_write_noxml_C_SOURCES = global_array_write_noxml_C.c
+global_array_write_noxml_C_LDADD = $(top_builddir)/src/libadios.a 
+global_array_write_noxml_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_write_noxml_C_LDADD += $(ADIOSLIB_LDADD)
+
+global_array_read_noxml_C_SOURCES = global_array_read_noxml_C.c
+global_array_read_noxml_C_LDADD = $(top_builddir)/src/libadiosread.a 
+global_array_read_noxml_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+global_array_read_noxml_C_LDADD += $(ADIOSREADLIB_LDADD)
+
+global_array_write_byid_noxml_C_SOURCES = global_array_write_byid_noxml_C.c
+global_array_write_byid_noxml_C_LDADD = $(top_builddir)/src/libadios.a 
+global_array_write_byid_noxml_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_write_byid_noxml_C_LDADD += $(ADIOSLIB_LDADD)
+
+global_array_read_byid_noxml_C_SOURCES = global_array_read_byid_noxml_C.c
+global_array_read_byid_noxml_C_LDADD = $(top_builddir)/src/libadiosread.a 
+global_array_read_byid_noxml_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+global_array_read_byid_noxml_C_LDADD += $(ADIOSREADLIB_LDADD)
+
+global_array_aggregate_by_color_C_SOURCES = global_array_aggregate_by_color_C.c
+global_array_aggregate_by_color_C_LDADD = $(top_builddir)/src/libadios.a 
+global_array_aggregate_by_color_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_aggregate_by_color_C_LDADD += $(ADIOSLIB_LDADD)
+
+CLEANFILES = *.bp *.ch *.fh
+CC=$(MPICC)
+EXTRA_DIST = global_array_C.xml global_array_F.xml 
+
+
+if BUILD_FORTRAN
+check_PROGRAMS += global_array_write_F global_array_write_noxml_F global_array_write_byid_noxml_F
+
+global_array_write_F_SOURCES = global_array_write_F.F90
+global_array_write_F_LDADD = $(top_builddir)/src/libadiosf.a 
+global_array_write_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_write_F_LDADD += $(ADIOSLIB_LDADD)
+global_array_write_F.o: gwrite_temperature.fh 
+gwrite_temperature.fh: global_array_F.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/global_array_F.xml
+
+global_array_write_noxml_F_SOURCES = global_array_write_noxml_F.F90
+global_array_write_noxml_F_LDADD = $(top_builddir)/src/libadiosf.a 
+global_array_write_noxml_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_write_noxml_F_LDADD += $(ADIOSLIB_LDADD)
+
+global_array_write_byid_noxml_F_SOURCES = global_array_write_byid_noxml_F.F90
+global_array_write_byid_noxml_F_LDADD = $(top_builddir)/src/libadiosf.a 
+global_array_write_byid_noxml_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_write_byid_noxml_F_LDADD += $(ADIOSLIB_LDADD)
+
+endif
+
+FC=$(MPIFC)
+
+FCLINK = \
+	$(LIBTOOL) --mode=link --tag F77 $(FC) \
+	$(AM_FCFLAGS) $(FCFLAGS) $(LDFLAGS) -o $@
+
+
diff --git a/tests/bp_read/Makefile.in b/tests/suite/programs/examples/global_array/Makefile.in
similarity index 59%
copy from tests/bp_read/Makefile.in
copy to tests/suite/programs/examples/global_array/Makefile.in
index 13d1612..bce3829 100644
--- a/tests/bp_read/Makefile.in
+++ b/tests/suite/programs/examples/global_array/Makefile.in
@@ -14,7 +14,6 @@
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
-
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
@@ -34,13 +33,16 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
- at BUILD_FORTRAN_FALSE@noinst_PROGRAMS = genbp$(EXEEXT) \
- at BUILD_FORTRAN_FALSE@	bp_read_c$(EXEEXT)
- at BUILD_FORTRAN_TRUE@noinst_PROGRAMS = genbp$(EXEEXT) \
- at BUILD_FORTRAN_TRUE@	bp_read_f$(EXEEXT) bp_read_f_v1$(EXEEXT) \
- at BUILD_FORTRAN_TRUE@	bp_read_c$(EXEEXT)
-subdir = tests/bp_read
-DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+check_PROGRAMS = global_array_write_C$(EXEEXT) \
+	global_array_read_C$(EXEEXT) \
+	global_array_write_noxml_C$(EXEEXT) \
+	global_array_read_noxml_C$(EXEEXT) \
+	global_array_write_byid_noxml_C$(EXEEXT) \
+	global_array_read_byid_noxml_C$(EXEEXT) \
+	global_array_aggregate_by_color_C$(EXEEXT) $(am__EXEEXT_1)
+ at BUILD_FORTRAN_TRUE@am__append_1 = global_array_write_F global_array_write_noxml_F global_array_write_byid_noxml_F
+subdir = tests/suite/programs/examples/global_array
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/ac_alacrity.m4 \
 	$(top_srcdir)/config/ac_aplod.m4 \
@@ -86,41 +88,109 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_bp_read_c_OBJECTS = bp_read_c-bp_read_c.$(OBJEXT)
-bp_read_c_OBJECTS = $(am_bp_read_c_OBJECTS)
+ at BUILD_FORTRAN_TRUE@am__EXEEXT_1 = global_array_write_F$(EXEEXT) \
+ at BUILD_FORTRAN_TRUE@	global_array_write_noxml_F$(EXEEXT) \
+ at BUILD_FORTRAN_TRUE@	global_array_write_byid_noxml_F$(EXEEXT)
+am_global_array_aggregate_by_color_C_OBJECTS =  \
+	global_array_aggregate_by_color_C.$(OBJEXT)
+global_array_aggregate_by_color_C_OBJECTS =  \
+	$(am_global_array_aggregate_by_color_C_OBJECTS)
 am__DEPENDENCIES_1 =
-bp_read_c_DEPENDENCIES = $(top_builddir)/src/libadiosread.a \
+global_array_aggregate_by_color_C_DEPENDENCIES =  \
+	$(top_builddir)/src/libadios.a $(am__DEPENDENCIES_1)
+global_array_aggregate_by_color_C_LINK = $(LIBTOOL) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) \
+	$(global_array_aggregate_by_color_C_LDFLAGS) $(LDFLAGS) -o $@
+am_global_array_read_C_OBJECTS = global_array_read_C.$(OBJEXT)
+global_array_read_C_OBJECTS = $(am_global_array_read_C_OBJECTS)
+global_array_read_C_DEPENDENCIES = $(top_builddir)/src/libadiosread.a \
+	$(am__DEPENDENCIES_1)
+global_array_read_C_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(global_array_read_C_LDFLAGS) $(LDFLAGS) -o $@
+am_global_array_read_byid_noxml_C_OBJECTS =  \
+	global_array_read_byid_noxml_C.$(OBJEXT)
+global_array_read_byid_noxml_C_OBJECTS =  \
+	$(am_global_array_read_byid_noxml_C_OBJECTS)
+global_array_read_byid_noxml_C_DEPENDENCIES =  \
+	$(top_builddir)/src/libadiosread.a $(am__DEPENDENCIES_1)
+global_array_read_byid_noxml_C_LINK = $(LIBTOOL) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) \
+	$(global_array_read_byid_noxml_C_LDFLAGS) $(LDFLAGS) -o $@
+am_global_array_read_noxml_C_OBJECTS =  \
+	global_array_read_noxml_C.$(OBJEXT)
+global_array_read_noxml_C_OBJECTS =  \
+	$(am_global_array_read_noxml_C_OBJECTS)
+global_array_read_noxml_C_DEPENDENCIES =  \
+	$(top_builddir)/src/libadiosread.a $(am__DEPENDENCIES_1)
+global_array_read_noxml_C_LINK = $(LIBTOOL) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(global_array_read_noxml_C_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_global_array_write_C_OBJECTS = global_array_write_C.$(OBJEXT)
+global_array_write_C_OBJECTS = $(am_global_array_write_C_OBJECTS)
+global_array_write_C_DEPENDENCIES = $(top_builddir)/src/libadios.a \
 	$(am__DEPENDENCIES_1)
-bp_read_c_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(bp_read_c_CFLAGS) \
-	$(CFLAGS) $(bp_read_c_LDFLAGS) $(LDFLAGS) -o $@
-am__bp_read_f_SOURCES_DIST = bp_read_f.F90
- at BUILD_FORTRAN_TRUE@am_bp_read_f_OBJECTS =  \
- at BUILD_FORTRAN_TRUE@	bp_read_f-bp_read_f.$(OBJEXT)
-bp_read_f_OBJECTS = $(am_bp_read_f_OBJECTS)
- at BUILD_FORTRAN_TRUE@bp_read_f_DEPENDENCIES =  \
- at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosreadf.a \
+global_array_write_C_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(global_array_write_C_LDFLAGS) $(LDFLAGS) -o $@
+am__global_array_write_F_SOURCES_DIST = global_array_write_F.F90
+ at BUILD_FORTRAN_TRUE@am_global_array_write_F_OBJECTS =  \
+ at BUILD_FORTRAN_TRUE@	global_array_write_F.$(OBJEXT)
+global_array_write_F_OBJECTS = $(am_global_array_write_F_OBJECTS)
+ at BUILD_FORTRAN_TRUE@global_array_write_F_DEPENDENCIES =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
 @BUILD_FORTRAN_TRUE@	$(am__DEPENDENCIES_1)
-bp_read_f_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \
+global_array_write_F_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
-	$(bp_read_f_LDFLAGS) $(LDFLAGS) -o $@
-am__bp_read_f_v1_SOURCES_DIST = bp_read_f_v1.F90
- at BUILD_FORTRAN_TRUE@am_bp_read_f_v1_OBJECTS =  \
- at BUILD_FORTRAN_TRUE@	bp_read_f_v1-bp_read_f_v1.$(OBJEXT)
-bp_read_f_v1_OBJECTS = $(am_bp_read_f_v1_OBJECTS)
- at BUILD_FORTRAN_TRUE@bp_read_f_v1_DEPENDENCIES =  \
- at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosreadf_v1.a \
+	$(global_array_write_F_LDFLAGS) $(LDFLAGS) -o $@
+am_global_array_write_byid_noxml_C_OBJECTS =  \
+	global_array_write_byid_noxml_C.$(OBJEXT)
+global_array_write_byid_noxml_C_OBJECTS =  \
+	$(am_global_array_write_byid_noxml_C_OBJECTS)
+global_array_write_byid_noxml_C_DEPENDENCIES =  \
+	$(top_builddir)/src/libadios.a $(am__DEPENDENCIES_1)
+global_array_write_byid_noxml_C_LINK = $(LIBTOOL) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) \
+	$(global_array_write_byid_noxml_C_LDFLAGS) $(LDFLAGS) -o $@
+am__global_array_write_byid_noxml_F_SOURCES_DIST =  \
+	global_array_write_byid_noxml_F.F90
+ at BUILD_FORTRAN_TRUE@am_global_array_write_byid_noxml_F_OBJECTS =  \
+ at BUILD_FORTRAN_TRUE@	global_array_write_byid_noxml_F.$(OBJEXT)
+global_array_write_byid_noxml_F_OBJECTS =  \
+	$(am_global_array_write_byid_noxml_F_OBJECTS)
+ at BUILD_FORTRAN_TRUE@global_array_write_byid_noxml_F_DEPENDENCIES =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
 @BUILD_FORTRAN_TRUE@	$(am__DEPENDENCIES_1)
-bp_read_f_v1_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
-	$(bp_read_f_v1_LDFLAGS) $(LDFLAGS) -o $@
-am_genbp_OBJECTS = genbp-genbp.$(OBJEXT)
-genbp_OBJECTS = $(am_genbp_OBJECTS)
-genbp_DEPENDENCIES = $(top_builddir)/src/libadios.a \
-	$(top_builddir)/src/libadiosread.a $(am__DEPENDENCIES_1)
-genbp_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(genbp_CFLAGS) $(CFLAGS) $(genbp_LDFLAGS) \
+global_array_write_byid_noxml_F_LINK = $(LIBTOOL) --tag=FC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(FCLD) \
+	$(AM_FCFLAGS) $(FCFLAGS) \
+	$(global_array_write_byid_noxml_F_LDFLAGS) $(LDFLAGS) -o $@
+am_global_array_write_noxml_C_OBJECTS =  \
+	global_array_write_noxml_C.$(OBJEXT)
+global_array_write_noxml_C_OBJECTS =  \
+	$(am_global_array_write_noxml_C_OBJECTS)
+global_array_write_noxml_C_DEPENDENCIES =  \
+	$(top_builddir)/src/libadios.a $(am__DEPENDENCIES_1)
+global_array_write_noxml_C_LINK = $(LIBTOOL) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(global_array_write_noxml_C_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am__global_array_write_noxml_F_SOURCES_DIST =  \
+	global_array_write_noxml_F.F90
+ at BUILD_FORTRAN_TRUE@am_global_array_write_noxml_F_OBJECTS =  \
+ at BUILD_FORTRAN_TRUE@	global_array_write_noxml_F.$(OBJEXT)
+global_array_write_noxml_F_OBJECTS =  \
+	$(am_global_array_write_noxml_F_OBJECTS)
+ at BUILD_FORTRAN_TRUE@global_array_write_noxml_F_DEPENDENCIES =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
+ at BUILD_FORTRAN_TRUE@	$(am__DEPENDENCIES_1)
+global_array_write_noxml_F_LINK = $(LIBTOOL) --tag=FC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(FCLD) \
+	$(AM_FCFLAGS) $(FCFLAGS) $(global_array_write_noxml_F_LDFLAGS) \
 	$(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp =
@@ -140,10 +210,26 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
-SOURCES = $(bp_read_c_SOURCES) $(bp_read_f_SOURCES) \
-	$(bp_read_f_v1_SOURCES) $(genbp_SOURCES)
-DIST_SOURCES = $(bp_read_c_SOURCES) $(am__bp_read_f_SOURCES_DIST) \
-	$(am__bp_read_f_v1_SOURCES_DIST) $(genbp_SOURCES)
+SOURCES = $(global_array_aggregate_by_color_C_SOURCES) \
+	$(global_array_read_C_SOURCES) \
+	$(global_array_read_byid_noxml_C_SOURCES) \
+	$(global_array_read_noxml_C_SOURCES) \
+	$(global_array_write_C_SOURCES) \
+	$(global_array_write_F_SOURCES) \
+	$(global_array_write_byid_noxml_C_SOURCES) \
+	$(global_array_write_byid_noxml_F_SOURCES) \
+	$(global_array_write_noxml_C_SOURCES) \
+	$(global_array_write_noxml_F_SOURCES)
+DIST_SOURCES = $(global_array_aggregate_by_color_C_SOURCES) \
+	$(global_array_read_C_SOURCES) \
+	$(global_array_read_byid_noxml_C_SOURCES) \
+	$(global_array_read_noxml_C_SOURCES) \
+	$(global_array_write_C_SOURCES) \
+	$(am__global_array_write_F_SOURCES_DIST) \
+	$(global_array_write_byid_noxml_C_SOURCES) \
+	$(am__global_array_write_byid_noxml_F_SOURCES_DIST) \
+	$(global_array_write_noxml_C_SOURCES) \
+	$(am__global_array_write_noxml_F_SOURCES_DIST)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -345,6 +431,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -403,37 +492,58 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
-
-# read_coords read_phi read_parts_global read_gena read_gena_pncd read_pixie_all
-genbp_SOURCES = genbp.c
-genbp_CPPFLAGS = $(AM_CPPFLAGS) $(ADIOSLIB_CPPFLAGS)
-genbp_CFLAGS = $(ADIOSLIB_CFLAGS)
-genbp_LDADD = $(top_builddir)/src/libadios.a $(top_builddir)/src/libadiosread.a $(ADIOSLIB_LDADD)
-genbp_LDFLAGS = $(ADIOSLIB_LDFLAGS) 
- at BUILD_FORTRAN_TRUE@bp_read_f_SOURCES = bp_read_f.F90
- at BUILD_FORTRAN_TRUE@bp_read_f_CPPFLAGS = $(AM_CPPFLAGS) $(ADIOSLIB_CPPFLAGS)
- at BUILD_FORTRAN_TRUE@bp_read_f_CFLAGS = $(ADIOSLIB_CFLAGS)
- at BUILD_FORTRAN_TRUE@bp_read_f_LDADD = $(top_builddir)/src/libadiosreadf.a $(ADIOSREADLIB_LDADD)
- at BUILD_FORTRAN_TRUE@bp_read_f_LDFLAGS = $(ADIOSREADLIB_LDFLAGS) 
- at BUILD_FORTRAN_TRUE@bp_read_f_v1_SOURCES = bp_read_f_v1.F90
- at BUILD_FORTRAN_TRUE@bp_read_f_v1_CPPFLAGS = $(AM_CPPFLAGS) $(ADIOSLIB_CPPFLAGS)
- at BUILD_FORTRAN_TRUE@bp_read_f_v1_CFLAGS = $(ADIOSLIB_CFLAGS)
- at BUILD_FORTRAN_TRUE@bp_read_f_v1_LDADD = $(top_builddir)/src/libadiosreadf_v1.a $(ADIOSREADLIB_LDADD)
- at BUILD_FORTRAN_TRUE@bp_read_f_v1_LDFLAGS = $(ADIOSREADLIB_LDFLAGS) 
-bp_read_c_SOURCES = bp_read_c.c
-bp_read_c_CPPFLAGS = -DADIOS_USE_READ_API_1 $(AM_CPPFLAGS) $(ADIOSLIB_CPPFLAGS)
-bp_read_c_CFLAGS = $(ADIOSLIB_CFLAGS)
-bp_read_c_LDADD = $(top_builddir)/src/libadiosread.a $(ADIOSREADLIB_LDADD)
-bp_read_c_LDFLAGS = $(ADIOSREADLIB_LDFLAGS) 
+global_array_write_C_SOURCES = global_array_write_C.c
+global_array_write_C_LDADD = $(top_builddir)/src/libadios.a \
+	$(ADIOSLIB_LDADD)
+global_array_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_read_C_SOURCES = global_array_read_C.c
+global_array_read_C_LDADD = $(top_builddir)/src/libadiosread.a \
+	$(ADIOSREADLIB_LDADD)
+global_array_read_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+global_array_write_noxml_C_SOURCES = global_array_write_noxml_C.c
+global_array_write_noxml_C_LDADD = $(top_builddir)/src/libadios.a \
+	$(ADIOSLIB_LDADD)
+global_array_write_noxml_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_read_noxml_C_SOURCES = global_array_read_noxml_C.c
+global_array_read_noxml_C_LDADD = $(top_builddir)/src/libadiosread.a \
+	$(ADIOSREADLIB_LDADD)
+global_array_read_noxml_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+global_array_write_byid_noxml_C_SOURCES = global_array_write_byid_noxml_C.c
+global_array_write_byid_noxml_C_LDADD =  \
+	$(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
+global_array_write_byid_noxml_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_read_byid_noxml_C_SOURCES = global_array_read_byid_noxml_C.c
+global_array_read_byid_noxml_C_LDADD =  \
+	$(top_builddir)/src/libadiosread.a $(ADIOSREADLIB_LDADD)
+global_array_read_byid_noxml_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+global_array_aggregate_by_color_C_SOURCES = global_array_aggregate_by_color_C.c
+global_array_aggregate_by_color_C_LDADD =  \
+	$(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
+global_array_aggregate_by_color_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+CLEANFILES = *.bp *.ch *.fh
+EXTRA_DIST = global_array_C.xml global_array_F.xml 
+ at BUILD_FORTRAN_TRUE@global_array_write_F_SOURCES = global_array_write_F.F90
+ at BUILD_FORTRAN_TRUE@global_array_write_F_LDADD =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
+ at BUILD_FORTRAN_TRUE@	$(ADIOSLIB_LDADD)
+ at BUILD_FORTRAN_TRUE@global_array_write_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+ at BUILD_FORTRAN_TRUE@global_array_write_noxml_F_SOURCES = global_array_write_noxml_F.F90
+ at BUILD_FORTRAN_TRUE@global_array_write_noxml_F_LDADD =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
+ at BUILD_FORTRAN_TRUE@	$(ADIOSLIB_LDADD)
+ at BUILD_FORTRAN_TRUE@global_array_write_noxml_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+ at BUILD_FORTRAN_TRUE@global_array_write_byid_noxml_F_SOURCES = global_array_write_byid_noxml_F.F90
+ at BUILD_FORTRAN_TRUE@global_array_write_byid_noxml_F_LDADD =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
+ at BUILD_FORTRAN_TRUE@	$(ADIOSLIB_LDADD)
+ at BUILD_FORTRAN_TRUE@global_array_write_byid_noxml_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
 FCLINK = \
-        $(LIBTOOL) --mode=link --tag F77 $(FC) \
-        $(AM_FCFLAGS) $(FCFLAGS) $(LDFLAGS) -o $@
+	$(LIBTOOL) --mode=link --tag F77 $(FC) \
+	$(AM_FCFLAGS) $(FCFLAGS) $(LDFLAGS) -o $@
 
- at BUILD_FORTRAN_FALSE@CLEANFILES = bp_read_c genbp read_coords read_phi read_parts_global
- at BUILD_FORTRAN_TRUE@CLEANFILES = bp_read_c bp_read_f genbp read_coords read_phi read_parts_global
-EXTRA_DIST = testbp_c.xml
 all: all-am
 
 .SUFFIXES:
@@ -447,9 +557,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/bp_read/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/suite/programs/examples/global_array/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu tests/bp_read/Makefile
+	  $(AUTOMAKE) --gnu tests/suite/programs/examples/global_array/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -469,26 +579,44 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
 	echo " rm -f" $$list; \
 	rm -f $$list || exit $$?; \
 	test -n "$(EXEEXT)" || exit 0; \
 	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
 	echo " rm -f" $$list; \
 	rm -f $$list
-bp_read_c$(EXEEXT): $(bp_read_c_OBJECTS) $(bp_read_c_DEPENDENCIES) 
-	@rm -f bp_read_c$(EXEEXT)
-	$(bp_read_c_LINK) $(bp_read_c_OBJECTS) $(bp_read_c_LDADD) $(LIBS)
-bp_read_f$(EXEEXT): $(bp_read_f_OBJECTS) $(bp_read_f_DEPENDENCIES) 
-	@rm -f bp_read_f$(EXEEXT)
-	$(bp_read_f_LINK) $(bp_read_f_OBJECTS) $(bp_read_f_LDADD) $(LIBS)
-bp_read_f_v1$(EXEEXT): $(bp_read_f_v1_OBJECTS) $(bp_read_f_v1_DEPENDENCIES) 
-	@rm -f bp_read_f_v1$(EXEEXT)
-	$(bp_read_f_v1_LINK) $(bp_read_f_v1_OBJECTS) $(bp_read_f_v1_LDADD) $(LIBS)
-genbp$(EXEEXT): $(genbp_OBJECTS) $(genbp_DEPENDENCIES) 
-	@rm -f genbp$(EXEEXT)
-	$(genbp_LINK) $(genbp_OBJECTS) $(genbp_LDADD) $(LIBS)
+global_array_aggregate_by_color_C$(EXEEXT): $(global_array_aggregate_by_color_C_OBJECTS) $(global_array_aggregate_by_color_C_DEPENDENCIES) 
+	@rm -f global_array_aggregate_by_color_C$(EXEEXT)
+	$(global_array_aggregate_by_color_C_LINK) $(global_array_aggregate_by_color_C_OBJECTS) $(global_array_aggregate_by_color_C_LDADD) $(LIBS)
+global_array_read_C$(EXEEXT): $(global_array_read_C_OBJECTS) $(global_array_read_C_DEPENDENCIES) 
+	@rm -f global_array_read_C$(EXEEXT)
+	$(global_array_read_C_LINK) $(global_array_read_C_OBJECTS) $(global_array_read_C_LDADD) $(LIBS)
+global_array_read_byid_noxml_C$(EXEEXT): $(global_array_read_byid_noxml_C_OBJECTS) $(global_array_read_byid_noxml_C_DEPENDENCIES) 
+	@rm -f global_array_read_byid_noxml_C$(EXEEXT)
+	$(global_array_read_byid_noxml_C_LINK) $(global_array_read_byid_noxml_C_OBJECTS) $(global_array_read_byid_noxml_C_LDADD) $(LIBS)
+global_array_read_noxml_C$(EXEEXT): $(global_array_read_noxml_C_OBJECTS) $(global_array_read_noxml_C_DEPENDENCIES) 
+	@rm -f global_array_read_noxml_C$(EXEEXT)
+	$(global_array_read_noxml_C_LINK) $(global_array_read_noxml_C_OBJECTS) $(global_array_read_noxml_C_LDADD) $(LIBS)
+global_array_write_C$(EXEEXT): $(global_array_write_C_OBJECTS) $(global_array_write_C_DEPENDENCIES) 
+	@rm -f global_array_write_C$(EXEEXT)
+	$(global_array_write_C_LINK) $(global_array_write_C_OBJECTS) $(global_array_write_C_LDADD) $(LIBS)
+global_array_write_F$(EXEEXT): $(global_array_write_F_OBJECTS) $(global_array_write_F_DEPENDENCIES) 
+	@rm -f global_array_write_F$(EXEEXT)
+	$(global_array_write_F_LINK) $(global_array_write_F_OBJECTS) $(global_array_write_F_LDADD) $(LIBS)
+global_array_write_byid_noxml_C$(EXEEXT): $(global_array_write_byid_noxml_C_OBJECTS) $(global_array_write_byid_noxml_C_DEPENDENCIES) 
+	@rm -f global_array_write_byid_noxml_C$(EXEEXT)
+	$(global_array_write_byid_noxml_C_LINK) $(global_array_write_byid_noxml_C_OBJECTS) $(global_array_write_byid_noxml_C_LDADD) $(LIBS)
+global_array_write_byid_noxml_F$(EXEEXT): $(global_array_write_byid_noxml_F_OBJECTS) $(global_array_write_byid_noxml_F_DEPENDENCIES) 
+	@rm -f global_array_write_byid_noxml_F$(EXEEXT)
+	$(global_array_write_byid_noxml_F_LINK) $(global_array_write_byid_noxml_F_OBJECTS) $(global_array_write_byid_noxml_F_LDADD) $(LIBS)
+global_array_write_noxml_C$(EXEEXT): $(global_array_write_noxml_C_OBJECTS) $(global_array_write_noxml_C_DEPENDENCIES) 
+	@rm -f global_array_write_noxml_C$(EXEEXT)
+	$(global_array_write_noxml_C_LINK) $(global_array_write_noxml_C_OBJECTS) $(global_array_write_noxml_C_LDADD) $(LIBS)
+global_array_write_noxml_F$(EXEEXT): $(global_array_write_noxml_F_OBJECTS) $(global_array_write_noxml_F_DEPENDENCIES) 
+	@rm -f global_array_write_noxml_F$(EXEEXT)
+	$(global_array_write_noxml_F_LINK) $(global_array_write_noxml_F_OBJECTS) $(global_array_write_noxml_F_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -505,18 +633,6 @@ distclean-compile:
 .F90.lo:
 	$(LTPPFCCOMPILE) -c -o $@ $<
 
-bp_read_f-bp_read_f.o: bp_read_f.F90
-	$(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bp_read_f_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS) -c -o bp_read_f-bp_read_f.o `test -f 'bp_read_f.F90' || echo '$(srcdir)/'`bp_read_f.F90
-
-bp_read_f-bp_read_f.obj: bp_read_f.F90
-	$(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bp_read_f_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS) -c -o bp_read_f-bp_read_f.obj `if test -f 'bp_read_f.F90'; then $(CYGPATH_W) 'bp_read_f.F90'; else $(CYGPATH_W) '$(srcdir)/bp_read_f.F90'; fi`
-
-bp_read_f_v1-bp_read_f_v1.o: bp_read_f_v1.F90
-	$(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bp_read_f_v1_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS) -c -o bp_read_f_v1-bp_read_f_v1.o `test -f 'bp_read_f_v1.F90' || echo '$(srcdir)/'`bp_read_f_v1.F90
-
-bp_read_f_v1-bp_read_f_v1.obj: bp_read_f_v1.F90
-	$(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bp_read_f_v1_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS) -c -o bp_read_f_v1-bp_read_f_v1.obj `if test -f 'bp_read_f_v1.F90'; then $(CYGPATH_W) 'bp_read_f_v1.F90'; else $(CYGPATH_W) '$(srcdir)/bp_read_f_v1.F90'; fi`
-
 .c.o:
 	$(COMPILE) -c $<
 
@@ -526,18 +642,6 @@ bp_read_f_v1-bp_read_f_v1.obj: bp_read_f_v1.F90
 .c.lo:
 	$(LTCOMPILE) -c -o $@ $<
 
-bp_read_c-bp_read_c.o: bp_read_c.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bp_read_c_CPPFLAGS) $(CPPFLAGS) $(bp_read_c_CFLAGS) $(CFLAGS) -c -o bp_read_c-bp_read_c.o `test -f 'bp_read_c.c' || echo '$(srcdir)/'`bp_read_c.c
-
-bp_read_c-bp_read_c.obj: bp_read_c.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bp_read_c_CPPFLAGS) $(CPPFLAGS) $(bp_read_c_CFLAGS) $(CFLAGS) -c -o bp_read_c-bp_read_c.obj `if test -f 'bp_read_c.c'; then $(CYGPATH_W) 'bp_read_c.c'; else $(CYGPATH_W) '$(srcdir)/bp_read_c.c'; fi`
-
-genbp-genbp.o: genbp.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(genbp_CPPFLAGS) $(CPPFLAGS) $(genbp_CFLAGS) $(CFLAGS) -c -o genbp-genbp.o `test -f 'genbp.c' || echo '$(srcdir)/'`genbp.c
-
-genbp-genbp.obj: genbp.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(genbp_CPPFLAGS) $(CPPFLAGS) $(genbp_CFLAGS) $(CFLAGS) -c -o genbp-genbp.obj `if test -f 'genbp.c'; then $(CYGPATH_W) 'genbp.c'; else $(CYGPATH_W) '$(srcdir)/genbp.c'; fi`
-
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -627,8 +731,9 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
 check: check-am
-all-am: Makefile $(PROGRAMS) all-local
+all-am: Makefile all-local
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -658,7 +763,7 @@ maintainer-clean-generic:
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
 	mostlyclean-am
 
 distclean: distclean-am
@@ -725,10 +830,10 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
-	clean-generic clean-libtool clean-noinstPROGRAMS ctags \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
@@ -743,7 +848,13 @@ uninstall-am:
 
 
 all-local:
-	test "$(srcdir)" = "$(builddir)" || cp $(srcdir)/*.xml $(builddir)
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+global_array_write_C.o: gwrite_temperature.ch 
+gwrite_temperature.ch: global_array_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/global_array_C.xml
+ at BUILD_FORTRAN_TRUE@global_array_write_F.o: gwrite_temperature.fh 
+ at BUILD_FORTRAN_TRUE@gwrite_temperature.fh: global_array_F.xml
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/global_array_F.xml
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/examples/C/global-array/adios_global.xml b/tests/suite/programs/examples/global_array/global_array_C.xml
similarity index 94%
copy from examples/C/global-array/adios_global.xml
copy to tests/suite/programs/examples/global_array/global_array_C.xml
index a3cfd4d..68ed5a7 100644
--- a/examples/C/global-array/adios_global.xml
+++ b/tests/suite/programs/examples/global_array/global_array_C.xml
@@ -15,7 +15,6 @@
 
   <method group="temperature" method="MPI"/>
   <!--method group="temperature" method="MPI_AGGREGATE">stripe_count=1;stripe_size=10485760;num_aggregators=2;merging_pgs=0;num_ost=2</method-->
-  <!--method group="temperature" method="PHDF5"/-->
  
   <buffer size-MB="2" allocate-time="now"/>
 
diff --git a/tests/suite/programs/examples/global_array/global_array_F.xml b/tests/suite/programs/examples/global_array/global_array_F.xml
new file mode 100644
index 0000000..ba89106
--- /dev/null
+++ b/tests/suite/programs/examples/global_array/global_array_F.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<adios-config host-language="Fortran">
+  <adios-group name="temperature">
+    <var name="NX" type="integer"/>
+    <var name="size" type="integer"/>
+    <var name="rank" type="integer"/>
+    <global-bounds dimensions="NX,size" offsets="0,rank">
+         <var name="temperature" gwrite="t" 
+              type="double" dimensions="NX,1"/>
+    </global-bounds>
+    <attribute name="temperature/description" 
+               value="Global array written from 'size' processes" 
+               type="string"/>
+  </adios-group>
+
+  <method group="temperature" method="MPI"/>
+
+  <buffer size-MB="2" allocate-time="now"/>
+
+</adios-config>
+
diff --git a/examples/C/global-array/no_xml_write_byid.c b/tests/suite/programs/examples/global_array/global_array_aggregate_by_color_C.c
similarity index 54%
copy from examples/C/global-array/no_xml_write_byid.c
copy to tests/suite/programs/examples/global_array/global_array_aggregate_by_color_C.c
index 2b6cbf9..e412c4d 100644
--- a/examples/C/global-array/no_xml_write_byid.c
+++ b/tests/suite/programs/examples/global_array/global_array_aggregate_by_color_C.c
@@ -7,8 +7,8 @@
 
 /* ADIOS C Example: write a global array from N processors with gwrite
  *
- * How to run: mpirun -np <N> adios_global_no_xml
- * Output: adios_global_no_xml.bp
+ * How to run: mpirun -np <N> global_array_aggregate_by_color_C
+ * Output: global_array_aggregate_by_color_C.bp
  * ADIOS config file: None
  *
 */
@@ -32,12 +32,11 @@
 int main (int argc, char ** argv) 
 {
 	char        filename [256];
-	int         rank, size, i, j;
-	int         NX = 100, gb, offset;  //local/global/offset
+        char        color_str[256];
+	int         rank, size, i, color;
+	int         NX = 100, Global_bounds, Offsets; 
 	double      t[NX];
-        int         nblocks = 3;
 	MPI_Comm    comm = MPI_COMM_WORLD;
-        char g_str[100], o_str[100], l_str[100];
 
 	/* ADIOS variables declarations for matching gwrite_temperature.ch */
 	uint64_t    adios_groupsize, adios_totalsize;
@@ -46,47 +45,54 @@ int main (int argc, char ** argv)
 	MPI_Comm_rank (comm, &rank);
 	MPI_Comm_size (comm, &size);
 
-        gb = nblocks * NX * size;
-        sprintf (g_str, "%d", gb);
-        sprintf (l_str, "%d", NX);
+        Global_bounds = NX * size;
 
-	strcpy (filename, "no_xml_write_byid.bp");
+	strcpy (filename, "global_array_aggregate_by_color_C.bp");
 
 	adios_init_noxml (comm);
         adios_allocate_buffer (ADIOS_BUFFER_ALLOC_NOW, 10);
 
         int64_t       m_adios_group;
         int64_t       m_adios_file;
-        int64_t       var_ids[nblocks];
 
         adios_declare_group (&m_adios_group, "restart", "iter", adios_flag_yes);
-        adios_select_method (m_adios_group, "MPI", "", "");
-
-        for (i = 0; i < nblocks; i++) 
-        {
-            offset = rank * nblocks * NX + i * NX;
-            sprintf (o_str, "%d", offset);
-            var_ids[i] = adios_define_var (m_adios_group, "temperature"
-                                          ,"", adios_double
-                                          ,l_str, g_str, o_str
-                                          );
-            adios_set_transform (var_ids[i], "identity");
-        }
+
+        // split into 2 groups 
+        color = (rank % 2 == 0 ? 0 : 1);
+        sprintf (color_str, "color=%d", color);
+        adios_select_method (m_adios_group, "MPI", color_str, "");
+
+        adios_define_var (m_adios_group, "NX"
+			,"", adios_integer
+			,0, 0, 0);
+   
+	adios_define_var (m_adios_group, "Global_bounds"
+			,"", adios_integer
+			,0, 0, 0);
+
+        adios_define_var (m_adios_group, "Offsets"
+                         ,"", adios_integer
+                         ,0, 0, 0);
+   
+       adios_define_var (m_adios_group, "temperature"
+                        ,"", adios_double
+                        ,"NX", "Global_bounds", "Offsets");
    
         adios_open (&m_adios_file, "restart", filename, "w", comm);
 
-        adios_groupsize = nblocks * (4 + 4 + 4 + NX * 8);
+        adios_groupsize = 4 + 4 + 4 + NX * 8;
 
         adios_group_size (m_adios_file, adios_groupsize, &adios_totalsize);
-/* now we will write the data for each sub block */
-        for (i = 0; i < nblocks; i++)
-        {
-           offset = rank * nblocks * NX + i * NX;
-           for (j = 0; j < NX; j++)
-               t[j] = offset + j;
-
-           adios_write_byid(m_adios_file, var_ids[i], t);
-        }
+	adios_write(m_adios_file, "NX", (void *) &NX);
+	adios_write(m_adios_file, "Global_bounds", (void *) &Global_bounds);
+
+        Offsets = rank * NX;
+        adios_write(m_adios_file, "Offsets", (void *) &Offsets);
+
+        for (i = 0; i < NX; i++)
+            t[i] = Offsets + i;
+
+        adios_write(m_adios_file, "temperature", t);
 
         adios_close (m_adios_file);
 
diff --git a/tests/suite/programs/examples/global_array/global_array_read_C.c b/tests/suite/programs/examples/global_array/global_array_read_C.c
new file mode 100644
index 0000000..426a8f9
--- /dev/null
+++ b/tests/suite/programs/examples/global_array/global_array_read_C.c
@@ -0,0 +1,90 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/* ADIOS C Example: read global arrays from a BP file
+ *
+ * This code is using the generic read API, which can read in
+ * arbitrary slices of an array and thus we can read in an array
+ * on arbitrary number of processes (provided our code is smart 
+ * enough to do the domain decomposition).
+ *
+ * Run this example after adios_global, which generates 
+ * global_array_C.bp. Run this example on equal or less 
+ * number of processes since we decompose only on one 
+ * dimension of the global array here. 
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios_read.h"
+#include "core/adios_logger.h"
+
+int main (int argc, char ** argv) 
+{
+    int         rank, size, i, j;
+    MPI_Comm    comm = MPI_COMM_WORLD;
+    enum ADIOS_READ_METHOD method = ADIOS_READ_METHOD_BP;
+    ADIOS_SELECTION * sel;
+    void * data = NULL;
+    uint64_t start[2], count[2];
+
+    MPI_Init (&argc, &argv);
+    MPI_Comm_rank (comm, &rank);
+    MPI_Comm_size (comm, &size);
+
+    adios_read_init_method (method, comm, "verbose=4");
+    adios_logger_open ("log_read_C", rank);
+
+    ADIOS_FILE * f = adios_read_open ("global_array_C.bp", method, comm, ADIOS_LOCKMODE_NONE, 0);
+    if (f == NULL)
+    {
+        log_error ("%s\n", adios_errmsg());
+        return -1;
+    }
+
+    ADIOS_VARINFO * v = adios_inq_var (f, "temperature");
+
+    /* Using less readers to read the global array back, i.e., non-uniform */
+    uint64_t slice_size = v->dims[0]/size;
+    start[0] = slice_size * rank;
+    if (rank == size-1) /* last rank may read more lines */
+        slice_size = slice_size + v->dims[0]%size;
+    count[0] = slice_size;
+
+    start[1] = 0;
+    count[1] = v->dims[1];
+       
+
+    data = malloc (slice_size * v->dims[1] * sizeof (double));
+    if (data == NULL)
+    {
+        log_error (stderr, "malloc failed.\n");
+        return -1;
+    }
+
+    /* Read a subset of the temperature array */
+    sel = adios_selection_boundingbox (v->ndim, start, count);
+    adios_schedule_read (f, sel, "temperature", 0, 1, data);
+    adios_perform_reads (f, 1);
+
+    for (i = 0; i < slice_size; i++) {
+        log_test ("rank %d: [%lld,%d:%lld]", rank, start[0]+i, 0, slice_size);
+        for (j = 0; j < v->dims[1]; j++)
+            log_test (" %6.6g", * ((double *)data + i * v->dims[1] + j));
+        log_test ("\n");
+    }
+
+    free (data);
+
+    adios_read_close (f);
+    MPI_Barrier (comm);
+    adios_read_finalize_method (method);
+    adios_logger_close();
+    MPI_Finalize ();
+    return 0;
+}
diff --git a/tests/suite/programs/examples/global_array/global_array_read_byid_noxml_C.c b/tests/suite/programs/examples/global_array/global_array_read_byid_noxml_C.c
new file mode 100644
index 0000000..42b0fd3
--- /dev/null
+++ b/tests/suite/programs/examples/global_array/global_array_read_byid_noxml_C.c
@@ -0,0 +1,103 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/* ADIOS C Example: read global arrays from a BP file
+ *
+ * This code is using the generic read API, which can read in
+ * arbitrary slices of an array and thus we can read in an array
+ * on arbitrary number of processes (provided our code is smart 
+ * enough to do the domain decomposition).
+ *
+ * Run this example after adios_global, which generates 
+ * adios_global.bp. Run this example on equal or less 
+ * number of processes since we decompose only on one 
+ * dimension of the global array here. 
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "mpi.h"
+#include "adios_read.h"
+#include "core/adios_logger.h"
+
+int main (int argc, char ** argv) 
+{
+    int         rank, size, i, j, npl, token;
+    MPI_Comm    comm = MPI_COMM_WORLD;
+    MPI_Status  status;
+    enum ADIOS_READ_METHOD method = ADIOS_READ_METHOD_BP;
+    ADIOS_SELECTION * sel;
+    void * data = NULL;
+    uint64_t start[1], count[1];
+
+    MPI_Init (&argc, &argv);
+    MPI_Comm_rank (comm, &rank);
+    MPI_Comm_size (comm, &size);
+
+    adios_read_init_method (method, comm, "verbose=3");
+    adios_logger_open ("log_read_C", rank);
+
+    ADIOS_FILE * f = adios_read_open ("global_array_byid_noxml_C.bp", method, 
+                                      comm, ADIOS_LOCKMODE_NONE, 0);
+    if (f == NULL)
+    {
+        log_error ("%s\n", adios_errmsg());
+        return -1;
+    }
+
+    ADIOS_VARINFO * v = adios_inq_var (f, "temperature");
+
+    /* Using less readers to read the global array back, i.e., non-uniform */
+    uint64_t slice_size = v->dims[0]/size;
+    start[0] = slice_size * rank;
+    if (rank == size-1) /* last rank may read more lines */
+        slice_size = slice_size + v->dims[0]%size;
+    count[0] = slice_size;
+
+    data = malloc (slice_size * sizeof (double));
+    if (data == NULL)
+    {
+        log_error (stderr, "malloc failed.\n");
+        return -1;
+    }
+
+    /* Read a subset of the temperature array */
+    sel = adios_selection_boundingbox (v->ndim, start, count);
+    adios_schedule_read (f, sel, "temperature", 0, 1, data);
+    adios_perform_reads (f, 1);
+
+    if (rank > 0) {
+        MPI_Recv (&token, 1, MPI_INT, rank-1, 0, comm, &status);
+    }
+
+    log_test (" ======== Rank %d ========== \n", rank);
+    npl = 10;
+    for (i = 0; i < slice_size; i+=npl) {
+        log_test ("[%4.4lld]  ", rank*slice_size+i);
+        for (j= 0; j < npl; j++) {
+            log_test (" %6.6g", * ((double *)data + i + j));
+        }
+        log_test ("\n");
+    }
+    fflush(stdout);
+    sleep(1);
+
+    if (rank < size-1) {
+        MPI_Send (&token, 1, MPI_INT, rank+1, 0, comm);
+    }
+
+
+    free (data);
+
+    adios_read_close (f);
+    MPI_Barrier (comm);
+    adios_read_finalize_method (method);
+    adios_logger_close ();
+    MPI_Finalize ();
+    return 0;
+}
diff --git a/tests/suite/programs/examples/global_array/global_array_read_noxml_C.c b/tests/suite/programs/examples/global_array/global_array_read_noxml_C.c
new file mode 100644
index 0000000..3bb846e
--- /dev/null
+++ b/tests/suite/programs/examples/global_array/global_array_read_noxml_C.c
@@ -0,0 +1,102 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/* ADIOS C Example: read global arrays from a BP file
+ *
+ * This code is using the generic read API, which can read in
+ * arbitrary slices of an array and thus we can read in an array
+ * on arbitrary number of processes (provided our code is smart 
+ * enough to do the domain decomposition).
+ *
+ * Run this example after adios_global, which generates 
+ * adios_global.bp. Run this example on equal or less 
+ * number of processes since we decompose only on one 
+ * dimension of the global array here. 
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "mpi.h"
+#include "adios_read.h"
+#include "core/adios_logger.h"
+
+int main (int argc, char ** argv) 
+{
+    int         rank, size, i, j, npl, token;
+    MPI_Comm    comm = MPI_COMM_WORLD;
+    MPI_Status  status;
+    enum ADIOS_READ_METHOD method = ADIOS_READ_METHOD_BP;
+    ADIOS_SELECTION * sel;
+    void * data = NULL;
+    uint64_t start[1], count[1];
+
+    MPI_Init (&argc, &argv);
+    MPI_Comm_rank (comm, &rank);
+    MPI_Comm_size (comm, &size);
+
+    adios_read_init_method (method, comm, "verbose=3");
+    adios_logger_open ("log_read_C", rank);
+
+    ADIOS_FILE * f = adios_read_open ("global_array_noxml_C.bp", method, 
+                                      comm, ADIOS_LOCKMODE_NONE, 0);
+    if (f == NULL)
+    {
+        log_error ("%s\n", adios_errmsg());
+        return -1;
+    }
+
+    ADIOS_VARINFO * v = adios_inq_var (f, "temperature");
+
+    /* Using less readers to read the global array back, i.e., non-uniform */
+    uint64_t slice_size = v->dims[0]/size;
+    start[0] = slice_size * rank;
+    if (rank == size-1) /* last rank may read more lines */
+        slice_size = slice_size + v->dims[0]%size;
+    count[0] = slice_size;
+
+    data = malloc (slice_size * sizeof (double));
+    if (data == NULL)
+    {
+        log_error (stderr, "malloc failed.\n");
+        return -1;
+    }
+
+    /* Read a subset of the temperature array */
+    sel = adios_selection_boundingbox (v->ndim, start, count);
+    adios_schedule_read (f, sel, "temperature", 0, 1, data);
+    adios_perform_reads (f, 1);
+
+    if (rank > 0) {
+        MPI_Recv (&token, 1, MPI_INT, rank-1, 0, comm, &status);
+    }
+
+    log_test (" ======== Rank %d ========== \n", rank);
+    npl = 10;
+    for (i = 0; i < slice_size; i+=npl) {
+        log_test ("[%4.4lld]  ", rank*slice_size+i);
+        for (j= 0; j < npl; j++) {
+            log_test (" %6.6g", * ((double *)data + i + j));
+        }
+        log_test ("\n");
+    }
+    fflush(stdout);
+    sleep(1);
+
+    if (rank < size-1) {
+        MPI_Send (&token, 1, MPI_INT, rank+1, 0, comm);
+    }
+
+    free (data);
+
+    adios_read_close (f);
+    MPI_Barrier (comm);
+    adios_read_finalize_method (method);
+    adios_logger_close ();
+    MPI_Finalize ();
+    return 0;
+}
diff --git a/tests/suite/programs/examples/global_array/global_array_write_C.c b/tests/suite/programs/examples/global_array/global_array_write_C.c
new file mode 100644
index 0000000..8e3f7f0
--- /dev/null
+++ b/tests/suite/programs/examples/global_array/global_array_write_C.c
@@ -0,0 +1,52 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/* ADIOS C Example: write a global array from N processors with gwrite
+ *
+ * How to run: mpirun -np <N> global_array_write_C
+ * Output: global_array_C.bp
+ * ADIOS config file: global_array_C.xml
+ *
+*/
+#include <stdio.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios.h"
+int main (int argc, char ** argv) 
+{
+	char        filename [256];
+	int         rank, size, i;
+	int         NX = 10;
+	double      t[NX];
+	MPI_Comm    comm = MPI_COMM_WORLD;
+
+	/* ADIOS variables declarations for matching gwrite_temperature.ch */
+	uint64_t    adios_groupsize, adios_totalsize;
+	int64_t     adios_handle;
+
+	MPI_Init (&argc, &argv);
+	MPI_Comm_rank (comm, &rank);
+	MPI_Comm_size (comm, &size);
+
+	for (i = 0; i < NX; i++)
+		t[i] = rank*NX + i;
+
+	strcpy (filename, "global_array_C.bp");
+
+	adios_init ("global_array_C.xml", comm);
+
+	adios_open (&adios_handle, "temperature", filename, "w", comm);
+	#include "gwrite_temperature.ch"
+	adios_close (adios_handle);
+
+        MPI_Barrier (comm);
+
+	adios_finalize (rank);
+
+	MPI_Finalize ();
+	return 0;
+}
diff --git a/tests/suite/programs/examples/global_array/global_array_write_F.F90 b/tests/suite/programs/examples/global_array/global_array_write_F.F90
new file mode 100644
index 0000000..643aa03
--- /dev/null
+++ b/tests/suite/programs/examples/global_array/global_array_write_F.F90
@@ -0,0 +1,50 @@
+!  
+!  ADIOS is freely available under the terms of the BSD license described
+!  in the COPYING file in the top level directory of this source distribution.
+!
+!  Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+!
+
+! ADIOS Fortran Example: write a global array from N processors with gwrite
+!
+! How to run: mpirun -np <N> global_array_write_F
+! Output: global_array_F.bp
+! ADIOS config file: global_array_F.xml
+!
+
+program global_array_F 
+    use adios_write_mod
+    implicit none
+    include 'mpif.h'
+    character(len=256)      :: filename = "global_array_F.bp"
+    integer                 :: rank, size, i, ierr
+    integer, parameter      :: NX = 10
+    real*8, dimension(NX)   :: t
+    integer                 :: comm
+
+    ! ADIOS variables declarations for matching gwrite_temperature.fh 
+    integer                 :: adios_err
+    integer*8               :: adios_groupsize, adios_totalsize
+    integer*8               :: adios_handle
+
+    call MPI_Init (ierr)
+    call MPI_Comm_dup (MPI_COMM_WORLD, comm, ierr)
+    call MPI_Comm_rank (comm, rank, ierr)
+    call MPI_Comm_size (comm, size, ierr)
+
+    do i = 1, NX
+        t(i)  = 10.0*rank+i-1
+    enddo
+
+    call adios_init ("global_array_F.xml", comm, adios_err)
+
+    call adios_open (adios_handle, "temperature", filename, "w", comm, adios_err)
+#include "gwrite_temperature.fh"
+    call adios_close (adios_handle, adios_err)
+
+    call MPI_Barrier (comm, ierr)
+
+    call adios_finalize (rank, adios_err)
+
+    call MPI_Finalize (ierr)
+end program
diff --git a/examples/C/global-array/no_xml_write_byid.c b/tests/suite/programs/examples/global_array/global_array_write_byid_noxml_C.c
similarity index 69%
copy from examples/C/global-array/no_xml_write_byid.c
copy to tests/suite/programs/examples/global_array/global_array_write_byid_noxml_C.c
index 2b6cbf9..24845aa 100644
--- a/examples/C/global-array/no_xml_write_byid.c
+++ b/tests/suite/programs/examples/global_array/global_array_write_byid_noxml_C.c
@@ -7,8 +7,8 @@
 
 /* ADIOS C Example: write a global array from N processors with gwrite
  *
- * How to run: mpirun -np <N> adios_global_no_xml
- * Output: adios_global_no_xml.bp
+ * How to run: mpirun -np <N> global_array_write_byid_noxml_C
+ * Output: global_array_byid_noxml_C.bp
  * ADIOS config file: None
  *
 */
@@ -38,6 +38,9 @@ int main (int argc, char ** argv)
         int         nblocks = 3;
 	MPI_Comm    comm = MPI_COMM_WORLD;
         char g_str[100], o_str[100], l_str[100];
+        // attributes (from C variables)
+        int someints[5] = {5,4,3,2,1};
+        double somedoubles[5] = {5.55555, 4.4444, 3.333, 2.22, 1.1};
 
 	/* ADIOS variables declarations for matching gwrite_temperature.ch */
 	uint64_t    adios_groupsize, adios_totalsize;
@@ -50,7 +53,7 @@ int main (int argc, char ** argv)
         sprintf (g_str, "%d", gb);
         sprintf (l_str, "%d", NX);
 
-	strcpy (filename, "no_xml_write_byid.bp");
+	strcpy (filename, "global_array_byid_noxml_C.bp");
 
 	adios_init_noxml (comm);
         adios_allocate_buffer (ADIOS_BUFFER_ALLOC_NOW, 10);
@@ -70,9 +73,26 @@ int main (int argc, char ** argv)
                                           ,"", adios_double
                                           ,l_str, g_str, o_str
                                           );
-            adios_set_transform (var_ids[i], "identity");
+            adios_set_transform (var_ids[i], "none");
         }
-   
+
+        // add some attributes
+        adios_define_attribute_byvalue (m_adios_group, 
+                "single_string","", adios_string,  1, "A single string attribute");
+        char *strings[] = {"X","Yy","ZzZ"};
+        adios_define_attribute_byvalue (m_adios_group, 
+                "three_strings","", adios_string_array,  3, strings);
+        adios_define_attribute_byvalue (m_adios_group, 
+                "single_int",   "", adios_integer, 1, &someints);
+        adios_define_attribute_byvalue (m_adios_group, 
+                "single_double","", adios_double,  1, &somedoubles);
+        adios_define_attribute_byvalue (m_adios_group, 
+                "five_ints",    "", adios_integer, 5, &someints);
+        adios_define_attribute_byvalue (m_adios_group, 
+                "five_double",  "", adios_double,  5, &somedoubles);
+
+
+
         adios_open (&m_adios_file, "restart", filename, "w", comm);
 
         adios_groupsize = nblocks * (4 + 4 + 4 + NX * 8);
diff --git a/examples/Fortran/global-array/no_xml_write_byid.F90 b/tests/suite/programs/examples/global_array/global_array_write_byid_noxml_F.F90
similarity index 71%
copy from examples/Fortran/global-array/no_xml_write_byid.F90
copy to tests/suite/programs/examples/global_array/global_array_write_byid_noxml_F.F90
index 23dcc03..3402b89 100644
--- a/examples/Fortran/global-array/no_xml_write_byid.F90
+++ b/tests/suite/programs/examples/global_array/global_array_write_byid_noxml_F.F90
@@ -16,7 +16,7 @@ program no_xml_write_byid
     use adios_write_mod
     implicit none
     include 'mpif.h'
-    character(len=256)      :: filename = "no_xml_write_byid.bp"
+    character(len=256)      :: filename = "global_array_byid_noxml_F.bp"
     integer                 :: rank, size, i, ierr
     integer,parameter       :: NX=10
     integer                 :: O, G
@@ -29,6 +29,11 @@ program no_xml_write_byid
     integer*8               :: m_adios_group
     integer*8               :: var_id1, var_id2
     character(len=32)       :: local, global, offset
+    !! attributes (from C variables)
+    integer, dimension(5)   :: someints = (/ 5,4,3,2,1 /)
+    real*8, dimension(5)    :: somedoubles = (/ 5.55555, 4.4444, 3.333, 2.22, 1.1 /)
+    character(len=5), dimension(3) :: three_strings = (/ "X    ", "Yy   ", "ZzZ  " /)
+
 
     call MPI_Init (ierr)
     call MPI_Comm_dup (MPI_COMM_WORLD, comm, ierr)
@@ -65,6 +70,22 @@ program no_xml_write_byid
 
     call adios_set_transform (var_id2, "identity", adios_err)
 
+
+    !! add some attributes
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "single_string","", 1, "A single string attribute", adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "three_strings","", 3, three_strings, adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "single_int",   "", 1, someints, adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "single_double","", 1, somedoubles, adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "five_ints",    "", 5, someints, adios_err)
+    call adios_define_attribute_byvalue (m_adios_group, &
+            "five_double",  "", 5, somedoubles, adios_err)
+
+
     call adios_open (adios_handle, "restart", filename, "w", comm, adios_err)
 
     adios_groupsize =  NX * 8 &
diff --git a/examples/C/global-array/no_xml_write_byid.c b/tests/suite/programs/examples/global_array/global_array_write_noxml_C.c
similarity index 55%
copy from examples/C/global-array/no_xml_write_byid.c
copy to tests/suite/programs/examples/global_array/global_array_write_noxml_C.c
index 2b6cbf9..83035c1 100644
--- a/examples/C/global-array/no_xml_write_byid.c
+++ b/tests/suite/programs/examples/global_array/global_array_write_noxml_C.c
@@ -7,8 +7,8 @@
 
 /* ADIOS C Example: write a global array from N processors with gwrite
  *
- * How to run: mpirun -np <N> adios_global_no_xml
- * Output: adios_global_no_xml.bp
+ * How to run: mpirun -np <N> global_array_write_noxml_C
+ * Output: global_array_noxml_C.bp
  * ADIOS config file: None
  *
 */
@@ -32,12 +32,11 @@
 int main (int argc, char ** argv) 
 {
 	char        filename [256];
-	int         rank, size, i, j;
-	int         NX = 100, gb, offset;  //local/global/offset
+	int         rank, size, i, block;
+	int         NX = 100, Global_bounds, Offsets; 
 	double      t[NX];
-        int         nblocks = 3;
+        int         sub_blocks = 3;
 	MPI_Comm    comm = MPI_COMM_WORLD;
-        char g_str[100], o_str[100], l_str[100];
 
 	/* ADIOS variables declarations for matching gwrite_temperature.ch */
 	uint64_t    adios_groupsize, adios_totalsize;
@@ -46,46 +45,58 @@ int main (int argc, char ** argv)
 	MPI_Comm_rank (comm, &rank);
 	MPI_Comm_size (comm, &size);
 
-        gb = nblocks * NX * size;
-        sprintf (g_str, "%d", gb);
-        sprintf (l_str, "%d", NX);
+        Global_bounds = sub_blocks * NX * size;
 
-	strcpy (filename, "no_xml_write_byid.bp");
+	strcpy (filename, "global_array_noxml_C.bp");
 
 	adios_init_noxml (comm);
         adios_allocate_buffer (ADIOS_BUFFER_ALLOC_NOW, 10);
 
         int64_t       m_adios_group;
         int64_t       m_adios_file;
-        int64_t       var_ids[nblocks];
 
         adios_declare_group (&m_adios_group, "restart", "iter", adios_flag_yes);
         adios_select_method (m_adios_group, "MPI", "", "");
 
-        for (i = 0; i < nblocks; i++) 
-        {
-            offset = rank * nblocks * NX + i * NX;
-            sprintf (o_str, "%d", offset);
-            var_ids[i] = adios_define_var (m_adios_group, "temperature"
-                                          ,"", adios_double
-                                          ,l_str, g_str, o_str
-                                          );
-            adios_set_transform (var_ids[i], "identity");
+
+        adios_define_var (m_adios_group, "NX"
+			,"", adios_integer
+			,0, 0, 0);
+   
+	adios_define_var (m_adios_group, "Global_bounds"
+			,"", adios_integer
+			,0, 0, 0);
+
+        for (i=0;i<sub_blocks;i++) {
+   
+           adios_define_var (m_adios_group, "Offsets"
+                        ,"", adios_integer
+                        ,0, 0, 0);
+   
+           int64_t varid;
+           varid = adios_define_var (m_adios_group, "temperature"
+                        ,"", adios_double
+                        ,"NX", "Global_bounds", "Offsets");
+           adios_set_transform (varid, "none");
         }
    
         adios_open (&m_adios_file, "restart", filename, "w", comm);
 
-        adios_groupsize = nblocks * (4 + 4 + 4 + NX * 8);
+        adios_groupsize = sub_blocks * (4 + 4 + 4 + NX * 8);
 
         adios_group_size (m_adios_file, adios_groupsize, &adios_totalsize);
+	adios_write(m_adios_file, "NX", (void *) &NX);
+	adios_write(m_adios_file, "Global_bounds", (void *) &Global_bounds);
 /* now we will write the data for each sub block */
-        for (i = 0; i < nblocks; i++)
-        {
-           offset = rank * nblocks * NX + i * NX;
-           for (j = 0; j < NX; j++)
-               t[j] = offset + j;
+        for (block=0;block<sub_blocks;block++) {
+
+           Offsets = rank * sub_blocks * NX + block*NX;
+           adios_write(m_adios_file, "Offsets", (void *) &Offsets);
+
+           for (i = 0; i < NX; i++)
+               t[i] = Offsets + i;
 
-           adios_write_byid(m_adios_file, var_ids[i], t);
+           adios_write(m_adios_file, "temperature", t);
         }
 
         adios_close (m_adios_file);
diff --git a/examples/Fortran/global-array/no_xml_write_byid.F90 b/tests/suite/programs/examples/global_array/global_array_write_noxml_F.F90
similarity index 51%
copy from examples/Fortran/global-array/no_xml_write_byid.F90
copy to tests/suite/programs/examples/global_array/global_array_write_noxml_F.F90
index 23dcc03..da5e123 100644
--- a/examples/Fortran/global-array/no_xml_write_byid.F90
+++ b/tests/suite/programs/examples/global_array/global_array_write_noxml_F.F90
@@ -7,16 +7,16 @@
 
 ! ADIOS Fortran Example: write a global array from N processors using No-XML API. 
 ! The example also shows how to do multi-writes in ADIOS.
-! How to run: mpirun -np <N> adios_global_no_xml
-! Output: adios_global_no_xml.bp
+! How to run: mpirun -np <N> global_array_write_noxml_F
+! Output: global_array_noxml_F.bp
 ! ADIOS config file: None
 !
 
-program no_xml_write_byid
+program adios_global 
     use adios_write_mod
     implicit none
     include 'mpif.h'
-    character(len=256)      :: filename = "no_xml_write_byid.bp"
+    character(len=256)      :: filename = "global_array_noxml_F.bp"
     integer                 :: rank, size, i, ierr
     integer,parameter       :: NX=10
     integer                 :: O, G
@@ -27,8 +27,7 @@ program no_xml_write_byid
     integer*8               :: adios_groupsize, adios_totalsize
     integer*8               :: adios_handle
     integer*8               :: m_adios_group
-    integer*8               :: var_id1, var_id2
-    character(len=32)       :: local, global, offset
+    integer*8               :: varid
 
     call MPI_Init (ierr)
     call MPI_Comm_dup (MPI_COMM_WORLD, comm, ierr)
@@ -41,48 +40,69 @@ program no_xml_write_byid
     call adios_declare_group (m_adios_group, "restart", "iter", 1, adios_err)
     call adios_select_method (m_adios_group, "MPI", "", "", adios_err)
 
-    G = 2 * NX * size
-    O = 2 * NX * rank
-
-    write (local, "(I2)") NX
-    write (global, "(I3)") G
-    write (offset, "(I3)") O
-
+    ! This example doesn't use varid during writing.
+    ! So we simply put 'varid' everywhere.
+    ! define a integer
+    call adios_define_var (m_adios_group, "NX" &
+                          ,"", 2 &
+                          ,"", "", "", varid)
+    ! define a integer
+    call adios_define_var (m_adios_group, "G" &
+                          ,"", 2 &
+                          ,"", "", "", varid)
+    ! define a integer
+    call adios_define_var (m_adios_group, "O" &
+                          ,"", 2 &
+                          ,"", "", "", varid)
     ! define a global array
     call adios_define_var (m_adios_group, "temperature" &
                           ,"", 6 &
-                          ,local, global, offset, var_id1)
-
-    call adios_set_transform (var_id1, "identity", adios_err)
-
-
-    write (offset, "(I3)") O + NX
-
+                          ,"NX", "G", "O", varid)
+
+    ! define a integer
+    call adios_define_var (m_adios_group, "NX" &
+                          ,"", 2 &
+                          ,"", "", "", varid) 
+    ! define a integer
+    call adios_define_var (m_adios_group, "G" &
+                          ,"", 2 &
+                          ,"", "", "", varid)
+    ! define a integer
+    call adios_define_var (m_adios_group, "O" &
+                          ,"", 2 &
+                          ,"", "", "", varid)
     ! define a global array
     call adios_define_var (m_adios_group, "temperature" &
                           ,"", 6 &
-                          ,local, global, offset, var_id2)
-
-    call adios_set_transform (var_id2, "identity", adios_err)
+                          ,"NX", "G", "O", varid) 
 
     call adios_open (adios_handle, "restart", filename, "w", comm, adios_err)
 
-    adios_groupsize =  NX * 8 &
-                    +  NX * 8
+    adios_groupsize = 4 + 4 + 4 + NX * 8 &
+                    + 4 + 4 + 4 + NX * 8
     call adios_group_size (adios_handle, adios_groupsize, adios_totalsize, adios_err)
 
+    G = 2 * NX * size
+    O = 2 * NX * rank
     do i = 1, NX
         t(i)  = O + i - 1
     enddo
 
-    call adios_write_byid (adios_handle, var_id1, t, adios_err)
+    call adios_write (adios_handle, "NX", NX, adios_err)
+    call adios_write (adios_handle, "G", G, adios_err)
+    call adios_write (adios_handle, "O", O, adios_err)
+    call adios_write (adios_handle, "temperature", t, adios_err)
+
 
     O = 2 * NX * rank + NX
     do i = 1, NX
         t(i)  = O + i - 1
     enddo
 
-    call adios_write_byid (adios_handle, var_id2, t, adios_err)
+    call adios_write (adios_handle, "NX", NX, adios_err)
+    call adios_write (adios_handle, "G", G, adios_err)
+    call adios_write (adios_handle, "O", O, adios_err)
+    call adios_write (adios_handle, "temperature", t, adios_err)
 
     call adios_close (adios_handle, adios_err)
 
diff --git a/tests/suite/programs/examples/global_array_time/CMakeLists.txt b/tests/suite/programs/examples/global_array_time/CMakeLists.txt
new file mode 100644
index 0000000..7f9890b
--- /dev/null
+++ b/tests/suite/programs/examples/global_array_time/CMakeLists.txt
@@ -0,0 +1,47 @@
+include_directories(${PROJECT_SOURCE_DIR}/src/public)
+include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_SOURCE_DIR}/test/suite/programs/examples/global_array_time)
+include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
+link_directories(${PROJECT_BINARY_DIR}/test/suite/programs/examples/global_array_time)
+
+add_executable(global_array_time_write_C global_array_time_write_C.c)
+target_link_libraries(global_array_time_write_C adios ${ADIOSLIB_LDADD})
+add_custom_command(
+        OUTPUT gwrite_restart.ch
+        COMMAND ${PROJECT_SOURCE_DIR}/utils/gpp/gpp.py
+        ${PROJECT_SOURCE_DIR}/tests/suite/programs/examples/global_array_time/global_array_time_C.xml
+        DEPENDS global_array_C.xml
+        )
+
+add_executable(global_array_time_read_as_file_C global_array_time_read_as_file_C.c)
+target_link_libraries(global_array_time_read_as_file_C adiosread ${ADIOSREADLIB_LDADD})
+#set_target_properties(global_array_time_read_as_file_C PROPERTIES COMPILE_FLAGS "-DADIOS_USE_READ_API_1")
+
+add_executable(global_array_time_read_as_stream_C global_array_time_read_as_stream_C.c)
+target_link_libraries(global_array_time_read_as_stream_C adiosread ${ADIOSREADLIB_LDADD})
+
+set (PROGS global_array_time_read_as_stream_C global_array_time_read_as_file_C global_array_time_write_C)
+foreach (PROG ${PROGS} )
+  if(MPI_COMPILE_FLAGS)
+    set_target_properties(${PROG} PROPERTIES COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
+  endif()
+  if(MPI_LINK_FLAGS)
+    set_target_properties(${PROG} PROPERTIES LINK_FLAGS "${MPI_C_LINK_FLAGS}")
+  endif()
+  target_link_libraries(${PROG} adios ${MPI_C_LIBRARIES})
+endforeach()
+
+
+if(BUILD_FORTRAN)
+    add_executable(global_array_time_write_F global_array_time_write_F.F90)
+    target_link_libraries(global_array_time_write_F adiosf ${ADIOSLIB_LDADD})
+    add_custom_command(
+        OUTPUT gwrite_restart.fh
+        COMMAND ${PROJECT_SOURCE_DIR}/utils/gpp/gpp.py
+        ${PROJECT_SOURCE_DIR}/tests/suite/programs/examples/global_array_time/global_array_time_F.xml
+        DEPENDS global_array_F.xml
+        )
+endif
+
+#install(FILES global_array_time_write_C.xml gread_restart.ch gwrite_restart.ch job.pbs DESTINATION ${PROJECT_BINARY_DIR}/examples/C/global-array-time)
diff --git a/tests/suite/programs/examples/global_array_time/Makefile.am b/tests/suite/programs/examples/global_array_time/Makefile.am
new file mode 100644
index 0000000..9cab5a9
--- /dev/null
+++ b/tests/suite/programs/examples/global_array_time/Makefile.am
@@ -0,0 +1,52 @@
+AM_CPPFLAGS = $(all_includes)
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+
+AUTOMAKE_OPTIONS = no-dependencies
+
+all-local:
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+
+check_PROGRAMS = global_array_time_write_C global_array_time_read_as_file_C global_array_time_read_as_stream_C
+
+global_array_time_write_C_SOURCES = global_array_time_write_C.c
+global_array_time_write_C_LDADD = $(top_builddir)/src/libadios.a
+global_array_time_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_time_write_C_LDADD += $(ADIOSLIB_LDADD)
+global_array_time_write_C.o: gwrite_restart.ch
+gwrite_restart.ch: global_array_time_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/global_array_time_C.xml
+
+global_array_time_read_as_file_C_SOURCES = global_array_time_read_as_file_C.c
+global_array_time_read_as_file_C_LDADD = $(top_builddir)/src/libadiosread.a
+global_array_time_read_as_file_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+global_array_time_read_as_file_C_LDADD += $(ADIOSREADLIB_LDADD)
+
+global_array_time_read_as_stream_C_SOURCES = global_array_time_read_as_stream_C.c
+global_array_time_read_as_stream_C_LDADD = $(top_builddir)/src/libadiosread.a
+global_array_time_read_as_stream_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+global_array_time_read_as_stream_C_LDADD += $(ADIOSREADLIB_LDADD)
+
+CLEANFILES = *.bp *.ch *.fh
+CC=$(MPICC)
+EXTRA_DIST = global_array_time_C.xml global_array_time_F.xml
+
+if BUILD_FORTRAN
+check_PROGRAMS += global_array_time_write_F
+
+global_array_time_write_F_SOURCES = global_array_time_write_F.F90
+global_array_time_write_F_LDADD = $(top_builddir)/src/libadiosf.a
+global_array_time_write_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_time_write_F_LDADD += $(ADIOSLIB_LDADD)
+global_array_time_write_F.o: gwrite_restart.fh
+gwrite_restart.fh: global_array_time_F.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/global_array_time_F.xml
+
+endif
+
+FC=$(MPIFC)
+
+FCLINK = \
+        $(LIBTOOL) --mode=link --tag F77 $(FC) \
+        $(AM_FCFLAGS) $(FCFLAGS) $(LDFLAGS) -o $@
+
+
diff --git a/examples/C/global-array-time/Makefile.in b/tests/suite/programs/examples/global_array_time/Makefile.in
similarity index 73%
copy from examples/C/global-array-time/Makefile.in
copy to tests/suite/programs/examples/global_array_time/Makefile.in
index 7bab32b..0dc344f 100644
--- a/examples/C/global-array-time/Makefile.in
+++ b/tests/suite/programs/examples/global_array_time/Makefile.in
@@ -14,7 +14,6 @@
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
-
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
@@ -34,11 +33,11 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-noinst_PROGRAMS = adios_globaltime$(EXEEXT) \
-	adios_globaltime_no_xml$(EXEEXT) \
-	adios_read_globaltime$(EXEEXT) \
-	adios_read_globaltime_streaming$(EXEEXT)
-subdir = examples/C/global-array-time
+check_PROGRAMS = global_array_time_write_C$(EXEEXT) \
+	global_array_time_read_as_file_C$(EXEEXT) \
+	global_array_time_read_as_stream_C$(EXEEXT) $(am__EXEEXT_1)
+ at BUILD_FORTRAN_TRUE@am__append_1 = global_array_time_write_F
+subdir = tests/suite/programs/examples/global_array_time
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/ac_alacrity.m4 \
@@ -85,44 +84,60 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_adios_globaltime_OBJECTS = adios_globaltime.$(OBJEXT)
-adios_globaltime_OBJECTS = $(am_adios_globaltime_OBJECTS)
+ at BUILD_FORTRAN_TRUE@am__EXEEXT_1 = global_array_time_write_F$(EXEEXT)
+am_global_array_time_read_as_file_C_OBJECTS =  \
+	global_array_time_read_as_file_C.$(OBJEXT)
+global_array_time_read_as_file_C_OBJECTS =  \
+	$(am_global_array_time_read_as_file_C_OBJECTS)
 am__DEPENDENCIES_1 =
-adios_globaltime_DEPENDENCIES = $(top_builddir)/src/libadios.a \
-	$(am__DEPENDENCIES_1)
-adios_globaltime_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(adios_globaltime_LDFLAGS) $(LDFLAGS) -o $@
-am_adios_globaltime_no_xml_OBJECTS =  \
-	adios_globaltime_no_xml.$(OBJEXT)
-adios_globaltime_no_xml_OBJECTS =  \
-	$(am_adios_globaltime_no_xml_OBJECTS)
-adios_globaltime_no_xml_DEPENDENCIES = $(top_builddir)/src/libadios.a \
-	$(am__DEPENDENCIES_1)
-adios_globaltime_no_xml_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(adios_globaltime_no_xml_LDFLAGS) $(LDFLAGS) -o $@
-am_adios_read_globaltime_OBJECTS = adios_read_globaltime.$(OBJEXT)
-adios_read_globaltime_OBJECTS = $(am_adios_read_globaltime_OBJECTS)
-adios_read_globaltime_DEPENDENCIES =  \
+global_array_time_read_as_file_C_DEPENDENCIES =  \
 	$(top_builddir)/src/libadiosread.a $(am__DEPENDENCIES_1)
-adios_read_globaltime_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(adios_read_globaltime_LDFLAGS) $(LDFLAGS) -o $@
-am_adios_read_globaltime_streaming_OBJECTS =  \
-	adios_read_globaltime_streaming.$(OBJEXT)
-adios_read_globaltime_streaming_OBJECTS =  \
-	$(am_adios_read_globaltime_streaming_OBJECTS)
-adios_read_globaltime_streaming_DEPENDENCIES =  \
+global_array_time_read_as_file_C_LINK = $(LIBTOOL) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) \
+	$(global_array_time_read_as_file_C_LDFLAGS) $(LDFLAGS) -o $@
+am_global_array_time_read_as_stream_C_OBJECTS =  \
+	global_array_time_read_as_stream_C.$(OBJEXT)
+global_array_time_read_as_stream_C_OBJECTS =  \
+	$(am_global_array_time_read_as_stream_C_OBJECTS)
+global_array_time_read_as_stream_C_DEPENDENCIES =  \
 	$(top_builddir)/src/libadiosread.a $(am__DEPENDENCIES_1)
-adios_read_globaltime_streaming_LINK = $(LIBTOOL) --tag=CC \
+global_array_time_read_as_stream_C_LINK = $(LIBTOOL) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(AM_CFLAGS) $(CFLAGS) \
-	$(adios_read_globaltime_streaming_LDFLAGS) $(LDFLAGS) -o $@
+	$(global_array_time_read_as_stream_C_LDFLAGS) $(LDFLAGS) -o $@
+am_global_array_time_write_C_OBJECTS =  \
+	global_array_time_write_C.$(OBJEXT)
+global_array_time_write_C_OBJECTS =  \
+	$(am_global_array_time_write_C_OBJECTS)
+global_array_time_write_C_DEPENDENCIES =  \
+	$(top_builddir)/src/libadios.a $(am__DEPENDENCIES_1)
+global_array_time_write_C_LINK = $(LIBTOOL) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(global_array_time_write_C_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am__global_array_time_write_F_SOURCES_DIST =  \
+	global_array_time_write_F.F90
+ at BUILD_FORTRAN_TRUE@am_global_array_time_write_F_OBJECTS =  \
+ at BUILD_FORTRAN_TRUE@	global_array_time_write_F.$(OBJEXT)
+global_array_time_write_F_OBJECTS =  \
+	$(am_global_array_time_write_F_OBJECTS)
+ at BUILD_FORTRAN_TRUE@global_array_time_write_F_DEPENDENCIES =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
+ at BUILD_FORTRAN_TRUE@	$(am__DEPENDENCIES_1)
+global_array_time_write_F_LINK = $(LIBTOOL) --tag=FC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(FCLD) \
+	$(AM_FCFLAGS) $(FCFLAGS) $(global_array_time_write_F_LDFLAGS) \
+	$(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp =
 am__depfiles_maybe =
+PPFCCOMPILE = $(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+FCLD = $(FC)
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -132,14 +147,14 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
-SOURCES = $(adios_globaltime_SOURCES) \
-	$(adios_globaltime_no_xml_SOURCES) \
-	$(adios_read_globaltime_SOURCES) \
-	$(adios_read_globaltime_streaming_SOURCES)
-DIST_SOURCES = $(adios_globaltime_SOURCES) \
-	$(adios_globaltime_no_xml_SOURCES) \
-	$(adios_read_globaltime_SOURCES) \
-	$(adios_read_globaltime_streaming_SOURCES)
+SOURCES = $(global_array_time_read_as_file_C_SOURCES) \
+	$(global_array_time_read_as_stream_C_SOURCES) \
+	$(global_array_time_write_C_SOURCES) \
+	$(global_array_time_write_F_SOURCES)
+DIST_SOURCES = $(global_array_time_read_as_file_C_SOURCES) \
+	$(global_array_time_read_as_stream_C_SOURCES) \
+	$(global_array_time_write_C_SOURCES) \
+	$(am__global_array_time_write_F_SOURCES_DIST)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -227,7 +242,7 @@ EXEEXT = @EXEEXT@
 FASTBIT_CPPFLAGS = @FASTBIT_CPPFLAGS@
 FASTBIT_LDFLAGS = @FASTBIT_LDFLAGS@
 FASTBIT_LIBS = @FASTBIT_LIBS@
-FC = @FC@
+FC = $(MPIFC)
 FCFLAGS = @FCFLAGS@
 FCLIBS = @FCLIBS@
 FGREP = @FGREP@
@@ -341,6 +356,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -398,31 +416,37 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
-adios_globaltime_SOURCES = adios_globaltime.c
-adios_globaltime_LDADD = $(top_builddir)/src/libadios.a \
+global_array_time_write_C_SOURCES = global_array_time_write_C.c
+global_array_time_write_C_LDADD = $(top_builddir)/src/libadios.a \
 	$(ADIOSLIB_LDADD)
-adios_globaltime_LDFLAGS = $(ADIOSLIB_LDFLAGS)
-adios_globaltime_no_xml_SOURCES = adios_globaltime_no_xml.c
-adios_globaltime_no_xml_LDADD = $(top_builddir)/src/libadios.a \
-	$(ADIOSLIB_LDADD)
-adios_globaltime_no_xml_LDFLAGS = $(ADIOSLIB_LDFLAGS)
-adios_read_globaltime_SOURCES = adios_read_globaltime.c
-adios_read_globaltime_LDADD = $(top_builddir)/src/libadiosread.a \
-	$(ADIOSREADLIB_LDADD)
-adios_read_globaltime_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
-adios_read_globaltime_streaming_SOURCES = adios_read_globaltime_streaming.c
-adios_read_globaltime_streaming_LDADD =  \
+global_array_time_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+global_array_time_read_as_file_C_SOURCES = global_array_time_read_as_file_C.c
+global_array_time_read_as_file_C_LDADD =  \
+	$(top_builddir)/src/libadiosread.a $(ADIOSREADLIB_LDADD)
+global_array_time_read_as_file_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+global_array_time_read_as_stream_C_SOURCES = global_array_time_read_as_stream_C.c
+global_array_time_read_as_stream_C_LDADD =  \
 	$(top_builddir)/src/libadiosread.a $(ADIOSREADLIB_LDADD)
-adios_read_globaltime_streaming_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
-CLEANFILES = *.bp
-EXTRA_DIST = adios_globaltime.xml gread_restart.ch gwrite_restart.ch job.pbs
+global_array_time_read_as_stream_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+CLEANFILES = *.bp *.ch *.fh
+EXTRA_DIST = global_array_time_C.xml global_array_time_F.xml
+ at BUILD_FORTRAN_TRUE@global_array_time_write_F_SOURCES = global_array_time_write_F.F90
+ at BUILD_FORTRAN_TRUE@global_array_time_write_F_LDADD =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
+ at BUILD_FORTRAN_TRUE@	$(ADIOSLIB_LDADD)
+ at BUILD_FORTRAN_TRUE@global_array_time_write_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+FCLINK = \
+        $(LIBTOOL) --mode=link --tag F77 $(FC) \
+        $(AM_FCFLAGS) $(FCFLAGS) $(LDFLAGS) -o $@
+
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .F90 .c .lo .o .obj
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -432,9 +456,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/C/global-array-time/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/suite/programs/examples/global_array_time/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu examples/C/global-array-time/Makefile
+	  $(AUTOMAKE) --gnu tests/suite/programs/examples/global_array_time/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -454,26 +478,26 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
 	echo " rm -f" $$list; \
 	rm -f $$list || exit $$?; \
 	test -n "$(EXEEXT)" || exit 0; \
 	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
 	echo " rm -f" $$list; \
 	rm -f $$list
-adios_globaltime$(EXEEXT): $(adios_globaltime_OBJECTS) $(adios_globaltime_DEPENDENCIES) 
-	@rm -f adios_globaltime$(EXEEXT)
-	$(adios_globaltime_LINK) $(adios_globaltime_OBJECTS) $(adios_globaltime_LDADD) $(LIBS)
-adios_globaltime_no_xml$(EXEEXT): $(adios_globaltime_no_xml_OBJECTS) $(adios_globaltime_no_xml_DEPENDENCIES) 
-	@rm -f adios_globaltime_no_xml$(EXEEXT)
-	$(adios_globaltime_no_xml_LINK) $(adios_globaltime_no_xml_OBJECTS) $(adios_globaltime_no_xml_LDADD) $(LIBS)
-adios_read_globaltime$(EXEEXT): $(adios_read_globaltime_OBJECTS) $(adios_read_globaltime_DEPENDENCIES) 
-	@rm -f adios_read_globaltime$(EXEEXT)
-	$(adios_read_globaltime_LINK) $(adios_read_globaltime_OBJECTS) $(adios_read_globaltime_LDADD) $(LIBS)
-adios_read_globaltime_streaming$(EXEEXT): $(adios_read_globaltime_streaming_OBJECTS) $(adios_read_globaltime_streaming_DEPENDENCIES) 
-	@rm -f adios_read_globaltime_streaming$(EXEEXT)
-	$(adios_read_globaltime_streaming_LINK) $(adios_read_globaltime_streaming_OBJECTS) $(adios_read_globaltime_streaming_LDADD) $(LIBS)
+global_array_time_read_as_file_C$(EXEEXT): $(global_array_time_read_as_file_C_OBJECTS) $(global_array_time_read_as_file_C_DEPENDENCIES) 
+	@rm -f global_array_time_read_as_file_C$(EXEEXT)
+	$(global_array_time_read_as_file_C_LINK) $(global_array_time_read_as_file_C_OBJECTS) $(global_array_time_read_as_file_C_LDADD) $(LIBS)
+global_array_time_read_as_stream_C$(EXEEXT): $(global_array_time_read_as_stream_C_OBJECTS) $(global_array_time_read_as_stream_C_DEPENDENCIES) 
+	@rm -f global_array_time_read_as_stream_C$(EXEEXT)
+	$(global_array_time_read_as_stream_C_LINK) $(global_array_time_read_as_stream_C_OBJECTS) $(global_array_time_read_as_stream_C_LDADD) $(LIBS)
+global_array_time_write_C$(EXEEXT): $(global_array_time_write_C_OBJECTS) $(global_array_time_write_C_DEPENDENCIES) 
+	@rm -f global_array_time_write_C$(EXEEXT)
+	$(global_array_time_write_C_LINK) $(global_array_time_write_C_OBJECTS) $(global_array_time_write_C_LDADD) $(LIBS)
+global_array_time_write_F$(EXEEXT): $(global_array_time_write_F_OBJECTS) $(global_array_time_write_F_DEPENDENCIES) 
+	@rm -f global_array_time_write_F$(EXEEXT)
+	$(global_array_time_write_F_LINK) $(global_array_time_write_F_OBJECTS) $(global_array_time_write_F_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -481,6 +505,15 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $<
+
+.F90.obj:
+	$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F90.lo:
+	$(LTPPFCCOMPILE) -c -o $@ $<
+
 .c.o:
 	$(COMPILE) -c $<
 
@@ -579,8 +612,9 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
 check: check-am
-all-am: Makefile $(PROGRAMS) all-local
+all-am: Makefile all-local
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -610,7 +644,7 @@ maintainer-clean-generic:
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
 	mostlyclean-am
 
 distclean: distclean-am
@@ -677,10 +711,10 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
-	clean-generic clean-libtool clean-noinstPROGRAMS ctags \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
@@ -695,7 +729,13 @@ uninstall-am:
 
 
 all-local:
-	test "$(srcdir)" = "$(builddir)" || cp $(srcdir)/*.xml $(builddir)
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+global_array_time_write_C.o: gwrite_restart.ch
+gwrite_restart.ch: global_array_time_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/global_array_time_C.xml
+ at BUILD_FORTRAN_TRUE@global_array_time_write_F.o: gwrite_restart.fh
+ at BUILD_FORTRAN_TRUE@gwrite_restart.fh: global_array_time_F.xml
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/global_array_time_F.xml
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/tests/suite/programs/examples/global_array_time/global_array_time_C.xml b/tests/suite/programs/examples/global_array_time/global_array_time_C.xml
new file mode 100644
index 0000000..8f1dd01
--- /dev/null
+++ b/tests/suite/programs/examples/global_array_time/global_array_time_C.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<adios-config host-language="C">
+  <adios-group name="restart">
+    <var name="NX" type="integer"/>
+    <var name="NY" type="integer"/>
+    <var name="size" type="integer"/>
+    <var name="rank" type="integer"/>
+
+    <global-bounds dimensions="size,NX" offsets="rank,0">
+       <var name="temperature" gwrite="t" type="double" dimensions="1,NX"/>
+    </global-bounds>
+
+    <global-bounds dimensions="size,NY" offsets="rank,0">
+       <var name="pressure" gwrite="p" type="double" dimensions="1,NY"/>
+    </global-bounds>
+
+    <attribute name="temperature/description" 
+        value="Global array written from 'size' processes over several timesteps" 
+        type="string"/>
+  </adios-group>
+
+  <method group="restart" method="MPI"/>
+
+  <buffer size-MB="5" allocate-time="now"/>
+
+</adios-config>
+
diff --git a/tests/suite/programs/examples/global_array_time/global_array_time_F.xml b/tests/suite/programs/examples/global_array_time/global_array_time_F.xml
new file mode 100644
index 0000000..c7cc978
--- /dev/null
+++ b/tests/suite/programs/examples/global_array_time/global_array_time_F.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<adios-config host-language="Fortran"> 
+  <!--
+      There are no tricks here compared to the global-array example
+      to have multiple steps of an array recorded in a file.
+      Just do append in the code itself ('a' mode in adios_open())
+      Use the 'bpls' utils to see how multiple steps of an array
+      is represented. 
+  -->
+  <adios-group name="restart">
+    <var name="NX" type="integer"/>
+    <var name="NY" type="integer"/>
+    <var name="size" type="integer"/>
+    <var name="rank" type="integer"/>
+    <global-bounds dimensions="NX,size" offsets="0,rank">
+       <var name="temperature" gwrite="t" type="double" dimensions="NX,1"/>
+    </global-bounds>
+    <global-bounds dimensions="NY,size" offsets="0,rank">
+       <var name="pressure" gwrite="p" type="double" dimensions="NY,1"/>
+    </global-bounds>
+    <attribute name="temperature/description" 
+        value="Global array written from 'size' processes over several timesteps" 
+        type="string"/>
+  </adios-group>
+
+  <method group="restart" method="MPI"/>
+
+  <buffer size-MB="2" allocate-time="now"/>
+
+</adios-config>
+
diff --git a/tests/suite/programs/examples/global_array_time/global_array_time_read_as_file_C.c b/tests/suite/programs/examples/global_array_time/global_array_time_read_as_file_C.c
new file mode 100644
index 0000000..d86b1e6
--- /dev/null
+++ b/tests/suite/programs/examples/global_array_time/global_array_time_read_as_file_C.c
@@ -0,0 +1,105 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/* ADIOS C Example: read global arrays from a BP file
+ *
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios_read.h"
+#include "core/adios_logger.h"
+
+int main (int argc, char ** argv) 
+{
+    int         rank, size, i, j, k, token;
+    MPI_Comm    comm = MPI_COMM_WORLD;
+    MPI_Status  status;
+    enum ADIOS_READ_METHOD method = ADIOS_READ_METHOD_BP;
+    ADIOS_SELECTION * sel;
+    void * data = NULL;
+    uint64_t start[3], count[3], step = 0;
+
+    MPI_Init (&argc, &argv);
+    MPI_Comm_rank (comm, &rank);
+    MPI_Comm_size (comm, &size);
+
+    adios_read_init_method (method, comm, "verbose=3");
+    adios_logger_open ("log_read_as_file_C", rank);
+
+    /* adios_read_open_file() allows for seeing all timesteps in the file */
+    ADIOS_FILE * f = adios_read_open_file ("global_array_time_C.bp", method, comm);
+    if (f == NULL)
+    {
+        log_error ("%s\n", adios_errmsg());
+        return -1;
+    }
+
+    ADIOS_VARINFO * v = adios_inq_var (f, "temperature");
+
+    // read in two timesteps
+    data = malloc (2 * v->dims[0] * v->dims[1] * sizeof (double));
+    if (data == NULL)
+    {
+        log_error ("malloc failed.\n");
+        return -1;
+    }
+
+    // read in timestep 'rank' (up to 12)
+    step = rank % 13;
+
+    start[0] = 0;
+    count[0] = v->dims[0];
+
+    start[1] = 0;
+    count[1] = v->dims[1];
+
+    /* Read a subset of the temperature array */
+    sel = adios_selection_boundingbox (v->ndim, start, count);
+    /*    2 steps from 'step' */
+    adios_schedule_read (f, sel, "temperature", step, 2, data);
+    adios_perform_reads (f, 1);
+
+    if (rank == 0) 
+        log_test ("Array size of temperature [0:%lld,0:%lld]\n", v->dims[0], v->dims[1]);   
+
+    if (rank > 0) {
+        MPI_Recv (&token, 1, MPI_INT, rank-1, 0, comm, &status);
+    }
+
+    log_test("------------------------------------------------\n");
+    log_test("rank=%d: \n", rank);
+    for (i = 0; i < 2; i++) {
+        log_test ("step %lld = [\n", step+i);   
+        for (j = 0; j < v->dims[0]; j++) {
+            log_test (" [");
+            for (k = 0; k < v->dims[1]; k++) {
+                log_test ("%g ", ((double *)data) [ i * v->dims[0] * v->dims[1] + j * v->dims[1] + k]);
+            }
+            log_test ("]\n");
+        }
+        log_test ("]\n");
+    }
+    log_test ("\n");
+
+    if (rank < size-1) {
+        MPI_Send (&token, 1, MPI_INT, rank+1, 0, comm);
+    }
+
+    free (data);
+    adios_free_varinfo (v);
+
+    adios_read_close (f);
+    MPI_Barrier (comm);
+    adios_read_finalize_method (method);
+    adios_logger_close();
+    MPI_Finalize ();
+    return 0;
+}
+
+
diff --git a/tests/suite/programs/examples/global_array_time/global_array_time_read_as_stream_C.c b/tests/suite/programs/examples/global_array_time/global_array_time_read_as_stream_C.c
new file mode 100644
index 0000000..28b7496
--- /dev/null
+++ b/tests/suite/programs/examples/global_array_time/global_array_time_read_as_stream_C.c
@@ -0,0 +1,123 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/* ADIOS C Example: read global arrays from a BP file
+ * which has multiple timesteps,
+ * reading step by step
+ *
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios_read.h"
+#include "adios_error.h"
+#include "core/adios_logger.h"
+
+int main (int argc, char ** argv) 
+{
+    int         rank, size, i, j;
+    MPI_Comm    comm = MPI_COMM_WORLD;
+    ADIOS_FILE * f;
+    ADIOS_VARINFO * v;
+    ADIOS_SELECTION * sel;
+    int steps = 0;
+    int retval = 0;
+    float timeout_sec = 0.0; 
+
+    void * data = NULL;
+    uint64_t start[2], count[2];
+
+    MPI_Init (&argc, &argv);
+
+    MPI_Comm_rank (comm, &rank);
+    MPI_Comm_size (comm, &size);
+
+    adios_read_init_method (ADIOS_READ_METHOD_BP, comm, "verbose=3");
+    adios_logger_open ("log_read_as_stream_C", rank);
+
+    f = adios_read_open ("global_array_time_C.bp", ADIOS_READ_METHOD_BP,
+                          comm, ADIOS_LOCKMODE_NONE, timeout_sec);
+    if (adios_errno == err_file_not_found)
+    {
+        log_error ("rank %d: Stream not found after waiting %f seconds: %s\n",
+                rank, timeout_sec, adios_errmsg());
+        retval = adios_errno;
+    }
+    else if (adios_errno == err_end_of_stream)
+    {
+        log_error ("rank %d: Stream terminated before open. %s\n", rank, adios_errmsg());
+        retval = adios_errno;
+    }
+    else if (f == NULL) {
+        error ("rank %d: Error at opening stream: %s\n", rank, adios_errmsg());
+        retval = adios_errno;
+    }
+    else
+    {
+        /* process file here... */
+        v = adios_inq_var (f, "temperature");
+        adios_inq_var_blockinfo (f, v);
+
+        log_test ("rank %d: ndim = %d\n", rank, v->ndim);
+        //log_test ("nsteps = %d\n",  v->nsteps);
+        log_test ("rank %d: dims[%llu][%llu]\n", rank, v->dims[0], v->dims[1]);
+
+        uint64_t slice_size = v->dims[0]/size;
+        if (rank == size-1)
+            slice_size = slice_size + v->dims[0]%size;
+
+        start[0] = rank * slice_size;
+        count[0] = slice_size;
+        start[1] = 0;
+        count[1] = v->dims[1];
+
+        data = malloc (slice_size * v->dims[1] * 8);
+
+        /* Processing loop over the steps (we are already in the first one) */
+        while (adios_errno != err_end_of_stream) {
+            steps++; // steps start counting from 1
+
+            sel = adios_selection_boundingbox (v->ndim, start, count);
+            adios_schedule_read (f, sel, "temperature", 0, 1, data);
+            adios_perform_reads (f, 1);
+
+            log_test("rank=%d: step %d: [0:%lld,0:%lld] = [", rank, f->current_step, v->dims[0], v->dims[1]);
+            for (i = 0; i < slice_size; i++) {
+                log_test (" [");
+                for (j = 0; j < v->dims[1]; j++) {
+                    log_test ("%g ", *((double *)data + i * v->dims[1] + j));
+                }
+                log_test ("]");
+            }
+            log_test (" ]\n");
+
+            // advance to 1) next available step with 2) blocking wait
+            adios_advance_step (f, 0, timeout_sec);
+            if (adios_errno == err_step_notready)
+            {
+                log_test ("rank %d: No new step arrived within the timeout. Quit. %s\n",
+                        rank, adios_errmsg());
+                break; // quit while loop
+            }
+
+        }
+
+        adios_read_close (f);
+    }
+
+    log_test ("rank: %d: We have processed %d steps\n", rank, steps);
+
+    adios_read_finalize_method (ADIOS_READ_METHOD_BP);
+    adios_logger_close();
+    free (data);
+    MPI_Finalize ();
+
+    return retval;
+}
+
+
diff --git a/tests/suite/programs/examples/global_array_time/global_array_time_write_C.c b/tests/suite/programs/examples/global_array_time/global_array_time_write_C.c
new file mode 100644
index 0000000..4485352
--- /dev/null
+++ b/tests/suite/programs/examples/global_array_time/global_array_time_write_C.c
@@ -0,0 +1,58 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios.h"
+int main (int argc, char ** argv) 
+{
+	char        filename [256];
+	int         rank, size, i, it;
+	int         NX = 10;
+        // NY = 1 for testing purpose
+	int         NY = 1; 
+	double      t[NX];
+	double      p[NY];
+
+	/* ADIOS variables declarations for matching gwrite_temperature.ch */
+	uint64_t    adios_groupsize, adios_totalsize;
+	int64_t     adios_handle;
+	MPI_Comm    comm=MPI_COMM_WORLD;
+ 
+	MPI_Init (&argc, &argv);
+	MPI_Comm_rank (MPI_COMM_WORLD, &rank);
+	MPI_Comm_size (comm, &size);
+
+	adios_init ("global_array_time_C.xml", comm);
+    	strcpy (filename, "global_array_time_C.bp");
+    	for (it =1; it <= 13; it++) {
+
+        	for (i = 0; i < NX; i++)
+            		t[i] = it*100.0 + rank*NX + i;
+
+        	for (i = 0; i < NY; i++)
+            		p[i] = it*1000.0 + rank*NY + i;
+		
+                if (it==1)
+		    adios_open (&adios_handle, "restart", filename, "w", comm);
+                else
+		    adios_open (&adios_handle, "restart", filename, "a", comm);
+
+        	#include "gwrite_restart.ch"
+        	adios_close (adios_handle);
+		MPI_Barrier (comm);
+                //if (rank==0) printf("Timestep %d written\n", it+1);
+ 	}
+	MPI_Barrier (comm);
+        //if (rank==0) printf("Finalize adios\n");
+    	adios_finalize (rank);
+
+        //if (rank==0) printf("Finalize MPI\n");
+    	MPI_Finalize ();
+	return 0;
+}
diff --git a/tests/suite/programs/examples/global_array_time/global_array_time_write_F.F90 b/tests/suite/programs/examples/global_array_time/global_array_time_write_F.F90
new file mode 100644
index 0000000..eb79b1c
--- /dev/null
+++ b/tests/suite/programs/examples/global_array_time/global_array_time_write_F.F90
@@ -0,0 +1,70 @@
+!
+!  ADIOS is freely available under the terms of the BSD license described
+!  in the COPYING file in the top level directory of this source distribution.
+!
+!  Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+!
+
+! ADIOS Fortran Example: write a global array from N processors with gwrite
+! and write several timesteps into one BP file
+!
+! How to run: mpirun -np <N> adios_globaltime
+! Output: adios_globaltime.bp
+! ADIOS config file: adios_globaltime.xml
+!
+
+program adios_global
+    use adios_write_mod
+    implicit none
+    include 'mpif.h'
+    character(len=256)      :: filename = "global_array_time_F.bp"
+    integer                 :: rank, size, i, it, ierr
+    integer, parameter      :: NX = 10
+    ! NY = 1 for testing purpose
+    integer, parameter      :: NY = 1
+    real*8                  :: t(NX)
+    real*8                  :: p(NY)
+    integer                 :: comm
+
+    ! ADIOS variables declarations for matching gwrite_temperature.fh
+    integer                 :: adios_err
+    integer*8               :: adios_groupsize, adios_totalsize
+    integer*8               :: adios_handle
+
+    call MPI_Init (ierr)
+    call MPI_Comm_dup (MPI_COMM_WORLD, comm, ierr)
+    call MPI_Comm_rank (comm, rank, ierr)
+    call MPI_Comm_size (comm, size, ierr)
+
+    call adios_init ("global_array_time_F.xml", comm, adios_err)
+
+    do it = 1, 13
+        do i = 1, NX
+            t(i)  = 100.0*it + NX*rank + i - 1
+        enddo
+
+        do i = 1, NY
+            p(i)  = 1000.0*it + NY*rank + i - 1
+        enddo
+
+        ! We need to create the file in the first round,
+        ! then we need to append to it
+        if (it == 1) then
+            call adios_open (adios_handle, "restart", filename, "w", comm, adios_err)
+        else
+            call adios_open (adios_handle, "restart", filename, "a", comm, adios_err)
+        endif
+
+#include "gwrite_restart.fh"
+
+        call adios_close (adios_handle, adios_err)
+
+        call MPI_Barrier (comm, ierr)
+    enddo
+
+    call MPI_Barrier (comm, ierr)
+
+    call adios_finalize (rank, adios_err)
+
+    call MPI_Finalize (ierr)
+end program
diff --git a/tests/suite/programs/examples/local_array/CMakeLists.txt b/tests/suite/programs/examples/local_array/CMakeLists.txt
new file mode 100644
index 0000000..00a5451
--- /dev/null
+++ b/tests/suite/programs/examples/local_array/CMakeLists.txt
@@ -0,0 +1,33 @@
+include_directories(${PROJECT_SOURCE_DIR}/src/public)
+include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_SOURCE_DIR}/test/suite/programs/examples/local_array)
+include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
+link_directories(${PROJECT_BINARY_DIR}/test/suite/programs/examples/local_array)
+
+add_executable(local_array_write_C local_array_write_C.c)
+if(MPI_COMPILE_FLAGS)
+  set_target_properties(local_array_write_C PROPERTIES COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
+endif()
+if(MPI_LINK_FLAGS)
+  set_target_properties(local_array_write_C PROPERTIES LINK_FLAGS "${MPI_C_LINK_FLAGS}")
+endif()
+target_link_libraries(local_array_write_C adios ${ADIOSLIB_LDADD} ${MPI_C_LIBRARIES})
+add_custom_command(
+	OUTPUT gwrite_arrays.ch
+	COMMAND ${PROJECT_SOURCE_DIR}/utils/gpp/gpp.py ${PROJECT_SOURCE_DIR}/tests/suite/programs/examples/local_array/local_array_C.xml
+	DEPENDS local_array_C.xml
+	)
+
+
+add_executable(local_array_read_C local_array_read_C.c)
+if(MPI_COMPILE_FLAGS)
+  set_target_properties(local_array_read_C PROPERTIES COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
+endif()
+if(MPI_LINK_FLAGS)
+  set_target_properties(local_array_read_C PROPERTIES LINK_FLAGS "${MPI_C_LINK_FLAGS}")
+endif()
+target_link_libraries(local_array_read_C adiosread ${ADIOSREADLIB_LDADD} ${MPI_C_LIBRARIES})
+
+#install(FILES arrays.xml gwrite_arrays.ch gread_arrays.ch job.pbs  DESTINATION ${PROJECT_BINARY_DIR}/examples/C/arrays)
+
diff --git a/tests/suite/programs/examples/local_array/Makefile.am b/tests/suite/programs/examples/local_array/Makefile.am
new file mode 100644
index 0000000..42664b0
--- /dev/null
+++ b/tests/suite/programs/examples/local_array/Makefile.am
@@ -0,0 +1,24 @@
+AM_CPPFLAGS = $(all_includes)
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+
+AUTOMAKE_OPTIONS = no-dependencies
+
+all-local:
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+
+check_PROGRAMS = local_array_write_C local_array_read_C
+
+local_array_write_C_SOURCES = local_array_write_C.c
+local_array_write_C_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
+local_array_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+local_array_write_C.o: gwrite_arrays.ch 
+gwrite_arrays.ch: local_array_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/local_array_C.xml
+
+local_array_read_C_SOURCES = local_array_read_C.c
+local_array_read_C_LDADD = $(top_builddir)/src/libadiosread.a $(ADIOSREADLIB_LDADD)
+local_array_read_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+
+CLEANFILES = *.bp *.ch *.fh
+CC=$(MPICC)
+EXTRA_DIST = local_array_C.xml 
diff --git a/examples/C/flexpath_arrays/process_select/Makefile.in b/tests/suite/programs/examples/local_array/Makefile.in
similarity index 87%
copy from examples/C/flexpath_arrays/process_select/Makefile.in
copy to tests/suite/programs/examples/local_array/Makefile.in
index 73b99bd..bde91ed 100644
--- a/examples/C/flexpath_arrays/process_select/Makefile.in
+++ b/tests/suite/programs/examples/local_array/Makefile.in
@@ -14,7 +14,6 @@
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
-
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
@@ -34,8 +33,9 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-noinst_PROGRAMS = arrays_write$(EXEEXT) arrays_read$(EXEEXT)
-subdir = examples/C/flexpath_arrays/process_select
+check_PROGRAMS = local_array_write_C$(EXEEXT) \
+	local_array_read_C$(EXEEXT)
+subdir = tests/suite/programs/examples/local_array
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/ac_alacrity.m4 \
@@ -82,22 +82,21 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_arrays_read_OBJECTS = arrays_read.$(OBJEXT)
-arrays_read_OBJECTS = $(am_arrays_read_OBJECTS)
+am_local_array_read_C_OBJECTS = local_array_read_C.$(OBJEXT)
+local_array_read_C_OBJECTS = $(am_local_array_read_C_OBJECTS)
 am__DEPENDENCIES_1 =
-arrays_read_DEPENDENCIES = $(top_builddir)/src/libadios.a \
+local_array_read_C_DEPENDENCIES = $(top_builddir)/src/libadiosread.a \
 	$(am__DEPENDENCIES_1)
-arrays_read_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+local_array_read_C_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(arrays_read_LDFLAGS) $(LDFLAGS) -o $@
-am_arrays_write_OBJECTS = arrays_write.$(OBJEXT)
-arrays_write_OBJECTS = $(am_arrays_write_OBJECTS)
-arrays_write_DEPENDENCIES = $(top_builddir)/src/libadios.a \
+	$(local_array_read_C_LDFLAGS) $(LDFLAGS) -o $@
+am_local_array_write_C_OBJECTS = local_array_write_C.$(OBJEXT)
+local_array_write_C_OBJECTS = $(am_local_array_write_C_OBJECTS)
+local_array_write_C_DEPENDENCIES = $(top_builddir)/src/libadios.a \
 	$(am__DEPENDENCIES_1)
-arrays_write_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+local_array_write_C_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(arrays_write_LDFLAGS) $(LDFLAGS) -o $@
+	$(local_array_write_C_LDFLAGS) $(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp =
 am__depfiles_maybe =
@@ -110,8 +109,9 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
-SOURCES = $(arrays_read_SOURCES) $(arrays_write_SOURCES)
-DIST_SOURCES = $(arrays_read_SOURCES) $(arrays_write_SOURCES)
+SOURCES = $(local_array_read_C_SOURCES) $(local_array_write_C_SOURCES)
+DIST_SOURCES = $(local_array_read_C_SOURCES) \
+	$(local_array_write_C_SOURCES)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,17 +373,18 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
-arrays_write_SOURCES = arrays_write.c
-arrays_write_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
-arrays_write_LDFLAGS = $(ADIOSLIB_LDFLAGS)
-arrays_read_SOURCES = arrays_read.c
-arrays_read_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
-arrays_read_LDFLAGS = $(ADIOSLIB_LDFLAGS)
-CLEANFILES = *_writer_info.txt *_writer_ready.txt *_reader_info.txt *_reader_ready.txt *.bp
-EXTRA_DIST = arrays.xml job.pbs
+local_array_write_C_SOURCES = local_array_write_C.c
+local_array_write_C_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
+local_array_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+local_array_read_C_SOURCES = local_array_read_C.c
+local_array_read_C_LDADD = $(top_builddir)/src/libadiosread.a $(ADIOSREADLIB_LDADD)
+local_array_read_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+CLEANFILES = *.bp *.ch *.fh
+EXTRA_DIST = local_array_C.xml 
 all: all-am
 
 .SUFFIXES:
@@ -394,9 +398,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/C/flexpath_arrays/process_select/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/suite/programs/examples/local_array/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu examples/C/flexpath_arrays/process_select/Makefile
+	  $(AUTOMAKE) --gnu tests/suite/programs/examples/local_array/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -416,20 +420,20 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
 	echo " rm -f" $$list; \
 	rm -f $$list || exit $$?; \
 	test -n "$(EXEEXT)" || exit 0; \
 	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
 	echo " rm -f" $$list; \
 	rm -f $$list
-arrays_read$(EXEEXT): $(arrays_read_OBJECTS) $(arrays_read_DEPENDENCIES) 
-	@rm -f arrays_read$(EXEEXT)
-	$(arrays_read_LINK) $(arrays_read_OBJECTS) $(arrays_read_LDADD) $(LIBS)
-arrays_write$(EXEEXT): $(arrays_write_OBJECTS) $(arrays_write_DEPENDENCIES) 
-	@rm -f arrays_write$(EXEEXT)
-	$(arrays_write_LINK) $(arrays_write_OBJECTS) $(arrays_write_LDADD) $(LIBS)
+local_array_read_C$(EXEEXT): $(local_array_read_C_OBJECTS) $(local_array_read_C_DEPENDENCIES) 
+	@rm -f local_array_read_C$(EXEEXT)
+	$(local_array_read_C_LINK) $(local_array_read_C_OBJECTS) $(local_array_read_C_LDADD) $(LIBS)
+local_array_write_C$(EXEEXT): $(local_array_write_C_OBJECTS) $(local_array_write_C_DEPENDENCIES) 
+	@rm -f local_array_write_C$(EXEEXT)
+	$(local_array_write_C_LINK) $(local_array_write_C_OBJECTS) $(local_array_write_C_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -535,8 +539,9 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
 check: check-am
-all-am: Makefile $(PROGRAMS) all-local
+all-am: Makefile all-local
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -566,7 +571,7 @@ maintainer-clean-generic:
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
 	mostlyclean-am
 
 distclean: distclean-am
@@ -633,10 +638,10 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
-	clean-generic clean-libtool clean-noinstPROGRAMS ctags \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
@@ -651,8 +656,10 @@ uninstall-am:
 
 
 all-local:
-	test "$(srcdir)" = "$(builddir)" || cp $(srcdir)/*.xml $(builddir)
-	test "$(srcdir)" = "$(builddir)" || cp $(srcdir)/*.pbs $(builddir)
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+local_array_write_C.o: gwrite_arrays.ch 
+gwrite_arrays.ch: local_array_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/local_array_C.xml
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/tests/suite/programs/examples/local_array/local_array_C.xml b/tests/suite/programs/examples/local_array/local_array_C.xml
new file mode 100644
index 0000000..7a11efa
--- /dev/null
+++ b/tests/suite/programs/examples/local_array/local_array_C.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<adios-config host-language="C">
+
+    <adios-group name="arrays">
+        <var name="NX" type="integer"/>
+        <var name="NY" type="integer"/>
+        <var name="var_double_2Darray"  gwrite="t"  type="double"  dimensions="NX,NY"/>
+        <var name="var_int_1Darray"     gwrite="p"  type="integer" dimensions="NX"/>
+    </adios-group>
+
+    <method group="arrays"  method="MPI"/>
+
+    <buffer size-MB="20" allocate-time="now"/>
+
+</adios-config>
+
diff --git a/tests/suite/programs/examples/local_array/local_array_read_C.c b/tests/suite/programs/examples/local_array/local_array_read_C.c
new file mode 100644
index 0000000..51d0501
--- /dev/null
+++ b/tests/suite/programs/examples/local_array/local_array_read_C.c
@@ -0,0 +1,84 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/*************************************************************/
+/*          Example of reading arrays in ADIOS               */
+/*    which were written from the same number of processors  */
+/*                                                           */
+/*        Similar example is manual/2_adios_read.c           */
+/*************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios_read.h"
+#include "core/adios_logger.h"
+
+int main (int argc, char ** argv) 
+{
+    char        filename [256];
+    int         rank, size, i, j;
+    int         NX, NY; 
+    double      *t;
+    int         *p;
+    MPI_Comm    comm = MPI_COMM_WORLD;
+    enum ADIOS_READ_METHOD method = ADIOS_READ_METHOD_BP;
+    ADIOS_SELECTION * sel;
+
+    MPI_Init (&argc, &argv);
+    MPI_Comm_rank (comm, &rank);
+    MPI_Comm_size (comm, &size);
+
+    adios_read_init_method (method, comm, "verbose=3");
+    adios_logger_open ("log_read_C", rank);
+
+    strcpy (filename, "local_array_C.bp");
+    ADIOS_FILE * f = adios_read_open (filename, method, comm, ADIOS_LOCKMODE_NONE, 0);
+
+    /* Specify a selection that points to a specific writer's block */
+    sel = adios_selection_writeblock (rank);
+
+    /* First get the scalars to calculate the size of the arrays */
+    adios_schedule_read (f, sel, "NX", 0, 1, &NX);
+    adios_schedule_read (f, sel, "NY", 0, 1, &NY);
+    adios_perform_reads (f, 1);
+
+    log_test("rank=%d: NX=%d NY=%d\n", rank, NX, NY);
+
+    /* Allocate space for the arrays */
+    t = (double *) malloc (NX*NY*sizeof(double));
+    p = (int *) malloc (NX*sizeof(int));
+
+    /* Read the arrays */
+    adios_schedule_read (f, sel, "var_double_2Darray", 0, 1, t);
+    adios_schedule_read (f, sel, "var_int_1Darray", 0, 1, p);
+    adios_perform_reads (f, 1);
+
+    /* At this point, we have the data in memory */
+    log_test("rank=%d: p = [%d", rank, p[0]);
+    for (i = 1; i < NX; i++)
+        log_test(", %d", p[i]);
+    log_test("]\n");
+    
+    log_test("rank=%d: t[5,*] = [%6.2f", rank, t[5*NY]);
+    for (j = 1; j < NY; j++)
+        log_test(", %6.2f", t[5*NY+j]);
+    log_test("]\n");
+
+    free (t);
+    free (p);
+
+    adios_read_close (f);
+    MPI_Barrier (comm);
+    adios_read_finalize_method (method);
+    adios_logger_close();
+    MPI_Finalize ();
+
+    return 0;
+}
diff --git a/tests/suite/programs/examples/local_array/local_array_write_C.c b/tests/suite/programs/examples/local_array/local_array_write_C.c
new file mode 100644
index 0000000..e948df2
--- /dev/null
+++ b/tests/suite/programs/examples/local_array/local_array_write_C.c
@@ -0,0 +1,52 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios.h"
+
+/*************************************************************/
+/*          Example of writing arrays in ADIOS               */
+/*                                                           */
+/*        Similar example is manual/2_adios_write.c          */
+/*************************************************************/
+int main (int argc, char ** argv) 
+{
+    char        filename [256];
+    int         rank, i, j;
+    int         NX = 10, NY = 100; 
+    double      t[NX][NY];
+    int         p[NX];
+    MPI_Comm    comm = MPI_COMM_WORLD;
+
+    uint64_t    adios_groupsize, adios_totalsize;
+    int64_t     adios_handle;
+
+    MPI_Init (&argc, &argv);
+    MPI_Comm_rank (comm, &rank);
+
+    for (i = 0; i < NX; i++)
+        for (j = 0; j< NY; j++)
+            t[i][j] = rank * NX + i + j*(1.0/NY);
+
+    for (i = 0; i < NX; i++)
+        p[i] = rank * NX + i;
+
+    strcpy (filename, "local_array_C.bp");
+    adios_init ("local_array_C.xml", comm);
+    adios_open (&adios_handle, "arrays", filename, "w", comm);
+#include "gwrite_arrays.ch"
+    adios_close (adios_handle);
+
+    MPI_Barrier (comm);
+
+    adios_finalize (rank);
+
+    MPI_Finalize ();
+    return 0;
+}
diff --git a/tests/suite/programs/examples/scalars/CMakeLists.txt b/tests/suite/programs/examples/scalars/CMakeLists.txt
new file mode 100644
index 0000000..b4daf37
--- /dev/null
+++ b/tests/suite/programs/examples/scalars/CMakeLists.txt
@@ -0,0 +1,45 @@
+include_directories(${PROJECT_SOURCE_DIR}/src/public)
+include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_SOURCE_DIR}/test/suite/programs/examples/scalars)
+include_directories(${PROJECT_BINARY_DIR}/src)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
+link_directories(${PROJECT_BINARY_DIR}/test/suite/programs/examples/scalars)
+
+add_executable(scalars_write_C scalars_write_C.c gwrite_scalars.ch)
+if(MPI_COMPILE_FLAGS)
+  set_target_properties(scalars_write_C PROPERTIES COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
+endif()
+if(MPI_LINK_FLAGS)
+  set_target_properties(scalars_write_C PROPERTIES LINK_FLAGS "${MPI_C_LINK_FLAGS}")
+endif()
+target_link_libraries(scalars_write_C adios ${ADIOSLIB_LDADD} ${MPI_C_LIBRARIES})
+add_custom_command(
+	OUTPUT gwrite_scalars.ch
+	COMMAND ${PROJECT_SOURCE_DIR}/utils/gpp/gpp.py ${PROJECT_SOURCE_DIR}/tests/suite/programs/examples/scalars/scalars_C.xml
+	DEPENDS scalars_C.xml
+	)
+
+add_executable(scalars_read_C scalars_read_C.c)
+if(MPI_COMPILE_FLAGS)
+  set_target_properties(scalars_read_C PROPERTIES COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
+endif()
+if(MPI_LINK_FLAGS)
+  set_target_properties(scalars_read_C PROPERTIES LINK_FLAGS "${MPI_C_LINK_FLAGS}")
+endif()
+target_link_libraries(scalars_read_C adiosread ${ADIOSREADLIB_LDADD} ${MPI_C_LIBRARIES})
+
+if(BUILD_FORTRAN)
+    add_executable(scalars_write_F scalars_write_F.F90 gwrite_scalars.fh)
+    target_link_libraries(scalars_write_F adiosf ${ADIOSLIB_LDADD})
+    add_custom_command(
+	OUTPUT gwrite_scalars.fh
+	COMMAND ${PROJECT_SOURCE_DIR}/utils/gpp/gpp.py ${PROJECT_SOURCE_DIR}/tests/suite/programs/examples/scalars/scalars_F.xml
+	DEPENDS scalars_F.xml
+	)
+
+
+    add_executable(scalars_read_F scalars_read_F.F90)
+    target_link_libraries(scalars_read_F adiosreadf ${ADIOSREADLIB_LDADD})
+endif
+
+#install(FILES scalars.xml gwrite_scalars.ch gread_scalars.ch job.pbs DESTINATION ${PROJECT_BINARY_DIR}/examples/C/scalars)
diff --git a/tests/suite/programs/examples/scalars/Makefile.am b/tests/suite/programs/examples/scalars/Makefile.am
new file mode 100644
index 0000000..a67f906
--- /dev/null
+++ b/tests/suite/programs/examples/scalars/Makefile.am
@@ -0,0 +1,52 @@
+AM_CPPFLAGS = $(all_includes)
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+
+AUTOMAKE_OPTIONS = no-dependencies
+
+all-local:
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+	
+check_PROGRAMS = scalars_write_C scalars_read_C
+
+scalars_write_C_SOURCES = scalars_write_C.c 
+scalars_write_C_LDADD = $(top_builddir)/src/libadios.a 
+scalars_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+scalars_write_C_LDADD += $(ADIOSLIB_LDADD)
+scalars_write_C.o: gwrite_scalars.ch 
+gwrite_scalars.ch: scalars_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/scalars_C.xml
+
+scalars_read_C_SOURCES = scalars_read_C.c
+scalars_read_C_LDADD = $(top_builddir)/src/libadiosread.a 
+scalars_read_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+scalars_read_C_LDADD += $(ADIOSREADLIB_LDADD)
+
+CLEANFILES = *.bp *.ch *.fh
+CC=$(MPICC)
+EXTRA_DIST = scalars_C.xml scalars_F.xml 
+
+
+if BUILD_FORTRAN
+check_PROGRAMS += scalars_write_F scalars_read_F
+scalars_write_F_SOURCES = scalars_write_F.F90
+scalars_write_F_LDADD = $(top_builddir)/src/libadiosf.a 
+scalars_write_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+scalars_write_F_LDADD += $(ADIOSLIB_LDADD)
+scalars_write_F.o: gwrite_scalars.fh 
+gwrite_scalars.fh: scalars_F.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/scalars_F.xml
+
+scalars_read_F_SOURCES = scalars_read_F.F90
+scalars_read_F_LDADD = $(top_builddir)/src/libadiosreadf.a 
+scalars_read_F_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+scalars_read_F_LDADD += $(ADIOSREADLIB_LDADD)
+
+endif
+
+FC=$(MPIFC)
+FCLINK = \
+        $(LIBTOOL) --mode=link --tag F77 $(FC) \
+        $(AM_FCFLAGS) $(FCFLAGS) $(LDFLAGS) -o $@
+
+
+
diff --git a/examples/C/global-array-time/Makefile.in b/tests/suite/programs/examples/scalars/Makefile.in
similarity index 76%
copy from examples/C/global-array-time/Makefile.in
copy to tests/suite/programs/examples/scalars/Makefile.in
index 7bab32b..b597faf 100644
--- a/examples/C/global-array-time/Makefile.in
+++ b/tests/suite/programs/examples/scalars/Makefile.in
@@ -14,7 +14,6 @@
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
-
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
@@ -34,11 +33,10 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-noinst_PROGRAMS = adios_globaltime$(EXEEXT) \
-	adios_globaltime_no_xml$(EXEEXT) \
-	adios_read_globaltime$(EXEEXT) \
-	adios_read_globaltime_streaming$(EXEEXT)
-subdir = examples/C/global-array-time
+check_PROGRAMS = scalars_write_C$(EXEEXT) scalars_read_C$(EXEEXT) \
+	$(am__EXEEXT_1)
+ at BUILD_FORTRAN_TRUE@am__append_1 = scalars_write_F scalars_read_F
+subdir = tests/suite/programs/examples/scalars
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/ac_alacrity.m4 \
@@ -85,44 +83,52 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_adios_globaltime_OBJECTS = adios_globaltime.$(OBJEXT)
-adios_globaltime_OBJECTS = $(am_adios_globaltime_OBJECTS)
+ at BUILD_FORTRAN_TRUE@am__EXEEXT_1 = scalars_write_F$(EXEEXT) \
+ at BUILD_FORTRAN_TRUE@	scalars_read_F$(EXEEXT)
+am_scalars_read_C_OBJECTS = scalars_read_C.$(OBJEXT)
+scalars_read_C_OBJECTS = $(am_scalars_read_C_OBJECTS)
 am__DEPENDENCIES_1 =
-adios_globaltime_DEPENDENCIES = $(top_builddir)/src/libadios.a \
+scalars_read_C_DEPENDENCIES = $(top_builddir)/src/libadiosread.a \
 	$(am__DEPENDENCIES_1)
-adios_globaltime_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+scalars_read_C_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(adios_globaltime_LDFLAGS) $(LDFLAGS) -o $@
-am_adios_globaltime_no_xml_OBJECTS =  \
-	adios_globaltime_no_xml.$(OBJEXT)
-adios_globaltime_no_xml_OBJECTS =  \
-	$(am_adios_globaltime_no_xml_OBJECTS)
-adios_globaltime_no_xml_DEPENDENCIES = $(top_builddir)/src/libadios.a \
+	$(scalars_read_C_LDFLAGS) $(LDFLAGS) -o $@
+am__scalars_read_F_SOURCES_DIST = scalars_read_F.F90
+ at BUILD_FORTRAN_TRUE@am_scalars_read_F_OBJECTS =  \
+ at BUILD_FORTRAN_TRUE@	scalars_read_F.$(OBJEXT)
+scalars_read_F_OBJECTS = $(am_scalars_read_F_OBJECTS)
+ at BUILD_FORTRAN_TRUE@scalars_read_F_DEPENDENCIES =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosreadf.a \
+ at BUILD_FORTRAN_TRUE@	$(am__DEPENDENCIES_1)
+scalars_read_F_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(scalars_read_F_LDFLAGS) $(LDFLAGS) -o $@
+am_scalars_write_C_OBJECTS = scalars_write_C.$(OBJEXT)
+scalars_write_C_OBJECTS = $(am_scalars_write_C_OBJECTS)
+scalars_write_C_DEPENDENCIES = $(top_builddir)/src/libadios.a \
 	$(am__DEPENDENCIES_1)
-adios_globaltime_no_xml_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(adios_globaltime_no_xml_LDFLAGS) $(LDFLAGS) -o $@
-am_adios_read_globaltime_OBJECTS = adios_read_globaltime.$(OBJEXT)
-adios_read_globaltime_OBJECTS = $(am_adios_read_globaltime_OBJECTS)
-adios_read_globaltime_DEPENDENCIES =  \
-	$(top_builddir)/src/libadiosread.a $(am__DEPENDENCIES_1)
-adios_read_globaltime_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+scalars_write_C_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(adios_read_globaltime_LDFLAGS) $(LDFLAGS) -o $@
-am_adios_read_globaltime_streaming_OBJECTS =  \
-	adios_read_globaltime_streaming.$(OBJEXT)
-adios_read_globaltime_streaming_OBJECTS =  \
-	$(am_adios_read_globaltime_streaming_OBJECTS)
-adios_read_globaltime_streaming_DEPENDENCIES =  \
-	$(top_builddir)/src/libadiosread.a $(am__DEPENDENCIES_1)
-adios_read_globaltime_streaming_LINK = $(LIBTOOL) --tag=CC \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
-	$(AM_CFLAGS) $(CFLAGS) \
-	$(adios_read_globaltime_streaming_LDFLAGS) $(LDFLAGS) -o $@
+	$(scalars_write_C_LDFLAGS) $(LDFLAGS) -o $@
+am__scalars_write_F_SOURCES_DIST = scalars_write_F.F90
+ at BUILD_FORTRAN_TRUE@am_scalars_write_F_OBJECTS =  \
+ at BUILD_FORTRAN_TRUE@	scalars_write_F.$(OBJEXT)
+scalars_write_F_OBJECTS = $(am_scalars_write_F_OBJECTS)
+ at BUILD_FORTRAN_TRUE@scalars_write_F_DEPENDENCIES =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
+ at BUILD_FORTRAN_TRUE@	$(am__DEPENDENCIES_1)
+scalars_write_F_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(scalars_write_F_LDFLAGS) $(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp =
 am__depfiles_maybe =
+PPFCCOMPILE = $(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+FCLD = $(FC)
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -132,14 +138,11 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
-SOURCES = $(adios_globaltime_SOURCES) \
-	$(adios_globaltime_no_xml_SOURCES) \
-	$(adios_read_globaltime_SOURCES) \
-	$(adios_read_globaltime_streaming_SOURCES)
-DIST_SOURCES = $(adios_globaltime_SOURCES) \
-	$(adios_globaltime_no_xml_SOURCES) \
-	$(adios_read_globaltime_SOURCES) \
-	$(adios_read_globaltime_streaming_SOURCES)
+SOURCES = $(scalars_read_C_SOURCES) $(scalars_read_F_SOURCES) \
+	$(scalars_write_C_SOURCES) $(scalars_write_F_SOURCES)
+DIST_SOURCES = $(scalars_read_C_SOURCES) \
+	$(am__scalars_read_F_SOURCES_DIST) $(scalars_write_C_SOURCES) \
+	$(am__scalars_write_F_SOURCES_DIST)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -227,7 +230,7 @@ EXEEXT = @EXEEXT@
 FASTBIT_CPPFLAGS = @FASTBIT_CPPFLAGS@
 FASTBIT_LDFLAGS = @FASTBIT_LDFLAGS@
 FASTBIT_LIBS = @FASTBIT_LIBS@
-FC = @FC@
+FC = $(MPIFC)
 FCFLAGS = @FCFLAGS@
 FCLIBS = @FCLIBS@
 FGREP = @FGREP@
@@ -341,6 +344,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -398,31 +404,38 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
-adios_globaltime_SOURCES = adios_globaltime.c
-adios_globaltime_LDADD = $(top_builddir)/src/libadios.a \
+scalars_write_C_SOURCES = scalars_write_C.c 
+scalars_write_C_LDADD = $(top_builddir)/src/libadios.a \
 	$(ADIOSLIB_LDADD)
-adios_globaltime_LDFLAGS = $(ADIOSLIB_LDFLAGS)
-adios_globaltime_no_xml_SOURCES = adios_globaltime_no_xml.c
-adios_globaltime_no_xml_LDADD = $(top_builddir)/src/libadios.a \
-	$(ADIOSLIB_LDADD)
-adios_globaltime_no_xml_LDFLAGS = $(ADIOSLIB_LDFLAGS)
-adios_read_globaltime_SOURCES = adios_read_globaltime.c
-adios_read_globaltime_LDADD = $(top_builddir)/src/libadiosread.a \
+scalars_write_C_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+scalars_read_C_SOURCES = scalars_read_C.c
+scalars_read_C_LDADD = $(top_builddir)/src/libadiosread.a \
 	$(ADIOSREADLIB_LDADD)
-adios_read_globaltime_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
-adios_read_globaltime_streaming_SOURCES = adios_read_globaltime_streaming.c
-adios_read_globaltime_streaming_LDADD =  \
-	$(top_builddir)/src/libadiosread.a $(ADIOSREADLIB_LDADD)
-adios_read_globaltime_streaming_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
-CLEANFILES = *.bp
-EXTRA_DIST = adios_globaltime.xml gread_restart.ch gwrite_restart.ch job.pbs
+scalars_read_C_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+CLEANFILES = *.bp *.ch *.fh
+EXTRA_DIST = scalars_C.xml scalars_F.xml 
+ at BUILD_FORTRAN_TRUE@scalars_write_F_SOURCES = scalars_write_F.F90
+ at BUILD_FORTRAN_TRUE@scalars_write_F_LDADD =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosf.a \
+ at BUILD_FORTRAN_TRUE@	$(ADIOSLIB_LDADD)
+ at BUILD_FORTRAN_TRUE@scalars_write_F_LDFLAGS = $(ADIOSLIB_LDFLAGS)
+ at BUILD_FORTRAN_TRUE@scalars_read_F_SOURCES = scalars_read_F.F90
+ at BUILD_FORTRAN_TRUE@scalars_read_F_LDADD =  \
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/src/libadiosreadf.a \
+ at BUILD_FORTRAN_TRUE@	$(ADIOSREADLIB_LDADD)
+ at BUILD_FORTRAN_TRUE@scalars_read_F_LDFLAGS = $(ADIOSREADLIB_LDFLAGS)
+FCLINK = \
+        $(LIBTOOL) --mode=link --tag F77 $(FC) \
+        $(AM_FCFLAGS) $(FCFLAGS) $(LDFLAGS) -o $@
+
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .F90 .c .lo .o .obj
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -432,9 +445,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/C/global-array-time/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/suite/programs/examples/scalars/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu examples/C/global-array-time/Makefile
+	  $(AUTOMAKE) --gnu tests/suite/programs/examples/scalars/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -454,26 +467,26 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
 	echo " rm -f" $$list; \
 	rm -f $$list || exit $$?; \
 	test -n "$(EXEEXT)" || exit 0; \
 	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
 	echo " rm -f" $$list; \
 	rm -f $$list
-adios_globaltime$(EXEEXT): $(adios_globaltime_OBJECTS) $(adios_globaltime_DEPENDENCIES) 
-	@rm -f adios_globaltime$(EXEEXT)
-	$(adios_globaltime_LINK) $(adios_globaltime_OBJECTS) $(adios_globaltime_LDADD) $(LIBS)
-adios_globaltime_no_xml$(EXEEXT): $(adios_globaltime_no_xml_OBJECTS) $(adios_globaltime_no_xml_DEPENDENCIES) 
-	@rm -f adios_globaltime_no_xml$(EXEEXT)
-	$(adios_globaltime_no_xml_LINK) $(adios_globaltime_no_xml_OBJECTS) $(adios_globaltime_no_xml_LDADD) $(LIBS)
-adios_read_globaltime$(EXEEXT): $(adios_read_globaltime_OBJECTS) $(adios_read_globaltime_DEPENDENCIES) 
-	@rm -f adios_read_globaltime$(EXEEXT)
-	$(adios_read_globaltime_LINK) $(adios_read_globaltime_OBJECTS) $(adios_read_globaltime_LDADD) $(LIBS)
-adios_read_globaltime_streaming$(EXEEXT): $(adios_read_globaltime_streaming_OBJECTS) $(adios_read_globaltime_streaming_DEPENDENCIES) 
-	@rm -f adios_read_globaltime_streaming$(EXEEXT)
-	$(adios_read_globaltime_streaming_LINK) $(adios_read_globaltime_streaming_OBJECTS) $(adios_read_globaltime_streaming_LDADD) $(LIBS)
+scalars_read_C$(EXEEXT): $(scalars_read_C_OBJECTS) $(scalars_read_C_DEPENDENCIES) 
+	@rm -f scalars_read_C$(EXEEXT)
+	$(scalars_read_C_LINK) $(scalars_read_C_OBJECTS) $(scalars_read_C_LDADD) $(LIBS)
+scalars_read_F$(EXEEXT): $(scalars_read_F_OBJECTS) $(scalars_read_F_DEPENDENCIES) 
+	@rm -f scalars_read_F$(EXEEXT)
+	$(scalars_read_F_LINK) $(scalars_read_F_OBJECTS) $(scalars_read_F_LDADD) $(LIBS)
+scalars_write_C$(EXEEXT): $(scalars_write_C_OBJECTS) $(scalars_write_C_DEPENDENCIES) 
+	@rm -f scalars_write_C$(EXEEXT)
+	$(scalars_write_C_LINK) $(scalars_write_C_OBJECTS) $(scalars_write_C_LDADD) $(LIBS)
+scalars_write_F$(EXEEXT): $(scalars_write_F_OBJECTS) $(scalars_write_F_DEPENDENCIES) 
+	@rm -f scalars_write_F$(EXEEXT)
+	$(scalars_write_F_LINK) $(scalars_write_F_OBJECTS) $(scalars_write_F_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -481,6 +494,15 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $<
+
+.F90.obj:
+	$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F90.lo:
+	$(LTPPFCCOMPILE) -c -o $@ $<
+
 .c.o:
 	$(COMPILE) -c $<
 
@@ -579,8 +601,9 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
 check: check-am
-all-am: Makefile $(PROGRAMS) all-local
+all-am: Makefile all-local
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -610,7 +633,7 @@ maintainer-clean-generic:
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
 	mostlyclean-am
 
 distclean: distclean-am
@@ -677,10 +700,10 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
-	clean-generic clean-libtool clean-noinstPROGRAMS ctags \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
 	distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
@@ -695,7 +718,13 @@ uninstall-am:
 
 
 all-local:
-	test "$(srcdir)" = "$(builddir)" || cp $(srcdir)/*.xml $(builddir)
+	test "$(srcdir)" = "$(builddir)" || cp -p $(srcdir)/*.xml $(builddir)
+scalars_write_C.o: gwrite_scalars.ch 
+gwrite_scalars.ch: scalars_C.xml
+	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/scalars_C.xml
+ at BUILD_FORTRAN_TRUE@scalars_write_F.o: gwrite_scalars.fh 
+ at BUILD_FORTRAN_TRUE@gwrite_scalars.fh: scalars_F.xml
+ at BUILD_FORTRAN_TRUE@	$(top_builddir)/utils/gpp/gpp.py $(srcdir)/scalars_F.xml
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/tests/suite/programs/examples/scalars/scalars_C.xml b/tests/suite/programs/examples/scalars/scalars_C.xml
new file mode 100644
index 0000000..96440be
--- /dev/null
+++ b/tests/suite/programs/examples/scalars/scalars_C.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<adios-config host-language="C">
+
+    <adios-group name="scalars">
+        <!-- name    defines the variable name in the output file
+             gwrite  defines the variable name in the code to write out
+             gwrite is optional
+        -->
+        <var name="var_byte"            gwrite="v1"   type="byte"/>
+        <var name="var_short"           gwrite="v2"   type="short"/>
+        <var name="var_int"             gwrite="v3"   type="integer"/>
+        <var name="var_long"            gwrite="v4"   type="long"/>
+        <var name="var_ubyte"           gwrite="v5"   type="unsigned byte"/>
+        <var name="var_ushort"          gwrite="v6"   type="unsigned short"/>
+        <var name="var_uint"            gwrite="v7"   type="unsigned integer"/>
+        <var name="var_ulong"           gwrite="v8"   type="unsigned long"/>
+        <var name="var_real"            gwrite="v9"   type="real"/>
+        <var name="var_double"          gwrite="v10"  type="double"/>
+        <var name="var_string"          gwrite="v11"  type="string"/>
+        <var name="var_complex"         gwrite="v12"  type="complex"/>
+        <var name="var_double_complex"  gwrite="v13"  type="double complex"/>
+    </adios-group>
+
+    <method group="scalars" method="MPI"/>
+
+    <buffer size-MB="20" allocate-time="now"/>
+
+</adios-config>
+
diff --git a/tests/suite/programs/examples/scalars/scalars_F.xml b/tests/suite/programs/examples/scalars/scalars_F.xml
new file mode 100644
index 0000000..6da498c
--- /dev/null
+++ b/tests/suite/programs/examples/scalars/scalars_F.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<adios-config host-language="Fortran">
+
+    <adios-group name="scalars">
+        <!-- name    defines the variable name in the output file
+             gwrite  defines the variable name in the code to write out
+             gread   defines the variable name in the code to read the value into
+             gwrite and gread are optional
+        -->
+        <var name="var_byte"            gwrite="v1"  gread="v1"  type="byte"/>
+        <var name="var_short"           gwrite="v2"  gread="v2"  type="short"/>
+        <var name="var_int"             gwrite="v3"  gread="v3"  type="integer"/>
+        <var name="var_long"            gwrite="v4"  gread="v4"  type="long"/>
+        <var name="var_ubyte"           gwrite="v5"  gread="v5"  type="unsigned byte"/>
+        <var name="var_ushort"          gwrite="v6"  gread="v6"  type="unsigned short"/>
+        <var name="var_uint"            gwrite="v7"  gread="v7"  type="unsigned integer"/>
+        <var name="var_ulong"           gwrite="v8"  gread="v8"  type="unsigned long"/>
+        <var name="var_real"            gwrite="v9"  gread="v9"  type="real"/>
+        <var name="var_double"          gwrite="v10" gread="v10" type="double"/>
+        <var name="var_string"          gwrite="v11" gread="v11" type="string"/>
+        <var name="var_complex"         gwrite="v12" gread="v12" type="complex"/>
+        <var name="var_double_complex"  gwrite="v13" gread="v13" type="double complex"/>
+    </adios-group>
+
+    <method group="scalars" method="MPI"/>
+
+    <buffer size-MB="20" allocate-time="now"/>
+
+</adios-config>
+
diff --git a/tests/suite/programs/examples/scalars/scalars_read_C.c b/tests/suite/programs/examples/scalars/scalars_read_C.c
new file mode 100644
index 0000000..dca789d
--- /dev/null
+++ b/tests/suite/programs/examples/scalars/scalars_read_C.c
@@ -0,0 +1,111 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/*********************************************************************/
+/*   Example of reading various types of scalar variables in ADIOS   */
+/*********************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios_read.h"
+
+typedef struct complex
+{
+   float r;
+   float i; 
+} complex;
+
+typedef struct double_complex
+{
+   double r;
+   double i; 
+} double_complex;
+
+
+int main (int argc, char ** argv) 
+{
+    char        filename [256];
+    int         rank;
+    MPI_Comm    comm = MPI_COMM_WORLD;
+    enum ADIOS_READ_METHOD method = ADIOS_READ_METHOD_BP;
+    ADIOS_SELECTION * sel1=NULL;
+
+    int8_t  v1 = 0;
+    int16_t v2 = 0;
+    int32_t v3 = 0;
+    int64_t v4 = 0;
+
+    uint8_t  v5 = 0;
+    uint16_t v6 = 0;
+    uint32_t v7 = 0;
+    uint64_t v8 = 0;
+
+    float v9 = 0.0;
+    double v10 = 0.0;
+
+    char v11[256];
+
+    complex v12;
+    v12.r = 0.0;
+    v12.i = 0.0;
+
+    double_complex v13;
+    v13.r = 0.0;
+    v13.i = 0.0;
+
+    MPI_Init (&argc, &argv);
+    MPI_Comm_rank (comm, &rank);
+
+    strcpy (filename, "scalars_C.bp");
+
+    adios_read_init_method (method, comm, "verbose=3");
+    ADIOS_FILE * f = adios_read_open (filename, method, comm, ADIOS_LOCKMODE_NONE, 0.0);
+
+    adios_schedule_read (f, sel1, "var_byte",           0, 1, &v1);
+    adios_schedule_read (f, sel1, "var_short",          0, 1, &v2);
+    adios_schedule_read (f, sel1, "var_int",            0, 1, &v3);
+    adios_schedule_read (f, sel1, "var_long",           0, 1, &v4);
+    adios_schedule_read (f, sel1, "var_ubyte",          0, 1, &v5);
+    adios_schedule_read (f, sel1, "var_ushort",         0, 1, &v6);
+    adios_schedule_read (f, sel1, "var_uint",           0, 1, &v7);
+    adios_schedule_read (f, sel1, "var_ulong",          0, 1, &v8);
+    adios_schedule_read (f, sel1, "var_real",           0, 1, &v9);
+    adios_schedule_read (f, sel1, "var_double",         0, 1, &v10);
+    /* note that a string is an array and thus v11 a pointer already, 
+       so we pass the v11 instead of &v11 here */
+    adios_schedule_read (f, sel1, "var_string",         0, 1, v11);
+    adios_schedule_read (f, sel1, "var_complex",        0, 1, &v12);
+    adios_schedule_read (f, sel1, "var_double_complex", 0, 1, &v13);
+    adios_perform_reads (f,1);
+
+    if (rank == 0) {
+        printf("byte        v1  = %d\n", v1);
+        printf("short       v2  = %d\n", v2);
+        printf("integer     v3  = %d\n", v3);
+        printf("long        v4  = %lld\n", v4);
+
+        printf("uns.byte    v5  = %u\n", v5);
+        printf("uns.short   v6  = %u\n", v6);
+        printf("uns.int     v7  = %u\n", v7);
+        printf("uns.long    v8  = %llu\n", v8);
+
+        printf("float       v9  = %g\n", v9);
+        printf("double      v10 = %g\n", v10);
+
+        printf("string      v11 = %s\n", v11);
+
+        printf("complex     v12 = (%g, i%g)\n", v12.r, v12.i);
+        printf("dbl-complex v13 = (%g, i%g)\n", v13.r, v13.i);
+    }
+
+    adios_read_close (f);
+    MPI_Barrier (comm);
+    adios_read_finalize_method (ADIOS_READ_METHOD_BP);
+    MPI_Finalize ();
+
+    return 0;
+}
diff --git a/tests/suite/programs/examples/scalars/scalars_read_F.F90 b/tests/suite/programs/examples/scalars/scalars_read_F.F90
new file mode 100644
index 0000000..3c4bb83
--- /dev/null
+++ b/tests/suite/programs/examples/scalars/scalars_read_F.F90
@@ -0,0 +1,102 @@
+!  
+!  ADIOS is freely available under the terms of the BSD license described
+!  in the COPYING file in the top level directory of this source distribution.
+!
+!  Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+!
+
+!/*************************************************************/
+!/*   Example of reading various types of variable in ADIOS   */
+!/*************************************************************/
+program scalars_read
+    use adios_read_mod
+    implicit none
+    include 'mpif.h'
+
+    character(len=25)   :: filename = "scalars_F.bp"
+    integer             :: rank, size, i, ierr
+    integer             :: comm
+
+    ! ADIOS variables declarations 
+    integer*8               :: f
+    integer                 :: method = ADIOS_READ_METHOD_BP
+    integer*8               :: sel
+
+    ! scalar variables to write out (including a string)
+    integer*1           :: v1 = 0
+    integer*2           :: v2 = 0
+    integer*4           :: v3 = 0
+    integer*8           :: v4 = 0
+
+    integer*1           :: v5 = 0
+    integer*2           :: v6 = 0
+    integer*4           :: v7 = 0
+    integer*8           :: v8 = 0
+
+    real*4              :: v9 = 0.0
+    real*8              :: v10 = 0.0
+
+    character(len=20)   :: v11 = "undefined"
+
+    complex*8           :: v12 = (0.0, 0.0)
+    complex*16          :: v13 = (0.0, 0.0)
+
+    call MPI_Init (ierr)
+    call MPI_Comm_dup (MPI_COMM_WORLD, comm, ierr)
+    call MPI_Comm_rank (comm, rank, ierr)
+    call MPI_Comm_size (comm, size, ierr);
+
+    call adios_read_init_method (method, comm, "verbose=3", ierr);
+
+    call adios_read_open (f, filename, method, comm, ADIOS_LOCKMODE_NONE, 1.0, ierr);
+
+    sel = 0  ! sel must be integer*8
+
+    ! option 1 for scalars: get it from the metadata read at open
+    call adios_get_scalar (f, "var_byte", v1, ierr)
+    call adios_get_scalar (f, "var_short", v2, ierr)
+    call adios_get_scalar (f, "var_int", v3, ierr)
+    call adios_get_scalar (f, "var_long", v4, ierr)
+    ! the above variables contain the value at this point
+
+    ! option 2 for scalars: read them from file
+    call adios_schedule_read (f, sel, "var_ubyte", 0, 1, v5, ierr)
+    call adios_schedule_read (f, sel, "var_ushort", 0, 1, v6, ierr)
+    call adios_schedule_read (f, sel, "var_uint", 0, 1, v7, ierr)
+    call adios_schedule_read (f, sel, "var_ulong", 0, 1, v8, ierr)
+    call adios_schedule_read (f, sel, "var_real", 0, 1, v9, ierr)
+    call adios_schedule_read (f, sel, "var_double", 0, 1, v10, ierr)
+    call adios_schedule_read (f, sel, "var_string", 0, 1, v11, ierr)
+    call adios_schedule_read (f, sel, "var_complex", 0, 1, v12, ierr)
+    call adios_schedule_read (f, sel, "var_double_complex", 0, 1, v13, ierr)
+    ! no read has been performed yet!
+    call adios_perform_reads (f, ierr)
+    ! the above variables contain the value only at this point
+
+    if (rank == 0) then
+        write (*, '("int*1      v1  = ",i3)') v1
+        write (*, '("int*2      v2  = ",i3)') v2
+        write (*, '("int*4      v3  = ",i3)') v3
+        write (*, '("int*8      v4  = ",i3)') v4
+
+        write (*, '("int*1      v5  = ",i3)') v5
+        write (*, '("int*2      v6  = ",i3)') v6
+        write (*, '("int*4      v7  = ",i3)') v7
+        write (*, '("int*8      v8  = ",i3)') v8
+
+        write (*, '("real*4     v9  = ",f6.2)') v9
+        write (*, '("real*8     v10 = ",f6.2)') v10
+
+        write (*, '("string     v11 = ",a)') trim(v11)
+
+        write (*, '("complex*8  v12 = (",f6.2,", ", f6.2,")")') v12
+        write (*, '("complex*16 v13 = (",f6.2,", ", f6.2,")")') v13
+    endif
+
+    call adios_read_close (f, ierr)
+    call MPI_Barrier (comm, ierr);
+    call adios_read_finalize_method (method, ierr);
+    call MPI_Finalize (ierr);
+
+end program
+
diff --git a/tests/suite/programs/examples/scalars/scalars_write_C.c b/tests/suite/programs/examples/scalars/scalars_write_C.c
new file mode 100644
index 0000000..d526b3c
--- /dev/null
+++ b/tests/suite/programs/examples/scalars/scalars_write_C.c
@@ -0,0 +1,82 @@
+/* 
+ * ADIOS is freely available under the terms of the BSD license described
+ * in the COPYING file in the top level directory of this source distribution.
+ *
+ * Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+ */
+
+/*************************************************************/
+/*   Example of writing various types of variable in ADIOS   */
+/*************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include "mpi.h"
+#include "adios.h"
+
+typedef struct complex
+{
+   float r;
+   float i; 
+} complex;
+
+typedef struct double_complex
+{
+   double r;
+   double i; 
+} double_complex;
+
+
+int main (int argc, char ** argv) 
+{
+    char        filename [256];
+    int         rank;
+    MPI_Comm    comm = MPI_COMM_WORLD;
+
+    uint64_t    adios_groupsize, adios_totalsize;
+    int64_t     adios_handle;
+
+    int8_t v1 = -4;
+    int16_t v2 = -3;
+    int32_t v3 = -2;
+    int64_t v4 = -1;
+
+    uint8_t v5 = 1;
+    uint16_t v6 = 2;
+    uint32_t v7 = 3;
+    uint64_t v8 = 4;
+
+    float v9 = 5.0;
+    double v10 = 6.0;
+
+    char * v11 = "ADIOS example";
+
+    complex v12;
+    v12.r = 8.0;
+    v12.i = 9.0;
+
+    double_complex v13;
+    v13.r = 10.0;
+    v13.i = 11.0;
+
+    MPI_Init (&argc, &argv);
+    MPI_Comm_rank (comm, &rank);
+
+    strcpy (filename, "scalars_C.bp");
+
+    /* adios_open() opens a "group in a file", here the "scalars" group.   
+       GWRITE is the convenient way to write all variables defined in the
+       xml file but of course one can write the individual adios_write() 
+       statements here too 
+    */
+    adios_init ("scalars_C.xml", comm);
+    adios_open (&adios_handle, "scalars", filename, "w", comm);
+#include "gwrite_scalars.ch"
+    adios_close (adios_handle);
+
+    MPI_Barrier (comm);
+
+    adios_finalize (rank);
+
+    MPI_Finalize ();
+    return 0;
+}
diff --git a/tests/suite/programs/examples/scalars/scalars_write_F.F90 b/tests/suite/programs/examples/scalars/scalars_write_F.F90
new file mode 100644
index 0000000..a88a806
--- /dev/null
+++ b/tests/suite/programs/examples/scalars/scalars_write_F.F90
@@ -0,0 +1,62 @@
+!  
+!  ADIOS is freely available under the terms of the BSD license described
+!  in the COPYING file in the top level directory of this source distribution.
+!
+!  Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
+!
+
+!/*************************************************************/
+!/*   Example of writing various types of variable in ADIOS   */
+!/*************************************************************/
+program scalars
+    use adios_write_mod
+    implicit none
+    include 'mpif.h'
+
+    character(len=25)   :: filename = "scalars_F.bp"
+    integer             :: rank, size, i, ierr
+    integer             :: comm
+
+    ! ADIOS variables declarations for matching gwrite_scalars.fh 
+    integer                 :: adios_err
+    integer*8               :: adios_groupsize, adios_totalsize
+    integer*8               :: adios_handle
+
+    ! scalar variables to write out (including a string)
+    integer*1           :: v1 = -4
+    integer*2           :: v2 = -3
+    integer*4           :: v3 = -2
+    integer*8           :: v4 = -1
+
+    integer*1           :: v5 = 1
+    integer*2           :: v6 = 2
+    integer*4           :: v7 = 3
+    integer*8           :: v8 = 4
+
+    real*4              :: v9 = 5.0
+    real*8              :: v10 = 6.0
+
+    character(len=20)   :: v11 = "ADIOS example"
+
+    complex*8           :: v12 = (8.0, 9.0)
+    complex*16          :: v13 = (10.0, 11.0)
+
+    call MPI_Init (ierr)
+    call MPI_Comm_dup (MPI_COMM_WORLD, comm, ierr)
+    call MPI_Comm_rank (comm, rank, ierr)
+    call MPI_Comm_size (comm, size, ierr);
+
+    call adios_init ("scalars_F.xml", comm, adios_err);
+    ! adios_open() opens a 'group in a file', here the 'scalars' group
+    call adios_open (adios_handle, "scalars", filename, "w", comm, adios_err);
+#include "gwrite_scalars.fh"
+    call adios_close (adios_handle, adios_err)
+
+    call MPI_Barrier (comm, ierr);
+
+    call adios_finalize (rank, adios_err);
+
+    call MPI_Finalize (ierr);
+
+end program
+
diff --git a/tests/suite/programs/hashtest.c b/tests/suite/programs/hashtest.c
index a1d1dee..4e2ea65 100644
--- a/tests/suite/programs/hashtest.c
+++ b/tests/suite/programs/hashtest.c
@@ -143,8 +143,8 @@ int dotest ()
     }
     time (&tget);
     tget = tget - tbegin;
-    printf("Timing: put %d elements in %d seconds, got them back in %d seconds\n",
-            npaths*nvars, tput, tget);
+    printf("Timing: put %d elements in %ld seconds, got them back in %ld seconds\n",
+            npaths*nvars, (long)tput, (long)tget);
 
     /* Print hashtable */
     printf("============== PRINT HASHTABLE ============\n");
diff --git a/tests/suite/programs/many_vars.c b/tests/suite/programs/many_vars.c
index ea89543..ffd7285 100644
--- a/tests/suite/programs/many_vars.c
+++ b/tests/suite/programs/many_vars.c
@@ -31,6 +31,7 @@
 int NVARS = 1;
 int NBLOCKS = 1;
 int NSTEPS = 1;
+int REDEFINE = 0; // 1: delete and redefine variable definitions at each step to test adios_delete_vardefs()
 static const char FILENAME[] = "many_vars.bp";
 #define VALUE(rank, step, block) (step * 10000 + 10*rank + block)
 
@@ -118,10 +119,11 @@ void fini_vars()
 
 void Usage() 
 {
-    printf("Usage: many_vars <nvars> <nblocks> <nsteps>\n" 
+    printf("Usage: many_vars <nvars> <nblocks> <nsteps> [redef]\n" 
             "    <nvars>:   Number of variables to generate\n"
             "    <nblocks>: Number of blocks per process to write\n"
-            "    <nsteps>:  Number of write cycles (to same file)\n");
+            "    <nsteps>:  Number of write cycles (to same file)\n"
+            "    [redef]:   delete and redefine variables at every step\n");
 }
 
 void define_vars ();
@@ -155,6 +157,14 @@ int main (int argc, char ** argv)
         NSTEPS = i;
     }
 
+    if (argc > 4) {
+        if (!strncasecmp (argv[4], "redef", 5)) {
+            printf("Delete and redefine variable definitions at each step.\n");
+            REDEFINE=1;
+        }
+    }
+
+
     alloc_vars();
     adios_init_noxml (comm);
     adios_allocate_buffer (ADIOS_BUFFER_ALLOC_NOW, 100);
@@ -167,12 +177,21 @@ int main (int argc, char ** argv)
     adios_select_method (m_adios_group, "MPI", "", "");
 
 
-    define_vars();
     set_gdim();
     
     for (i=0; i<NSTEPS; i++) {
         if (!err) {
+            if (i==0 || REDEFINE) {
+                printf("-- Define variables.\n");
+                define_vars();
+            }
+
             err = write_file (i); 
+
+            if (REDEFINE) {
+                printf("-- Delete variable definitions.\n");
+                adios_delete_vardefs(m_adios_group);
+            }
         }
     }
 
@@ -318,7 +337,7 @@ int read_file ()
     log ("Read and check data in %s\n", FILENAME);
     f = adios_read_open_file (FILENAME, ADIOS_READ_METHOD_BP, comm);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
diff --git a/tests/suite/programs/path_test.c b/tests/suite/programs/path_test.c
index 46af066..761eb13 100644
--- a/tests/suite/programs/path_test.c
+++ b/tests/suite/programs/path_test.c
@@ -247,7 +247,7 @@ int read_file (char *fname)
     log ("Read and check data in %s\n", fname);
     f = adios_read_open_file (fname, ADIOS_READ_METHOD_BP, comm);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
diff --git a/tests/suite/programs/reuse_dim.c b/tests/suite/programs/reuse_dim.c
index 7f79d8c..d702230 100755
--- a/tests/suite/programs/reuse_dim.c
+++ b/tests/suite/programs/reuse_dim.c
@@ -187,7 +187,7 @@ int read_file (char *fname)
     log ("Read and check data in %s\n", fname);
     f = adios_read_open_file (fname, ADIOS_READ_METHOD_BP, comm);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
diff --git a/tests/suite/programs/selections.c b/tests/suite/programs/selections.c
index 637203f..8c9004b 100644
--- a/tests/suite/programs/selections.c
+++ b/tests/suite/programs/selections.c
@@ -336,7 +336,7 @@ int read_points ()
     f = adios_read_open (FILENAME, read_method, comm,
                          ADIOS_LOCKMODE_CURRENT, 0.0);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
diff --git a/tests/suite/programs/set_path.c b/tests/suite/programs/set_path.c
index a8562c4..c2a7c5f 100644
--- a/tests/suite/programs/set_path.c
+++ b/tests/suite/programs/set_path.c
@@ -254,7 +254,7 @@ int read_file ()
     log ("Read and check data in %s\n", FILENAME);
     f = adios_read_open_file (FILENAME, ADIOS_READ_METHOD_BP, comm);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
diff --git a/tests/suite/programs/set_path_var.c b/tests/suite/programs/set_path_var.c
index 4bdb5ca..5b6968c 100644
--- a/tests/suite/programs/set_path_var.c
+++ b/tests/suite/programs/set_path_var.c
@@ -272,7 +272,7 @@ int read_file ()
     log ("Read and check data in %s\n", FILENAME);
     f = adios_read_open_file (FILENAME, ADIOS_READ_METHOD_BP, comm);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
diff --git a/tests/suite/programs/transforms_writeblock_read.c b/tests/suite/programs/transforms_writeblock_read.c
index 204392f..9e5d45d 100644
--- a/tests/suite/programs/transforms_writeblock_read.c
+++ b/tests/suite/programs/transforms_writeblock_read.c
@@ -8,6 +8,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdint.h>
+#include <string.h>
 #include <assert.h>
 
 #include <adios_read.h>
diff --git a/tests/suite/programs/two_groups.c b/tests/suite/programs/two_groups.c
index dd3e7e5..3e5a7a1 100644
--- a/tests/suite/programs/two_groups.c
+++ b/tests/suite/programs/two_groups.c
@@ -180,7 +180,7 @@ int read_file ()
     log ("Read and check data in %s\n", FILENAME);
     f = adios_read_open_file (FILENAME, ADIOS_READ_METHOD_BP, comm);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
@@ -229,7 +229,7 @@ int read_by_group ()
     log ("Read and check data in %s\n", FILENAME);
     f = adios_read_open_file (FILENAME, ADIOS_READ_METHOD_BP, comm);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
@@ -238,7 +238,7 @@ int read_by_group ()
     log ("  Limit view to first group only\n");
     err = adios_group_view (f, 0);
     if (err) {
-        printE ("Error in adios_group_view: %s\n", rank, adios_errmsg());
+        printE ("Error in adios_group_view: %s\n", adios_errmsg());
         goto endread;
     }
 
@@ -259,7 +259,7 @@ int read_by_group ()
     log ("  Limit view to second group only\n");
     err = adios_group_view (f, 1);
     if (err) {
-        printE ("Error in adios_group_view: %s\n", rank, adios_errmsg());
+        printE ("Error in adios_group_view: %s\n", adios_errmsg());
         goto endread;
     }
 
diff --git a/tests/suite/programs/write_alternate.c b/tests/suite/programs/write_alternate.c
index 92e55ea..69fce78 100644
--- a/tests/suite/programs/write_alternate.c
+++ b/tests/suite/programs/write_alternate.c
@@ -271,7 +271,7 @@ int read_file ()
     log ("Read and check data in %s\n", FILENAME);
     f = adios_read_open_file (FILENAME, ADIOS_READ_METHOD_BP, comm);
     if (f == NULL) {
-        printE ("Error at opening file: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file: %s\n", adios_errmsg());
         return 1;
     }
 
@@ -405,7 +405,7 @@ int read_stream ()
     f = adios_read_open (FILENAME, ADIOS_READ_METHOD_BP, comm,
                          ADIOS_LOCKMODE_NONE, 0.0);
     if (f == NULL) {
-        printE ("Error at opening file as stream: %s\n", rank, adios_errmsg());
+        printE ("Error at opening file as stream: %s\n", adios_errmsg());
         return 1;
     }
 
diff --git a/tests/suite/reference/attributes_bpls.txt b/tests/suite/reference/attributes_bpls.txt
index 6a59906..d35afc6 100644
--- a/tests/suite/reference/attributes_bpls.txt
+++ b/tests/suite/reference/attributes_bpls.txt
@@ -4,16 +4,16 @@ File info:
   of attributes: 4
   of meshes:     0
   time steps:    0 - 0
-  bp version:    2
+  bp version:    3
   statistics:    Min / Max / Avg / Std_dev
 
-  integer  NX                            scalar = 10 
-  integer  size                          scalar = 5 
-  integer  rank                          scalar = 0 
-  double   mean                          scalar = 4.5 
+  integer  NX                            scalar = 10
+  integer  size                          scalar = 5
+  integer  rank                          scalar = 0
+  double   mean                          scalar = 4.5
   string   date                          scalar = "Nov, 2009"
-  double   temperature                   {5, 10} = 0 / 49 / 24.5 / 14.4309 
-  integer  temperature/number of levels  attr   = 1 
+  double   temperature                   {5, 10} = 0 / 49 / 24.5 / 14.4309
+  integer  temperature/number of levels  attr   = 1
   string   temperature/description       attr   = "Global array written from 'size' processes"
-  double   temperature/mean value        attr   = 4.5 
+  double   temperature/mean value        attr   = 4.5
   string   temperature/date of coding    attr   = "Nov, 2009"
diff --git a/tests/suite/reference/attributes_read.txt b/tests/suite/reference/attributes_read.txt
index e9a270c..58109f9 100644
--- a/tests/suite/reference/attributes_read.txt
+++ b/tests/suite/reference/attributes_read.txt
@@ -1,8 +1,8 @@
-rank 0: attr: double temperature/mean value = 4.500000e+00
 rank 0: attr: integer temperature/number of levels = 1
-rank 0: attr: string temperature/date of coding = Nov, 2009
-rank 0: attr: string temperature/description = Global array written from 'size' processes
-rank 1: attr: double temperature/mean value = 4.500000e+00
+rank 0: attr: string temperature/description = "Global array written from 'size' processes"
+rank 0: attr: double temperature/mean value = 4.500000e+00
+rank 0: attr: string temperature/date of coding = "Nov, 2009"
 rank 1: attr: integer temperature/number of levels = 1
-rank 1: attr: string temperature/date of coding = Nov, 2009
-rank 1: attr: string temperature/description = Global array written from 'size' processes
+rank 1: attr: string temperature/description = "Global array written from 'size' processes"
+rank 1: attr: double temperature/mean value = 4.500000e+00
+rank 1: attr: string temperature/date of coding = "Nov, 2009"
diff --git a/tests/suite/reference/global_array_bpls.txt b/tests/suite/reference/global_array_bpls.txt
index a5ba4fc..eb4ecd8 100644
--- a/tests/suite/reference/global_array_bpls.txt
+++ b/tests/suite/reference/global_array_bpls.txt
@@ -1,13 +1,13 @@
-  integer  NX                       scalar = 10 
-  integer  size                     scalar = 7 
-  integer  rank                     scalar = 0 
-  double   temperature              {7, 10} = 0 / 69 / 34.5 / 20.2052 
-    (0,0)    0 1 2 3 4 5 6 7 8 9 
-    (1,0)    10 11 12 13 14 15 16 17 18 19 
-    (2,0)    20 21 22 23 24 25 26 27 28 29 
-    (3,0)    30 31 32 33 34 35 36 37 38 39 
-    (4,0)    40 41 42 43 44 45 46 47 48 49 
-    (5,0)    50 51 52 53 54 55 56 57 58 59 
-    (6,0)    60 61 62 63 64 65 66 67 68 69 
+  integer  NX                       scalar = 10
+  integer  size                     scalar = 7
+  integer  rank                     scalar = 0
+  double   temperature              {7, 10} = 0 / 69 / 34.5 / 20.2052
+    (0,0)    0 1 2 3 4 5 6 7 8 9
+    (1,0)    10 11 12 13 14 15 16 17 18 19
+    (2,0)    20 21 22 23 24 25 26 27 28 29
+    (3,0)    30 31 32 33 34 35 36 37 38 39
+    (4,0)    40 41 42 43 44 45 46 47 48 49
+    (5,0)    50 51 52 53 54 55 56 57 58 59
+    (6,0)    60 61 62 63 64 65 66 67 68 69
 
   string   temperature/description  attr   = "Global array written from 'size' processes"
diff --git a/tests/suite/reference/global_array_no_xml_bpls.txt b/tests/suite/reference/global_array_no_xml_bpls.txt
index 8b4669f..688c7c4 100644
--- a/tests/suite/reference/global_array_no_xml_bpls.txt
+++ b/tests/suite/reference/global_array_no_xml_bpls.txt
@@ -4,221 +4,221 @@ File info:
   of attributes: 0
   of meshes:     0
   time steps:    0 - 0
-  bp version:    2
+  bp version:    3
   statistics:    Min / Max / Avg / Std_dev
 
-  integer  NX             scalar = 100 
-  integer  Global_bounds  scalar = 2100 
-  integer  Offsets        scalar = 0 
-  double   temperature    {2100} = 0 / 2099 / 1049.5 / 606.218 
-    (   0)    0 1 2 3 4 5 6 7 8 9 
-    (  10)    10 11 12 13 14 15 16 17 18 19 
-    (  20)    20 21 22 23 24 25 26 27 28 29 
-    (  30)    30 31 32 33 34 35 36 37 38 39 
-    (  40)    40 41 42 43 44 45 46 47 48 49 
-    (  50)    50 51 52 53 54 55 56 57 58 59 
-    (  60)    60 61 62 63 64 65 66 67 68 69 
-    (  70)    70 71 72 73 74 75 76 77 78 79 
-    (  80)    80 81 82 83 84 85 86 87 88 89 
-    (  90)    90 91 92 93 94 95 96 97 98 99 
-    ( 100)    100 101 102 103 104 105 106 107 108 109 
-    ( 110)    110 111 112 113 114 115 116 117 118 119 
-    ( 120)    120 121 122 123 124 125 126 127 128 129 
-    ( 130)    130 131 132 133 134 135 136 137 138 139 
-    ( 140)    140 141 142 143 144 145 146 147 148 149 
-    ( 150)    150 151 152 153 154 155 156 157 158 159 
-    ( 160)    160 161 162 163 164 165 166 167 168 169 
-    ( 170)    170 171 172 173 174 175 176 177 178 179 
-    ( 180)    180 181 182 183 184 185 186 187 188 189 
-    ( 190)    190 191 192 193 194 195 196 197 198 199 
-    ( 200)    200 201 202 203 204 205 206 207 208 209 
-    ( 210)    210 211 212 213 214 215 216 217 218 219 
-    ( 220)    220 221 222 223 224 225 226 227 228 229 
-    ( 230)    230 231 232 233 234 235 236 237 238 239 
-    ( 240)    240 241 242 243 244 245 246 247 248 249 
-    ( 250)    250 251 252 253 254 255 256 257 258 259 
-    ( 260)    260 261 262 263 264 265 266 267 268 269 
-    ( 270)    270 271 272 273 274 275 276 277 278 279 
-    ( 280)    280 281 282 283 284 285 286 287 288 289 
-    ( 290)    290 291 292 293 294 295 296 297 298 299 
-    ( 300)    300 301 302 303 304 305 306 307 308 309 
-    ( 310)    310 311 312 313 314 315 316 317 318 319 
-    ( 320)    320 321 322 323 324 325 326 327 328 329 
-    ( 330)    330 331 332 333 334 335 336 337 338 339 
-    ( 340)    340 341 342 343 344 345 346 347 348 349 
-    ( 350)    350 351 352 353 354 355 356 357 358 359 
-    ( 360)    360 361 362 363 364 365 366 367 368 369 
-    ( 370)    370 371 372 373 374 375 376 377 378 379 
-    ( 380)    380 381 382 383 384 385 386 387 388 389 
-    ( 390)    390 391 392 393 394 395 396 397 398 399 
-    ( 400)    400 401 402 403 404 405 406 407 408 409 
-    ( 410)    410 411 412 413 414 415 416 417 418 419 
-    ( 420)    420 421 422 423 424 425 426 427 428 429 
-    ( 430)    430 431 432 433 434 435 436 437 438 439 
-    ( 440)    440 441 442 443 444 445 446 447 448 449 
-    ( 450)    450 451 452 453 454 455 456 457 458 459 
-    ( 460)    460 461 462 463 464 465 466 467 468 469 
-    ( 470)    470 471 472 473 474 475 476 477 478 479 
-    ( 480)    480 481 482 483 484 485 486 487 488 489 
-    ( 490)    490 491 492 493 494 495 496 497 498 499 
-    ( 500)    500 501 502 503 504 505 506 507 508 509 
-    ( 510)    510 511 512 513 514 515 516 517 518 519 
-    ( 520)    520 521 522 523 524 525 526 527 528 529 
-    ( 530)    530 531 532 533 534 535 536 537 538 539 
-    ( 540)    540 541 542 543 544 545 546 547 548 549 
-    ( 550)    550 551 552 553 554 555 556 557 558 559 
-    ( 560)    560 561 562 563 564 565 566 567 568 569 
-    ( 570)    570 571 572 573 574 575 576 577 578 579 
-    ( 580)    580 581 582 583 584 585 586 587 588 589 
-    ( 590)    590 591 592 593 594 595 596 597 598 599 
-    ( 600)    600 601 602 603 604 605 606 607 608 609 
-    ( 610)    610 611 612 613 614 615 616 617 618 619 
-    ( 620)    620 621 622 623 624 625 626 627 628 629 
-    ( 630)    630 631 632 633 634 635 636 637 638 639 
-    ( 640)    640 641 642 643 644 645 646 647 648 649 
-    ( 650)    650 651 652 653 654 655 656 657 658 659 
-    ( 660)    660 661 662 663 664 665 666 667 668 669 
-    ( 670)    670 671 672 673 674 675 676 677 678 679 
-    ( 680)    680 681 682 683 684 685 686 687 688 689 
-    ( 690)    690 691 692 693 694 695 696 697 698 699 
-    ( 700)    700 701 702 703 704 705 706 707 708 709 
-    ( 710)    710 711 712 713 714 715 716 717 718 719 
-    ( 720)    720 721 722 723 724 725 726 727 728 729 
-    ( 730)    730 731 732 733 734 735 736 737 738 739 
-    ( 740)    740 741 742 743 744 745 746 747 748 749 
-    ( 750)    750 751 752 753 754 755 756 757 758 759 
-    ( 760)    760 761 762 763 764 765 766 767 768 769 
-    ( 770)    770 771 772 773 774 775 776 777 778 779 
-    ( 780)    780 781 782 783 784 785 786 787 788 789 
-    ( 790)    790 791 792 793 794 795 796 797 798 799 
-    ( 800)    800 801 802 803 804 805 806 807 808 809 
-    ( 810)    810 811 812 813 814 815 816 817 818 819 
-    ( 820)    820 821 822 823 824 825 826 827 828 829 
-    ( 830)    830 831 832 833 834 835 836 837 838 839 
-    ( 840)    840 841 842 843 844 845 846 847 848 849 
-    ( 850)    850 851 852 853 854 855 856 857 858 859 
-    ( 860)    860 861 862 863 864 865 866 867 868 869 
-    ( 870)    870 871 872 873 874 875 876 877 878 879 
-    ( 880)    880 881 882 883 884 885 886 887 888 889 
-    ( 890)    890 891 892 893 894 895 896 897 898 899 
-    ( 900)    900 901 902 903 904 905 906 907 908 909 
-    ( 910)    910 911 912 913 914 915 916 917 918 919 
-    ( 920)    920 921 922 923 924 925 926 927 928 929 
-    ( 930)    930 931 932 933 934 935 936 937 938 939 
-    ( 940)    940 941 942 943 944 945 946 947 948 949 
-    ( 950)    950 951 952 953 954 955 956 957 958 959 
-    ( 960)    960 961 962 963 964 965 966 967 968 969 
-    ( 970)    970 971 972 973 974 975 976 977 978 979 
-    ( 980)    980 981 982 983 984 985 986 987 988 989 
-    ( 990)    990 991 992 993 994 995 996 997 998 999 
-    (1000)    1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 
-    (1010)    1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 
-    (1020)    1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 
-    (1030)    1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 
-    (1040)    1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 
-    (1050)    1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 
-    (1060)    1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 
-    (1070)    1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 
-    (1080)    1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 
-    (1090)    1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 
-    (1100)    1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 
-    (1110)    1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 
-    (1120)    1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 
-    (1130)    1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 
-    (1140)    1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 
-    (1150)    1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 
-    (1160)    1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 
-    (1170)    1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 
-    (1180)    1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 
-    (1190)    1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 
-    (1200)    1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 
-    (1210)    1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 
-    (1220)    1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 
-    (1230)    1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 
-    (1240)    1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 
-    (1250)    1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 
-    (1260)    1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 
-    (1270)    1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 
-    (1280)    1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 
-    (1290)    1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 
-    (1300)    1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 
-    (1310)    1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 
-    (1320)    1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 
-    (1330)    1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 
-    (1340)    1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 
-    (1350)    1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 
-    (1360)    1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 
-    (1370)    1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 
-    (1380)    1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 
-    (1390)    1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 
-    (1400)    1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 
-    (1410)    1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 
-    (1420)    1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 
-    (1430)    1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 
-    (1440)    1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 
-    (1450)    1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 
-    (1460)    1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 
-    (1470)    1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 
-    (1480)    1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 
-    (1490)    1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 
-    (1500)    1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 
-    (1510)    1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 
-    (1520)    1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 
-    (1530)    1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 
-    (1540)    1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 
-    (1550)    1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 
-    (1560)    1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 
-    (1570)    1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 
-    (1580)    1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 
-    (1590)    1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 
-    (1600)    1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 
-    (1610)    1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 
-    (1620)    1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 
-    (1630)    1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 
-    (1640)    1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 
-    (1650)    1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 
-    (1660)    1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 
-    (1670)    1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 
-    (1680)    1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 
-    (1690)    1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 
-    (1700)    1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 
-    (1710)    1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 
-    (1720)    1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 
-    (1730)    1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 
-    (1740)    1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 
-    (1750)    1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 
-    (1760)    1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 
-    (1770)    1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 
-    (1780)    1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 
-    (1790)    1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 
-    (1800)    1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 
-    (1810)    1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 
-    (1820)    1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 
-    (1830)    1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 
-    (1840)    1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 
-    (1850)    1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 
-    (1860)    1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 
-    (1870)    1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 
-    (1880)    1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 
-    (1890)    1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 
-    (1900)    1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 
-    (1910)    1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 
-    (1920)    1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 
-    (1930)    1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 
-    (1940)    1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 
-    (1950)    1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 
-    (1960)    1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 
-    (1970)    1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 
-    (1980)    1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 
-    (1990)    1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 
-    (2000)    2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 
-    (2010)    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 
-    (2020)    2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 
-    (2030)    2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 
-    (2040)    2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 
-    (2050)    2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 
-    (2060)    2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 
-    (2070)    2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 
-    (2080)    2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 
-    (2090)    2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 
+  integer  NX             scalar = 100
+  integer  Global_bounds  scalar = 2100
+  integer  Offsets        scalar = 0
+  double   temperature    {2100} = 0 / 2099 / 1049.5 / 606.218
+    (   0)    0 1 2 3 4 5 6 7 8 9
+    (  10)    10 11 12 13 14 15 16 17 18 19
+    (  20)    20 21 22 23 24 25 26 27 28 29
+    (  30)    30 31 32 33 34 35 36 37 38 39
+    (  40)    40 41 42 43 44 45 46 47 48 49
+    (  50)    50 51 52 53 54 55 56 57 58 59
+    (  60)    60 61 62 63 64 65 66 67 68 69
+    (  70)    70 71 72 73 74 75 76 77 78 79
+    (  80)    80 81 82 83 84 85 86 87 88 89
+    (  90)    90 91 92 93 94 95 96 97 98 99
+    ( 100)    100 101 102 103 104 105 106 107 108 109
+    ( 110)    110 111 112 113 114 115 116 117 118 119
+    ( 120)    120 121 122 123 124 125 126 127 128 129
+    ( 130)    130 131 132 133 134 135 136 137 138 139
+    ( 140)    140 141 142 143 144 145 146 147 148 149
+    ( 150)    150 151 152 153 154 155 156 157 158 159
+    ( 160)    160 161 162 163 164 165 166 167 168 169
+    ( 170)    170 171 172 173 174 175 176 177 178 179
+    ( 180)    180 181 182 183 184 185 186 187 188 189
+    ( 190)    190 191 192 193 194 195 196 197 198 199
+    ( 200)    200 201 202 203 204 205 206 207 208 209
+    ( 210)    210 211 212 213 214 215 216 217 218 219
+    ( 220)    220 221 222 223 224 225 226 227 228 229
+    ( 230)    230 231 232 233 234 235 236 237 238 239
+    ( 240)    240 241 242 243 244 245 246 247 248 249
+    ( 250)    250 251 252 253 254 255 256 257 258 259
+    ( 260)    260 261 262 263 264 265 266 267 268 269
+    ( 270)    270 271 272 273 274 275 276 277 278 279
+    ( 280)    280 281 282 283 284 285 286 287 288 289
+    ( 290)    290 291 292 293 294 295 296 297 298 299
+    ( 300)    300 301 302 303 304 305 306 307 308 309
+    ( 310)    310 311 312 313 314 315 316 317 318 319
+    ( 320)    320 321 322 323 324 325 326 327 328 329
+    ( 330)    330 331 332 333 334 335 336 337 338 339
+    ( 340)    340 341 342 343 344 345 346 347 348 349
+    ( 350)    350 351 352 353 354 355 356 357 358 359
+    ( 360)    360 361 362 363 364 365 366 367 368 369
+    ( 370)    370 371 372 373 374 375 376 377 378 379
+    ( 380)    380 381 382 383 384 385 386 387 388 389
+    ( 390)    390 391 392 393 394 395 396 397 398 399
+    ( 400)    400 401 402 403 404 405 406 407 408 409
+    ( 410)    410 411 412 413 414 415 416 417 418 419
+    ( 420)    420 421 422 423 424 425 426 427 428 429
+    ( 430)    430 431 432 433 434 435 436 437 438 439
+    ( 440)    440 441 442 443 444 445 446 447 448 449
+    ( 450)    450 451 452 453 454 455 456 457 458 459
+    ( 460)    460 461 462 463 464 465 466 467 468 469
+    ( 470)    470 471 472 473 474 475 476 477 478 479
+    ( 480)    480 481 482 483 484 485 486 487 488 489
+    ( 490)    490 491 492 493 494 495 496 497 498 499
+    ( 500)    500 501 502 503 504 505 506 507 508 509
+    ( 510)    510 511 512 513 514 515 516 517 518 519
+    ( 520)    520 521 522 523 524 525 526 527 528 529
+    ( 530)    530 531 532 533 534 535 536 537 538 539
+    ( 540)    540 541 542 543 544 545 546 547 548 549
+    ( 550)    550 551 552 553 554 555 556 557 558 559
+    ( 560)    560 561 562 563 564 565 566 567 568 569
+    ( 570)    570 571 572 573 574 575 576 577 578 579
+    ( 580)    580 581 582 583 584 585 586 587 588 589
+    ( 590)    590 591 592 593 594 595 596 597 598 599
+    ( 600)    600 601 602 603 604 605 606 607 608 609
+    ( 610)    610 611 612 613 614 615 616 617 618 619
+    ( 620)    620 621 622 623 624 625 626 627 628 629
+    ( 630)    630 631 632 633 634 635 636 637 638 639
+    ( 640)    640 641 642 643 644 645 646 647 648 649
+    ( 650)    650 651 652 653 654 655 656 657 658 659
+    ( 660)    660 661 662 663 664 665 666 667 668 669
+    ( 670)    670 671 672 673 674 675 676 677 678 679
+    ( 680)    680 681 682 683 684 685 686 687 688 689
+    ( 690)    690 691 692 693 694 695 696 697 698 699
+    ( 700)    700 701 702 703 704 705 706 707 708 709
+    ( 710)    710 711 712 713 714 715 716 717 718 719
+    ( 720)    720 721 722 723 724 725 726 727 728 729
+    ( 730)    730 731 732 733 734 735 736 737 738 739
+    ( 740)    740 741 742 743 744 745 746 747 748 749
+    ( 750)    750 751 752 753 754 755 756 757 758 759
+    ( 760)    760 761 762 763 764 765 766 767 768 769
+    ( 770)    770 771 772 773 774 775 776 777 778 779
+    ( 780)    780 781 782 783 784 785 786 787 788 789
+    ( 790)    790 791 792 793 794 795 796 797 798 799
+    ( 800)    800 801 802 803 804 805 806 807 808 809
+    ( 810)    810 811 812 813 814 815 816 817 818 819
+    ( 820)    820 821 822 823 824 825 826 827 828 829
+    ( 830)    830 831 832 833 834 835 836 837 838 839
+    ( 840)    840 841 842 843 844 845 846 847 848 849
+    ( 850)    850 851 852 853 854 855 856 857 858 859
+    ( 860)    860 861 862 863 864 865 866 867 868 869
+    ( 870)    870 871 872 873 874 875 876 877 878 879
+    ( 880)    880 881 882 883 884 885 886 887 888 889
+    ( 890)    890 891 892 893 894 895 896 897 898 899
+    ( 900)    900 901 902 903 904 905 906 907 908 909
+    ( 910)    910 911 912 913 914 915 916 917 918 919
+    ( 920)    920 921 922 923 924 925 926 927 928 929
+    ( 930)    930 931 932 933 934 935 936 937 938 939
+    ( 940)    940 941 942 943 944 945 946 947 948 949
+    ( 950)    950 951 952 953 954 955 956 957 958 959
+    ( 960)    960 961 962 963 964 965 966 967 968 969
+    ( 970)    970 971 972 973 974 975 976 977 978 979
+    ( 980)    980 981 982 983 984 985 986 987 988 989
+    ( 990)    990 991 992 993 994 995 996 997 998 999
+    (1000)    1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
+    (1010)    1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
+    (1020)    1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
+    (1030)    1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
+    (1040)    1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
+    (1050)    1050 1051 1052 1053 1054 1055 1056 1057 1058 1059
+    (1060)    1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
+    (1070)    1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
+    (1080)    1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
+    (1090)    1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
+    (1100)    1100 1101 1102 1103 1104 1105 1106 1107 1108 1109
+    (1110)    1110 1111 1112 1113 1114 1115 1116 1117 1118 1119
+    (1120)    1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
+    (1130)    1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
+    (1140)    1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
+    (1150)    1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
+    (1160)    1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
+    (1170)    1170 1171 1172 1173 1174 1175 1176 1177 1178 1179
+    (1180)    1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
+    (1190)    1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
+    (1200)    1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
+    (1210)    1210 1211 1212 1213 1214 1215 1216 1217 1218 1219
+    (1220)    1220 1221 1222 1223 1224 1225 1226 1227 1228 1229
+    (1230)    1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
+    (1240)    1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
+    (1250)    1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
+    (1260)    1260 1261 1262 1263 1264 1265 1266 1267 1268 1269
+    (1270)    1270 1271 1272 1273 1274 1275 1276 1277 1278 1279
+    (1280)    1280 1281 1282 1283 1284 1285 1286 1287 1288 1289
+    (1290)    1290 1291 1292 1293 1294 1295 1296 1297 1298 1299
+    (1300)    1300 1301 1302 1303 1304 1305 1306 1307 1308 1309
+    (1310)    1310 1311 1312 1313 1314 1315 1316 1317 1318 1319
+    (1320)    1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
+    (1330)    1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
+    (1340)    1340 1341 1342 1343 1344 1345 1346 1347 1348 1349
+    (1350)    1350 1351 1352 1353 1354 1355 1356 1357 1358 1359
+    (1360)    1360 1361 1362 1363 1364 1365 1366 1367 1368 1369
+    (1370)    1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
+    (1380)    1380 1381 1382 1383 1384 1385 1386 1387 1388 1389
+    (1390)    1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
+    (1400)    1400 1401 1402 1403 1404 1405 1406 1407 1408 1409
+    (1410)    1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
+    (1420)    1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
+    (1430)    1430 1431 1432 1433 1434 1435 1436 1437 1438 1439
+    (1440)    1440 1441 1442 1443 1444 1445 1446 1447 1448 1449
+    (1450)    1450 1451 1452 1453 1454 1455 1456 1457 1458 1459
+    (1460)    1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
+    (1470)    1470 1471 1472 1473 1474 1475 1476 1477 1478 1479
+    (1480)    1480 1481 1482 1483 1484 1485 1486 1487 1488 1489
+    (1490)    1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
+    (1500)    1500 1501 1502 1503 1504 1505 1506 1507 1508 1509
+    (1510)    1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
+    (1520)    1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
+    (1530)    1530 1531 1532 1533 1534 1535 1536 1537 1538 1539
+    (1540)    1540 1541 1542 1543 1544 1545 1546 1547 1548 1549
+    (1550)    1550 1551 1552 1553 1554 1555 1556 1557 1558 1559
+    (1560)    1560 1561 1562 1563 1564 1565 1566 1567 1568 1569
+    (1570)    1570 1571 1572 1573 1574 1575 1576 1577 1578 1579
+    (1580)    1580 1581 1582 1583 1584 1585 1586 1587 1588 1589
+    (1590)    1590 1591 1592 1593 1594 1595 1596 1597 1598 1599
+    (1600)    1600 1601 1602 1603 1604 1605 1606 1607 1608 1609
+    (1610)    1610 1611 1612 1613 1614 1615 1616 1617 1618 1619
+    (1620)    1620 1621 1622 1623 1624 1625 1626 1627 1628 1629
+    (1630)    1630 1631 1632 1633 1634 1635 1636 1637 1638 1639
+    (1640)    1640 1641 1642 1643 1644 1645 1646 1647 1648 1649
+    (1650)    1650 1651 1652 1653 1654 1655 1656 1657 1658 1659
+    (1660)    1660 1661 1662 1663 1664 1665 1666 1667 1668 1669
+    (1670)    1670 1671 1672 1673 1674 1675 1676 1677 1678 1679
+    (1680)    1680 1681 1682 1683 1684 1685 1686 1687 1688 1689
+    (1690)    1690 1691 1692 1693 1694 1695 1696 1697 1698 1699
+    (1700)    1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
+    (1710)    1710 1711 1712 1713 1714 1715 1716 1717 1718 1719
+    (1720)    1720 1721 1722 1723 1724 1725 1726 1727 1728 1729
+    (1730)    1730 1731 1732 1733 1734 1735 1736 1737 1738 1739
+    (1740)    1740 1741 1742 1743 1744 1745 1746 1747 1748 1749
+    (1750)    1750 1751 1752 1753 1754 1755 1756 1757 1758 1759
+    (1760)    1760 1761 1762 1763 1764 1765 1766 1767 1768 1769
+    (1770)    1770 1771 1772 1773 1774 1775 1776 1777 1778 1779
+    (1780)    1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
+    (1790)    1790 1791 1792 1793 1794 1795 1796 1797 1798 1799
+    (1800)    1800 1801 1802 1803 1804 1805 1806 1807 1808 1809
+    (1810)    1810 1811 1812 1813 1814 1815 1816 1817 1818 1819
+    (1820)    1820 1821 1822 1823 1824 1825 1826 1827 1828 1829
+    (1830)    1830 1831 1832 1833 1834 1835 1836 1837 1838 1839
+    (1840)    1840 1841 1842 1843 1844 1845 1846 1847 1848 1849
+    (1850)    1850 1851 1852 1853 1854 1855 1856 1857 1858 1859
+    (1860)    1860 1861 1862 1863 1864 1865 1866 1867 1868 1869
+    (1870)    1870 1871 1872 1873 1874 1875 1876 1877 1878 1879
+    (1880)    1880 1881 1882 1883 1884 1885 1886 1887 1888 1889
+    (1890)    1890 1891 1892 1893 1894 1895 1896 1897 1898 1899
+    (1900)    1900 1901 1902 1903 1904 1905 1906 1907 1908 1909
+    (1910)    1910 1911 1912 1913 1914 1915 1916 1917 1918 1919
+    (1920)    1920 1921 1922 1923 1924 1925 1926 1927 1928 1929
+    (1930)    1930 1931 1932 1933 1934 1935 1936 1937 1938 1939
+    (1940)    1940 1941 1942 1943 1944 1945 1946 1947 1948 1949
+    (1950)    1950 1951 1952 1953 1954 1955 1956 1957 1958 1959
+    (1960)    1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
+    (1970)    1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
+    (1980)    1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
+    (1990)    1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
+    (2000)    2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
+    (2010)    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
+    (2020)    2020 2021 2022 2023 2024 2025 2026 2027 2028 2029
+    (2030)    2030 2031 2032 2033 2034 2035 2036 2037 2038 2039
+    (2040)    2040 2041 2042 2043 2044 2045 2046 2047 2048 2049
+    (2050)    2050 2051 2052 2053 2054 2055 2056 2057 2058 2059
+    (2060)    2060 2061 2062 2063 2064 2065 2066 2067 2068 2069
+    (2070)    2070 2071 2072 2073 2074 2075 2076 2077 2078 2079
+    (2080)    2080 2081 2082 2083 2084 2085 2086 2087 2088 2089
+    (2090)    2090 2091 2092 2093 2094 2095 2096 2097 2098 2099
 
diff --git a/tests/suite/reference/global_array_no_xml_f_bpls.txt b/tests/suite/reference/global_array_no_xml_f_bpls.txt
index 42ce305..28e14cb 100644
--- a/tests/suite/reference/global_array_no_xml_f_bpls.txt
+++ b/tests/suite/reference/global_array_no_xml_f_bpls.txt
@@ -4,25 +4,25 @@ File info:
   of attributes: 0
   of meshes:     0
   time steps:    0 - 0
-  bp version:    2
+  bp version:    3
   statistics:    Min / Max / Avg / Std_dev
 
-  integer  NX           scalar = 10 
-  integer  G            scalar = 140 
-  integer  O            scalar = 0 
-  double   temperature  {140} = 0 / 139 / 69.5 / 40.4135 
-    (  0)    0 1 2 3 4 5 6 7 8 9 
-    ( 10)    10 11 12 13 14 15 16 17 18 19 
-    ( 20)    20 21 22 23 24 25 26 27 28 29 
-    ( 30)    30 31 32 33 34 35 36 37 38 39 
-    ( 40)    40 41 42 43 44 45 46 47 48 49 
-    ( 50)    50 51 52 53 54 55 56 57 58 59 
-    ( 60)    60 61 62 63 64 65 66 67 68 69 
-    ( 70)    70 71 72 73 74 75 76 77 78 79 
-    ( 80)    80 81 82 83 84 85 86 87 88 89 
-    ( 90)    90 91 92 93 94 95 96 97 98 99 
-    (100)    100 101 102 103 104 105 106 107 108 109 
-    (110)    110 111 112 113 114 115 116 117 118 119 
-    (120)    120 121 122 123 124 125 126 127 128 129 
-    (130)    130 131 132 133 134 135 136 137 138 139 
+  integer  NX           scalar = 10
+  integer  G            scalar = 140
+  integer  O            scalar = 0
+  double   temperature  {140} = 0 / 139 / 69.5 / 40.4135
+    (  0)    0 1 2 3 4 5 6 7 8 9
+    ( 10)    10 11 12 13 14 15 16 17 18 19
+    ( 20)    20 21 22 23 24 25 26 27 28 29
+    ( 30)    30 31 32 33 34 35 36 37 38 39
+    ( 40)    40 41 42 43 44 45 46 47 48 49
+    ( 50)    50 51 52 53 54 55 56 57 58 59
+    ( 60)    60 61 62 63 64 65 66 67 68 69
+    ( 70)    70 71 72 73 74 75 76 77 78 79
+    ( 80)    80 81 82 83 84 85 86 87 88 89
+    ( 90)    90 91 92 93 94 95 96 97 98 99
+    (100)    100 101 102 103 104 105 106 107 108 109
+    (110)    110 111 112 113 114 115 116 117 118 119
+    (120)    120 121 122 123 124 125 126 127 128 129
+    (130)    130 131 132 133 134 135 136 137 138 139
 
diff --git a/tests/suite/reference/global_array_time_bpls.txt b/tests/suite/reference/global_array_time_bpls.txt
index 753f199..5409d2c 100644
--- a/tests/suite/reference/global_array_time_bpls.txt
+++ b/tests/suite/reference/global_array_time_bpls.txt
@@ -1,7 +1,7 @@
-  integer  NX                       13*scalar = 10 / 10 / 10 / 0 
-  integer  NY                       13*scalar = 1 / 1 / 1 / 0 
-  integer  size                     13*scalar = 9 / 9 / 9 / 0 
-  integer  rank                     13*scalar = 0 / 8 / 4 / 2.58199 
-  double   temperature              13*{9, 10} = 100 / 1389 / 744.5 / 375.067 
-  double   pressure                 13*{9, 1} = 1000 / 13008 / 7004 / 3741.66 
+  integer  NX                       13*scalar = 10 / 10 / 10 / 0
+  integer  NY                       13*scalar = 1 / 1 / 1 / 0
+  integer  size                     13*scalar = 9 / 9 / 9 / 0
+  integer  rank                     13*scalar = 0 / 8 / 4 / 2.58199
+  double   temperature              13*{9, 10} = 100 / 1389 / 744.5 / 375.067
+  double   pressure                 13*{9, 1} = 1000 / 13008 / 7004 / 3741.66
   string   temperature/description  attr   = "Global array written from 'size' processes over several timesteps"
diff --git a/tests/suite/reference/global_array_time_read.txt b/tests/suite/reference/global_array_time_read_as_file.txt
similarity index 100%
rename from tests/suite/reference/global_array_time_read.txt
rename to tests/suite/reference/global_array_time_read_as_file.txt
diff --git a/tests/suite/reference/global_array_time_read_as_stream.txt b/tests/suite/reference/global_array_time_read_as_stream.txt
new file mode 100644
index 0000000..f61c385
--- /dev/null
+++ b/tests/suite/reference/global_array_time_read_as_stream.txt
@@ -0,0 +1,153 @@
+rank 0: ndim = 2
+rank 0: dims[9][10]
+rank=0: step 0: [0:9,0:10] = [ [100 101 102 103 104 105 106 107 108 109 ] ]
+rank=0: step 1: [0:9,0:10] = [ [200 201 202 203 204 205 206 207 208 209 ] ]
+rank=0: step 2: [0:9,0:10] = [ [300 301 302 303 304 305 306 307 308 309 ] ]
+rank=0: step 3: [0:9,0:10] = [ [400 401 402 403 404 405 406 407 408 409 ] ]
+rank=0: step 4: [0:9,0:10] = [ [500 501 502 503 504 505 506 507 508 509 ] ]
+rank=0: step 5: [0:9,0:10] = [ [600 601 602 603 604 605 606 607 608 609 ] ]
+rank=0: step 6: [0:9,0:10] = [ [700 701 702 703 704 705 706 707 708 709 ] ]
+rank=0: step 7: [0:9,0:10] = [ [800 801 802 803 804 805 806 807 808 809 ] ]
+rank=0: step 8: [0:9,0:10] = [ [900 901 902 903 904 905 906 907 908 909 ] ]
+rank=0: step 9: [0:9,0:10] = [ [1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 ] ]
+rank=0: step 10: [0:9,0:10] = [ [1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 ] ]
+rank=0: step 11: [0:9,0:10] = [ [1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 ] ]
+rank=0: step 12: [0:9,0:10] = [ [1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 ] ]
+rank 0: No new step arrived within the timeout. Quit. 
+rank: 0: We have processed 13 steps
+rank 1: ndim = 2
+rank 1: dims[9][10]
+rank=1: step 0: [0:9,0:10] = [ [110 111 112 113 114 115 116 117 118 119 ] ]
+rank=1: step 1: [0:9,0:10] = [ [210 211 212 213 214 215 216 217 218 219 ] ]
+rank=1: step 2: [0:9,0:10] = [ [310 311 312 313 314 315 316 317 318 319 ] ]
+rank=1: step 3: [0:9,0:10] = [ [410 411 412 413 414 415 416 417 418 419 ] ]
+rank=1: step 4: [0:9,0:10] = [ [510 511 512 513 514 515 516 517 518 519 ] ]
+rank=1: step 5: [0:9,0:10] = [ [610 611 612 613 614 615 616 617 618 619 ] ]
+rank=1: step 6: [0:9,0:10] = [ [710 711 712 713 714 715 716 717 718 719 ] ]
+rank=1: step 7: [0:9,0:10] = [ [810 811 812 813 814 815 816 817 818 819 ] ]
+rank=1: step 8: [0:9,0:10] = [ [910 911 912 913 914 915 916 917 918 919 ] ]
+rank=1: step 9: [0:9,0:10] = [ [1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 ] ]
+rank=1: step 10: [0:9,0:10] = [ [1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 ] ]
+rank=1: step 11: [0:9,0:10] = [ [1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 ] ]
+rank=1: step 12: [0:9,0:10] = [ [1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 ] ]
+rank 1: No new step arrived within the timeout. Quit. 
+rank: 1: We have processed 13 steps
+rank 2: ndim = 2
+rank 2: dims[9][10]
+rank=2: step 0: [0:9,0:10] = [ [120 121 122 123 124 125 126 127 128 129 ] ]
+rank=2: step 1: [0:9,0:10] = [ [220 221 222 223 224 225 226 227 228 229 ] ]
+rank=2: step 2: [0:9,0:10] = [ [320 321 322 323 324 325 326 327 328 329 ] ]
+rank=2: step 3: [0:9,0:10] = [ [420 421 422 423 424 425 426 427 428 429 ] ]
+rank=2: step 4: [0:9,0:10] = [ [520 521 522 523 524 525 526 527 528 529 ] ]
+rank=2: step 5: [0:9,0:10] = [ [620 621 622 623 624 625 626 627 628 629 ] ]
+rank=2: step 6: [0:9,0:10] = [ [720 721 722 723 724 725 726 727 728 729 ] ]
+rank=2: step 7: [0:9,0:10] = [ [820 821 822 823 824 825 826 827 828 829 ] ]
+rank=2: step 8: [0:9,0:10] = [ [920 921 922 923 924 925 926 927 928 929 ] ]
+rank=2: step 9: [0:9,0:10] = [ [1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 ] ]
+rank=2: step 10: [0:9,0:10] = [ [1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 ] ]
+rank=2: step 11: [0:9,0:10] = [ [1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 ] ]
+rank=2: step 12: [0:9,0:10] = [ [1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 ] ]
+rank 2: No new step arrived within the timeout. Quit. 
+rank: 2: We have processed 13 steps
+rank 3: ndim = 2
+rank 3: dims[9][10]
+rank=3: step 0: [0:9,0:10] = [ [130 131 132 133 134 135 136 137 138 139 ] ]
+rank=3: step 1: [0:9,0:10] = [ [230 231 232 233 234 235 236 237 238 239 ] ]
+rank=3: step 2: [0:9,0:10] = [ [330 331 332 333 334 335 336 337 338 339 ] ]
+rank=3: step 3: [0:9,0:10] = [ [430 431 432 433 434 435 436 437 438 439 ] ]
+rank=3: step 4: [0:9,0:10] = [ [530 531 532 533 534 535 536 537 538 539 ] ]
+rank=3: step 5: [0:9,0:10] = [ [630 631 632 633 634 635 636 637 638 639 ] ]
+rank=3: step 6: [0:9,0:10] = [ [730 731 732 733 734 735 736 737 738 739 ] ]
+rank=3: step 7: [0:9,0:10] = [ [830 831 832 833 834 835 836 837 838 839 ] ]
+rank=3: step 8: [0:9,0:10] = [ [930 931 932 933 934 935 936 937 938 939 ] ]
+rank=3: step 9: [0:9,0:10] = [ [1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 ] ]
+rank=3: step 10: [0:9,0:10] = [ [1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 ] ]
+rank=3: step 11: [0:9,0:10] = [ [1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 ] ]
+rank=3: step 12: [0:9,0:10] = [ [1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 ] ]
+rank 3: No new step arrived within the timeout. Quit. 
+rank: 3: We have processed 13 steps
+rank 4: ndim = 2
+rank 4: dims[9][10]
+rank=4: step 0: [0:9,0:10] = [ [140 141 142 143 144 145 146 147 148 149 ] ]
+rank=4: step 1: [0:9,0:10] = [ [240 241 242 243 244 245 246 247 248 249 ] ]
+rank=4: step 2: [0:9,0:10] = [ [340 341 342 343 344 345 346 347 348 349 ] ]
+rank=4: step 3: [0:9,0:10] = [ [440 441 442 443 444 445 446 447 448 449 ] ]
+rank=4: step 4: [0:9,0:10] = [ [540 541 542 543 544 545 546 547 548 549 ] ]
+rank=4: step 5: [0:9,0:10] = [ [640 641 642 643 644 645 646 647 648 649 ] ]
+rank=4: step 6: [0:9,0:10] = [ [740 741 742 743 744 745 746 747 748 749 ] ]
+rank=4: step 7: [0:9,0:10] = [ [840 841 842 843 844 845 846 847 848 849 ] ]
+rank=4: step 8: [0:9,0:10] = [ [940 941 942 943 944 945 946 947 948 949 ] ]
+rank=4: step 9: [0:9,0:10] = [ [1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 ] ]
+rank=4: step 10: [0:9,0:10] = [ [1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 ] ]
+rank=4: step 11: [0:9,0:10] = [ [1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 ] ]
+rank=4: step 12: [0:9,0:10] = [ [1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 ] ]
+rank 4: No new step arrived within the timeout. Quit. 
+rank: 4: We have processed 13 steps
+rank 5: ndim = 2
+rank 5: dims[9][10]
+rank=5: step 0: [0:9,0:10] = [ [150 151 152 153 154 155 156 157 158 159 ] ]
+rank=5: step 1: [0:9,0:10] = [ [250 251 252 253 254 255 256 257 258 259 ] ]
+rank=5: step 2: [0:9,0:10] = [ [350 351 352 353 354 355 356 357 358 359 ] ]
+rank=5: step 3: [0:9,0:10] = [ [450 451 452 453 454 455 456 457 458 459 ] ]
+rank=5: step 4: [0:9,0:10] = [ [550 551 552 553 554 555 556 557 558 559 ] ]
+rank=5: step 5: [0:9,0:10] = [ [650 651 652 653 654 655 656 657 658 659 ] ]
+rank=5: step 6: [0:9,0:10] = [ [750 751 752 753 754 755 756 757 758 759 ] ]
+rank=5: step 7: [0:9,0:10] = [ [850 851 852 853 854 855 856 857 858 859 ] ]
+rank=5: step 8: [0:9,0:10] = [ [950 951 952 953 954 955 956 957 958 959 ] ]
+rank=5: step 9: [0:9,0:10] = [ [1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 ] ]
+rank=5: step 10: [0:9,0:10] = [ [1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 ] ]
+rank=5: step 11: [0:9,0:10] = [ [1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 ] ]
+rank=5: step 12: [0:9,0:10] = [ [1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 ] ]
+rank 5: No new step arrived within the timeout. Quit. 
+rank: 5: We have processed 13 steps
+rank 6: ndim = 2
+rank 6: dims[9][10]
+rank=6: step 0: [0:9,0:10] = [ [160 161 162 163 164 165 166 167 168 169 ] ]
+rank=6: step 1: [0:9,0:10] = [ [260 261 262 263 264 265 266 267 268 269 ] ]
+rank=6: step 2: [0:9,0:10] = [ [360 361 362 363 364 365 366 367 368 369 ] ]
+rank=6: step 3: [0:9,0:10] = [ [460 461 462 463 464 465 466 467 468 469 ] ]
+rank=6: step 4: [0:9,0:10] = [ [560 561 562 563 564 565 566 567 568 569 ] ]
+rank=6: step 5: [0:9,0:10] = [ [660 661 662 663 664 665 666 667 668 669 ] ]
+rank=6: step 6: [0:9,0:10] = [ [760 761 762 763 764 765 766 767 768 769 ] ]
+rank=6: step 7: [0:9,0:10] = [ [860 861 862 863 864 865 866 867 868 869 ] ]
+rank=6: step 8: [0:9,0:10] = [ [960 961 962 963 964 965 966 967 968 969 ] ]
+rank=6: step 9: [0:9,0:10] = [ [1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 ] ]
+rank=6: step 10: [0:9,0:10] = [ [1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 ] ]
+rank=6: step 11: [0:9,0:10] = [ [1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 ] ]
+rank=6: step 12: [0:9,0:10] = [ [1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 ] ]
+rank 6: No new step arrived within the timeout. Quit. 
+rank: 6: We have processed 13 steps
+rank 7: ndim = 2
+rank 7: dims[9][10]
+rank=7: step 0: [0:9,0:10] = [ [170 171 172 173 174 175 176 177 178 179 ] ]
+rank=7: step 1: [0:9,0:10] = [ [270 271 272 273 274 275 276 277 278 279 ] ]
+rank=7: step 2: [0:9,0:10] = [ [370 371 372 373 374 375 376 377 378 379 ] ]
+rank=7: step 3: [0:9,0:10] = [ [470 471 472 473 474 475 476 477 478 479 ] ]
+rank=7: step 4: [0:9,0:10] = [ [570 571 572 573 574 575 576 577 578 579 ] ]
+rank=7: step 5: [0:9,0:10] = [ [670 671 672 673 674 675 676 677 678 679 ] ]
+rank=7: step 6: [0:9,0:10] = [ [770 771 772 773 774 775 776 777 778 779 ] ]
+rank=7: step 7: [0:9,0:10] = [ [870 871 872 873 874 875 876 877 878 879 ] ]
+rank=7: step 8: [0:9,0:10] = [ [970 971 972 973 974 975 976 977 978 979 ] ]
+rank=7: step 9: [0:9,0:10] = [ [1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 ] ]
+rank=7: step 10: [0:9,0:10] = [ [1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 ] ]
+rank=7: step 11: [0:9,0:10] = [ [1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 ] ]
+rank=7: step 12: [0:9,0:10] = [ [1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 ] ]
+rank 7: No new step arrived within the timeout. Quit. 
+rank: 7: We have processed 13 steps
+rank 8: ndim = 2
+rank 8: dims[9][10]
+rank=8: step 0: [0:9,0:10] = [ [180 181 182 183 184 185 186 187 188 189 ] ]
+rank=8: step 1: [0:9,0:10] = [ [280 281 282 283 284 285 286 287 288 289 ] ]
+rank=8: step 2: [0:9,0:10] = [ [380 381 382 383 384 385 386 387 388 389 ] ]
+rank=8: step 3: [0:9,0:10] = [ [480 481 482 483 484 485 486 487 488 489 ] ]
+rank=8: step 4: [0:9,0:10] = [ [580 581 582 583 584 585 586 587 588 589 ] ]
+rank=8: step 5: [0:9,0:10] = [ [680 681 682 683 684 685 686 687 688 689 ] ]
+rank=8: step 6: [0:9,0:10] = [ [780 781 782 783 784 785 786 787 788 789 ] ]
+rank=8: step 7: [0:9,0:10] = [ [880 881 882 883 884 885 886 887 888 889 ] ]
+rank=8: step 8: [0:9,0:10] = [ [980 981 982 983 984 985 986 987 988 989 ] ]
+rank=8: step 9: [0:9,0:10] = [ [1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 ] ]
+rank=8: step 10: [0:9,0:10] = [ [1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 ] ]
+rank=8: step 11: [0:9,0:10] = [ [1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 ] ]
+rank=8: step 12: [0:9,0:10] = [ [1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 ] ]
+rank 8: No new step arrived within the timeout. Quit. 
+rank: 8: We have processed 13 steps
diff --git a/tests/suite/reference/arrays_bpls.txt b/tests/suite/reference/local_array_C_bpls.txt
similarity index 54%
rename from tests/suite/reference/arrays_bpls.txt
rename to tests/suite/reference/local_array_C_bpls.txt
index 60c2d37..8057cf9 100644
--- a/tests/suite/reference/arrays_bpls.txt
+++ b/tests/suite/reference/local_array_C_bpls.txt
@@ -4,10 +4,10 @@ File info:
   of attributes: 0
   of meshes:     0
   time steps:    0 - 0
-  bp version:    2
+  bp version:    3
   statistics:    Min / Max / Avg / Std_dev
 
-  integer  NX                  scalar = 10 
-  integer  NY                  scalar = 100 
-  double   var_double_2Darray  {10, 100} = 0 / 49.99 / 24.995 / 14.4338 
-  integer  var_int_1Darray     {10} = 0 / 49 / 24.5 / 14.4309 
+  integer  NX                  scalar = 10
+  integer  NY                  scalar = 100
+  double   var_double_2Darray  {10, 100} = 0 / 49.99 / 24.995 / 14.4338
+  integer  var_int_1Darray     {10} = 0 / 49 / 24.5 / 14.4309
diff --git a/tests/suite/reference/arrays_read.txt b/tests/suite/reference/local_array_C_read.txt
similarity index 100%
rename from tests/suite/reference/arrays_read.txt
rename to tests/suite/reference/local_array_C_read.txt
diff --git a/tests/suite/reference/no_xml_write_byid_bpls.txt b/tests/suite/reference/no_xml_write_byid_bpls.txt
index ea80c26..ebd3f35 100644
--- a/tests/suite/reference/no_xml_write_byid_bpls.txt
+++ b/tests/suite/reference/no_xml_write_byid_bpls.txt
@@ -1,221 +1,227 @@
 File info:
   of groups:     1
   of variables:  1
-  of attributes: 0
+  of attributes: 6
   of meshes:     0
   time steps:    0 - 0
-  bp version:    2
+  bp version:    3
   statistics:    Min / Max / Avg / Std_dev
 
-  double   temperature  {2100} = 0 / 2099 / 1049.5 / 606.218 
-    (   0)    0 1 2 3 4 5 6 7 8 9 
-    (  10)    10 11 12 13 14 15 16 17 18 19 
-    (  20)    20 21 22 23 24 25 26 27 28 29 
-    (  30)    30 31 32 33 34 35 36 37 38 39 
-    (  40)    40 41 42 43 44 45 46 47 48 49 
-    (  50)    50 51 52 53 54 55 56 57 58 59 
-    (  60)    60 61 62 63 64 65 66 67 68 69 
-    (  70)    70 71 72 73 74 75 76 77 78 79 
-    (  80)    80 81 82 83 84 85 86 87 88 89 
-    (  90)    90 91 92 93 94 95 96 97 98 99 
-    ( 100)    100 101 102 103 104 105 106 107 108 109 
-    ( 110)    110 111 112 113 114 115 116 117 118 119 
-    ( 120)    120 121 122 123 124 125 126 127 128 129 
-    ( 130)    130 131 132 133 134 135 136 137 138 139 
-    ( 140)    140 141 142 143 144 145 146 147 148 149 
-    ( 150)    150 151 152 153 154 155 156 157 158 159 
-    ( 160)    160 161 162 163 164 165 166 167 168 169 
-    ( 170)    170 171 172 173 174 175 176 177 178 179 
-    ( 180)    180 181 182 183 184 185 186 187 188 189 
-    ( 190)    190 191 192 193 194 195 196 197 198 199 
-    ( 200)    200 201 202 203 204 205 206 207 208 209 
-    ( 210)    210 211 212 213 214 215 216 217 218 219 
-    ( 220)    220 221 222 223 224 225 226 227 228 229 
-    ( 230)    230 231 232 233 234 235 236 237 238 239 
-    ( 240)    240 241 242 243 244 245 246 247 248 249 
-    ( 250)    250 251 252 253 254 255 256 257 258 259 
-    ( 260)    260 261 262 263 264 265 266 267 268 269 
-    ( 270)    270 271 272 273 274 275 276 277 278 279 
-    ( 280)    280 281 282 283 284 285 286 287 288 289 
-    ( 290)    290 291 292 293 294 295 296 297 298 299 
-    ( 300)    300 301 302 303 304 305 306 307 308 309 
-    ( 310)    310 311 312 313 314 315 316 317 318 319 
-    ( 320)    320 321 322 323 324 325 326 327 328 329 
-    ( 330)    330 331 332 333 334 335 336 337 338 339 
-    ( 340)    340 341 342 343 344 345 346 347 348 349 
-    ( 350)    350 351 352 353 354 355 356 357 358 359 
-    ( 360)    360 361 362 363 364 365 366 367 368 369 
-    ( 370)    370 371 372 373 374 375 376 377 378 379 
-    ( 380)    380 381 382 383 384 385 386 387 388 389 
-    ( 390)    390 391 392 393 394 395 396 397 398 399 
-    ( 400)    400 401 402 403 404 405 406 407 408 409 
-    ( 410)    410 411 412 413 414 415 416 417 418 419 
-    ( 420)    420 421 422 423 424 425 426 427 428 429 
-    ( 430)    430 431 432 433 434 435 436 437 438 439 
-    ( 440)    440 441 442 443 444 445 446 447 448 449 
-    ( 450)    450 451 452 453 454 455 456 457 458 459 
-    ( 460)    460 461 462 463 464 465 466 467 468 469 
-    ( 470)    470 471 472 473 474 475 476 477 478 479 
-    ( 480)    480 481 482 483 484 485 486 487 488 489 
-    ( 490)    490 491 492 493 494 495 496 497 498 499 
-    ( 500)    500 501 502 503 504 505 506 507 508 509 
-    ( 510)    510 511 512 513 514 515 516 517 518 519 
-    ( 520)    520 521 522 523 524 525 526 527 528 529 
-    ( 530)    530 531 532 533 534 535 536 537 538 539 
-    ( 540)    540 541 542 543 544 545 546 547 548 549 
-    ( 550)    550 551 552 553 554 555 556 557 558 559 
-    ( 560)    560 561 562 563 564 565 566 567 568 569 
-    ( 570)    570 571 572 573 574 575 576 577 578 579 
-    ( 580)    580 581 582 583 584 585 586 587 588 589 
-    ( 590)    590 591 592 593 594 595 596 597 598 599 
-    ( 600)    600 601 602 603 604 605 606 607 608 609 
-    ( 610)    610 611 612 613 614 615 616 617 618 619 
-    ( 620)    620 621 622 623 624 625 626 627 628 629 
-    ( 630)    630 631 632 633 634 635 636 637 638 639 
-    ( 640)    640 641 642 643 644 645 646 647 648 649 
-    ( 650)    650 651 652 653 654 655 656 657 658 659 
-    ( 660)    660 661 662 663 664 665 666 667 668 669 
-    ( 670)    670 671 672 673 674 675 676 677 678 679 
-    ( 680)    680 681 682 683 684 685 686 687 688 689 
-    ( 690)    690 691 692 693 694 695 696 697 698 699 
-    ( 700)    700 701 702 703 704 705 706 707 708 709 
-    ( 710)    710 711 712 713 714 715 716 717 718 719 
-    ( 720)    720 721 722 723 724 725 726 727 728 729 
-    ( 730)    730 731 732 733 734 735 736 737 738 739 
-    ( 740)    740 741 742 743 744 745 746 747 748 749 
-    ( 750)    750 751 752 753 754 755 756 757 758 759 
-    ( 760)    760 761 762 763 764 765 766 767 768 769 
-    ( 770)    770 771 772 773 774 775 776 777 778 779 
-    ( 780)    780 781 782 783 784 785 786 787 788 789 
-    ( 790)    790 791 792 793 794 795 796 797 798 799 
-    ( 800)    800 801 802 803 804 805 806 807 808 809 
-    ( 810)    810 811 812 813 814 815 816 817 818 819 
-    ( 820)    820 821 822 823 824 825 826 827 828 829 
-    ( 830)    830 831 832 833 834 835 836 837 838 839 
-    ( 840)    840 841 842 843 844 845 846 847 848 849 
-    ( 850)    850 851 852 853 854 855 856 857 858 859 
-    ( 860)    860 861 862 863 864 865 866 867 868 869 
-    ( 870)    870 871 872 873 874 875 876 877 878 879 
-    ( 880)    880 881 882 883 884 885 886 887 888 889 
-    ( 890)    890 891 892 893 894 895 896 897 898 899 
-    ( 900)    900 901 902 903 904 905 906 907 908 909 
-    ( 910)    910 911 912 913 914 915 916 917 918 919 
-    ( 920)    920 921 922 923 924 925 926 927 928 929 
-    ( 930)    930 931 932 933 934 935 936 937 938 939 
-    ( 940)    940 941 942 943 944 945 946 947 948 949 
-    ( 950)    950 951 952 953 954 955 956 957 958 959 
-    ( 960)    960 961 962 963 964 965 966 967 968 969 
-    ( 970)    970 971 972 973 974 975 976 977 978 979 
-    ( 980)    980 981 982 983 984 985 986 987 988 989 
-    ( 990)    990 991 992 993 994 995 996 997 998 999 
-    (1000)    1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 
-    (1010)    1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 
-    (1020)    1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 
-    (1030)    1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 
-    (1040)    1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 
-    (1050)    1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 
-    (1060)    1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 
-    (1070)    1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 
-    (1080)    1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 
-    (1090)    1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 
-    (1100)    1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 
-    (1110)    1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 
-    (1120)    1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 
-    (1130)    1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 
-    (1140)    1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 
-    (1150)    1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 
-    (1160)    1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 
-    (1170)    1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 
-    (1180)    1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 
-    (1190)    1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 
-    (1200)    1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 
-    (1210)    1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 
-    (1220)    1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 
-    (1230)    1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 
-    (1240)    1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 
-    (1250)    1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 
-    (1260)    1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 
-    (1270)    1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 
-    (1280)    1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 
-    (1290)    1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 
-    (1300)    1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 
-    (1310)    1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 
-    (1320)    1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 
-    (1330)    1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 
-    (1340)    1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 
-    (1350)    1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 
-    (1360)    1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 
-    (1370)    1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 
-    (1380)    1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 
-    (1390)    1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 
-    (1400)    1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 
-    (1410)    1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 
-    (1420)    1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 
-    (1430)    1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 
-    (1440)    1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 
-    (1450)    1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 
-    (1460)    1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 
-    (1470)    1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 
-    (1480)    1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 
-    (1490)    1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 
-    (1500)    1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 
-    (1510)    1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 
-    (1520)    1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 
-    (1530)    1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 
-    (1540)    1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 
-    (1550)    1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 
-    (1560)    1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 
-    (1570)    1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 
-    (1580)    1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 
-    (1590)    1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 
-    (1600)    1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 
-    (1610)    1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 
-    (1620)    1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 
-    (1630)    1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 
-    (1640)    1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 
-    (1650)    1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 
-    (1660)    1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 
-    (1670)    1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 
-    (1680)    1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 
-    (1690)    1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 
-    (1700)    1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 
-    (1710)    1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 
-    (1720)    1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 
-    (1730)    1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 
-    (1740)    1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 
-    (1750)    1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 
-    (1760)    1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 
-    (1770)    1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 
-    (1780)    1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 
-    (1790)    1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 
-    (1800)    1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 
-    (1810)    1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 
-    (1820)    1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 
-    (1830)    1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 
-    (1840)    1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 
-    (1850)    1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 
-    (1860)    1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 
-    (1870)    1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 
-    (1880)    1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 
-    (1890)    1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 
-    (1900)    1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 
-    (1910)    1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 
-    (1920)    1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 
-    (1930)    1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 
-    (1940)    1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 
-    (1950)    1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 
-    (1960)    1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 
-    (1970)    1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 
-    (1980)    1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 
-    (1990)    1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 
-    (2000)    2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 
-    (2010)    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 
-    (2020)    2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 
-    (2030)    2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 
-    (2040)    2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 
-    (2050)    2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 
-    (2060)    2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 
-    (2070)    2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 
-    (2080)    2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 
-    (2090)    2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 
+  double   temperature    {2100} = 0 / 2099 / 1049.5 / 606.218
+    (   0)    0 1 2 3 4 5 6 7 8 9
+    (  10)    10 11 12 13 14 15 16 17 18 19
+    (  20)    20 21 22 23 24 25 26 27 28 29
+    (  30)    30 31 32 33 34 35 36 37 38 39
+    (  40)    40 41 42 43 44 45 46 47 48 49
+    (  50)    50 51 52 53 54 55 56 57 58 59
+    (  60)    60 61 62 63 64 65 66 67 68 69
+    (  70)    70 71 72 73 74 75 76 77 78 79
+    (  80)    80 81 82 83 84 85 86 87 88 89
+    (  90)    90 91 92 93 94 95 96 97 98 99
+    ( 100)    100 101 102 103 104 105 106 107 108 109
+    ( 110)    110 111 112 113 114 115 116 117 118 119
+    ( 120)    120 121 122 123 124 125 126 127 128 129
+    ( 130)    130 131 132 133 134 135 136 137 138 139
+    ( 140)    140 141 142 143 144 145 146 147 148 149
+    ( 150)    150 151 152 153 154 155 156 157 158 159
+    ( 160)    160 161 162 163 164 165 166 167 168 169
+    ( 170)    170 171 172 173 174 175 176 177 178 179
+    ( 180)    180 181 182 183 184 185 186 187 188 189
+    ( 190)    190 191 192 193 194 195 196 197 198 199
+    ( 200)    200 201 202 203 204 205 206 207 208 209
+    ( 210)    210 211 212 213 214 215 216 217 218 219
+    ( 220)    220 221 222 223 224 225 226 227 228 229
+    ( 230)    230 231 232 233 234 235 236 237 238 239
+    ( 240)    240 241 242 243 244 245 246 247 248 249
+    ( 250)    250 251 252 253 254 255 256 257 258 259
+    ( 260)    260 261 262 263 264 265 266 267 268 269
+    ( 270)    270 271 272 273 274 275 276 277 278 279
+    ( 280)    280 281 282 283 284 285 286 287 288 289
+    ( 290)    290 291 292 293 294 295 296 297 298 299
+    ( 300)    300 301 302 303 304 305 306 307 308 309
+    ( 310)    310 311 312 313 314 315 316 317 318 319
+    ( 320)    320 321 322 323 324 325 326 327 328 329
+    ( 330)    330 331 332 333 334 335 336 337 338 339
+    ( 340)    340 341 342 343 344 345 346 347 348 349
+    ( 350)    350 351 352 353 354 355 356 357 358 359
+    ( 360)    360 361 362 363 364 365 366 367 368 369
+    ( 370)    370 371 372 373 374 375 376 377 378 379
+    ( 380)    380 381 382 383 384 385 386 387 388 389
+    ( 390)    390 391 392 393 394 395 396 397 398 399
+    ( 400)    400 401 402 403 404 405 406 407 408 409
+    ( 410)    410 411 412 413 414 415 416 417 418 419
+    ( 420)    420 421 422 423 424 425 426 427 428 429
+    ( 430)    430 431 432 433 434 435 436 437 438 439
+    ( 440)    440 441 442 443 444 445 446 447 448 449
+    ( 450)    450 451 452 453 454 455 456 457 458 459
+    ( 460)    460 461 462 463 464 465 466 467 468 469
+    ( 470)    470 471 472 473 474 475 476 477 478 479
+    ( 480)    480 481 482 483 484 485 486 487 488 489
+    ( 490)    490 491 492 493 494 495 496 497 498 499
+    ( 500)    500 501 502 503 504 505 506 507 508 509
+    ( 510)    510 511 512 513 514 515 516 517 518 519
+    ( 520)    520 521 522 523 524 525 526 527 528 529
+    ( 530)    530 531 532 533 534 535 536 537 538 539
+    ( 540)    540 541 542 543 544 545 546 547 548 549
+    ( 550)    550 551 552 553 554 555 556 557 558 559
+    ( 560)    560 561 562 563 564 565 566 567 568 569
+    ( 570)    570 571 572 573 574 575 576 577 578 579
+    ( 580)    580 581 582 583 584 585 586 587 588 589
+    ( 590)    590 591 592 593 594 595 596 597 598 599
+    ( 600)    600 601 602 603 604 605 606 607 608 609
+    ( 610)    610 611 612 613 614 615 616 617 618 619
+    ( 620)    620 621 622 623 624 625 626 627 628 629
+    ( 630)    630 631 632 633 634 635 636 637 638 639
+    ( 640)    640 641 642 643 644 645 646 647 648 649
+    ( 650)    650 651 652 653 654 655 656 657 658 659
+    ( 660)    660 661 662 663 664 665 666 667 668 669
+    ( 670)    670 671 672 673 674 675 676 677 678 679
+    ( 680)    680 681 682 683 684 685 686 687 688 689
+    ( 690)    690 691 692 693 694 695 696 697 698 699
+    ( 700)    700 701 702 703 704 705 706 707 708 709
+    ( 710)    710 711 712 713 714 715 716 717 718 719
+    ( 720)    720 721 722 723 724 725 726 727 728 729
+    ( 730)    730 731 732 733 734 735 736 737 738 739
+    ( 740)    740 741 742 743 744 745 746 747 748 749
+    ( 750)    750 751 752 753 754 755 756 757 758 759
+    ( 760)    760 761 762 763 764 765 766 767 768 769
+    ( 770)    770 771 772 773 774 775 776 777 778 779
+    ( 780)    780 781 782 783 784 785 786 787 788 789
+    ( 790)    790 791 792 793 794 795 796 797 798 799
+    ( 800)    800 801 802 803 804 805 806 807 808 809
+    ( 810)    810 811 812 813 814 815 816 817 818 819
+    ( 820)    820 821 822 823 824 825 826 827 828 829
+    ( 830)    830 831 832 833 834 835 836 837 838 839
+    ( 840)    840 841 842 843 844 845 846 847 848 849
+    ( 850)    850 851 852 853 854 855 856 857 858 859
+    ( 860)    860 861 862 863 864 865 866 867 868 869
+    ( 870)    870 871 872 873 874 875 876 877 878 879
+    ( 880)    880 881 882 883 884 885 886 887 888 889
+    ( 890)    890 891 892 893 894 895 896 897 898 899
+    ( 900)    900 901 902 903 904 905 906 907 908 909
+    ( 910)    910 911 912 913 914 915 916 917 918 919
+    ( 920)    920 921 922 923 924 925 926 927 928 929
+    ( 930)    930 931 932 933 934 935 936 937 938 939
+    ( 940)    940 941 942 943 944 945 946 947 948 949
+    ( 950)    950 951 952 953 954 955 956 957 958 959
+    ( 960)    960 961 962 963 964 965 966 967 968 969
+    ( 970)    970 971 972 973 974 975 976 977 978 979
+    ( 980)    980 981 982 983 984 985 986 987 988 989
+    ( 990)    990 991 992 993 994 995 996 997 998 999
+    (1000)    1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
+    (1010)    1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
+    (1020)    1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
+    (1030)    1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
+    (1040)    1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
+    (1050)    1050 1051 1052 1053 1054 1055 1056 1057 1058 1059
+    (1060)    1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
+    (1070)    1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
+    (1080)    1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
+    (1090)    1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
+    (1100)    1100 1101 1102 1103 1104 1105 1106 1107 1108 1109
+    (1110)    1110 1111 1112 1113 1114 1115 1116 1117 1118 1119
+    (1120)    1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
+    (1130)    1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
+    (1140)    1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
+    (1150)    1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
+    (1160)    1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
+    (1170)    1170 1171 1172 1173 1174 1175 1176 1177 1178 1179
+    (1180)    1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
+    (1190)    1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
+    (1200)    1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
+    (1210)    1210 1211 1212 1213 1214 1215 1216 1217 1218 1219
+    (1220)    1220 1221 1222 1223 1224 1225 1226 1227 1228 1229
+    (1230)    1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
+    (1240)    1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
+    (1250)    1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
+    (1260)    1260 1261 1262 1263 1264 1265 1266 1267 1268 1269
+    (1270)    1270 1271 1272 1273 1274 1275 1276 1277 1278 1279
+    (1280)    1280 1281 1282 1283 1284 1285 1286 1287 1288 1289
+    (1290)    1290 1291 1292 1293 1294 1295 1296 1297 1298 1299
+    (1300)    1300 1301 1302 1303 1304 1305 1306 1307 1308 1309
+    (1310)    1310 1311 1312 1313 1314 1315 1316 1317 1318 1319
+    (1320)    1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
+    (1330)    1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
+    (1340)    1340 1341 1342 1343 1344 1345 1346 1347 1348 1349
+    (1350)    1350 1351 1352 1353 1354 1355 1356 1357 1358 1359
+    (1360)    1360 1361 1362 1363 1364 1365 1366 1367 1368 1369
+    (1370)    1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
+    (1380)    1380 1381 1382 1383 1384 1385 1386 1387 1388 1389
+    (1390)    1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
+    (1400)    1400 1401 1402 1403 1404 1405 1406 1407 1408 1409
+    (1410)    1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
+    (1420)    1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
+    (1430)    1430 1431 1432 1433 1434 1435 1436 1437 1438 1439
+    (1440)    1440 1441 1442 1443 1444 1445 1446 1447 1448 1449
+    (1450)    1450 1451 1452 1453 1454 1455 1456 1457 1458 1459
+    (1460)    1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
+    (1470)    1470 1471 1472 1473 1474 1475 1476 1477 1478 1479
+    (1480)    1480 1481 1482 1483 1484 1485 1486 1487 1488 1489
+    (1490)    1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
+    (1500)    1500 1501 1502 1503 1504 1505 1506 1507 1508 1509
+    (1510)    1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
+    (1520)    1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
+    (1530)    1530 1531 1532 1533 1534 1535 1536 1537 1538 1539
+    (1540)    1540 1541 1542 1543 1544 1545 1546 1547 1548 1549
+    (1550)    1550 1551 1552 1553 1554 1555 1556 1557 1558 1559
+    (1560)    1560 1561 1562 1563 1564 1565 1566 1567 1568 1569
+    (1570)    1570 1571 1572 1573 1574 1575 1576 1577 1578 1579
+    (1580)    1580 1581 1582 1583 1584 1585 1586 1587 1588 1589
+    (1590)    1590 1591 1592 1593 1594 1595 1596 1597 1598 1599
+    (1600)    1600 1601 1602 1603 1604 1605 1606 1607 1608 1609
+    (1610)    1610 1611 1612 1613 1614 1615 1616 1617 1618 1619
+    (1620)    1620 1621 1622 1623 1624 1625 1626 1627 1628 1629
+    (1630)    1630 1631 1632 1633 1634 1635 1636 1637 1638 1639
+    (1640)    1640 1641 1642 1643 1644 1645 1646 1647 1648 1649
+    (1650)    1650 1651 1652 1653 1654 1655 1656 1657 1658 1659
+    (1660)    1660 1661 1662 1663 1664 1665 1666 1667 1668 1669
+    (1670)    1670 1671 1672 1673 1674 1675 1676 1677 1678 1679
+    (1680)    1680 1681 1682 1683 1684 1685 1686 1687 1688 1689
+    (1690)    1690 1691 1692 1693 1694 1695 1696 1697 1698 1699
+    (1700)    1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
+    (1710)    1710 1711 1712 1713 1714 1715 1716 1717 1718 1719
+    (1720)    1720 1721 1722 1723 1724 1725 1726 1727 1728 1729
+    (1730)    1730 1731 1732 1733 1734 1735 1736 1737 1738 1739
+    (1740)    1740 1741 1742 1743 1744 1745 1746 1747 1748 1749
+    (1750)    1750 1751 1752 1753 1754 1755 1756 1757 1758 1759
+    (1760)    1760 1761 1762 1763 1764 1765 1766 1767 1768 1769
+    (1770)    1770 1771 1772 1773 1774 1775 1776 1777 1778 1779
+    (1780)    1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
+    (1790)    1790 1791 1792 1793 1794 1795 1796 1797 1798 1799
+    (1800)    1800 1801 1802 1803 1804 1805 1806 1807 1808 1809
+    (1810)    1810 1811 1812 1813 1814 1815 1816 1817 1818 1819
+    (1820)    1820 1821 1822 1823 1824 1825 1826 1827 1828 1829
+    (1830)    1830 1831 1832 1833 1834 1835 1836 1837 1838 1839
+    (1840)    1840 1841 1842 1843 1844 1845 1846 1847 1848 1849
+    (1850)    1850 1851 1852 1853 1854 1855 1856 1857 1858 1859
+    (1860)    1860 1861 1862 1863 1864 1865 1866 1867 1868 1869
+    (1870)    1870 1871 1872 1873 1874 1875 1876 1877 1878 1879
+    (1880)    1880 1881 1882 1883 1884 1885 1886 1887 1888 1889
+    (1890)    1890 1891 1892 1893 1894 1895 1896 1897 1898 1899
+    (1900)    1900 1901 1902 1903 1904 1905 1906 1907 1908 1909
+    (1910)    1910 1911 1912 1913 1914 1915 1916 1917 1918 1919
+    (1920)    1920 1921 1922 1923 1924 1925 1926 1927 1928 1929
+    (1930)    1930 1931 1932 1933 1934 1935 1936 1937 1938 1939
+    (1940)    1940 1941 1942 1943 1944 1945 1946 1947 1948 1949
+    (1950)    1950 1951 1952 1953 1954 1955 1956 1957 1958 1959
+    (1960)    1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
+    (1970)    1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
+    (1980)    1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
+    (1990)    1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
+    (2000)    2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
+    (2010)    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
+    (2020)    2020 2021 2022 2023 2024 2025 2026 2027 2028 2029
+    (2030)    2030 2031 2032 2033 2034 2035 2036 2037 2038 2039
+    (2040)    2040 2041 2042 2043 2044 2045 2046 2047 2048 2049
+    (2050)    2050 2051 2052 2053 2054 2055 2056 2057 2058 2059
+    (2060)    2060 2061 2062 2063 2064 2065 2066 2067 2068 2069
+    (2070)    2070 2071 2072 2073 2074 2075 2076 2077 2078 2079
+    (2080)    2080 2081 2082 2083 2084 2085 2086 2087 2088 2089
+    (2090)    2090 2091 2092 2093 2094 2095 2096 2097 2098 2099
 
+  string   single_string  attr   = "A single string attribute"
+  char*[]  three_strings  attr   = {"X", "Yy", "ZzZ"}
+  integer  single_int     attr   = 5
+  double   single_double  attr   = 5.55555
+  integer  five_ints      attr   = {5, 4, 3, 2, 1}
+  double   five_double    attr   = {5.55555, 4.4444, 3.333, 2.22, 1.1}
diff --git a/tests/suite/reference/no_xml_write_byid_f_bpls.txt b/tests/suite/reference/no_xml_write_byid_f_bpls.txt
index be11b59..1185625 100644
--- a/tests/suite/reference/no_xml_write_byid_f_bpls.txt
+++ b/tests/suite/reference/no_xml_write_byid_f_bpls.txt
@@ -1,25 +1,31 @@
 File info:
   of groups:     1
   of variables:  1
-  of attributes: 0
+  of attributes: 6
   of meshes:     0
   time steps:    0 - 0
-  bp version:    2
+  bp version:    3
   statistics:    Min / Max / Avg / Std_dev
 
-  double   temperature  {140} = 0 / 139 / 69.5 / 40.4135 
-    (  0)    0 1 2 3 4 5 6 7 8 9 
-    ( 10)    10 11 12 13 14 15 16 17 18 19 
-    ( 20)    20 21 22 23 24 25 26 27 28 29 
-    ( 30)    30 31 32 33 34 35 36 37 38 39 
-    ( 40)    40 41 42 43 44 45 46 47 48 49 
-    ( 50)    50 51 52 53 54 55 56 57 58 59 
-    ( 60)    60 61 62 63 64 65 66 67 68 69 
-    ( 70)    70 71 72 73 74 75 76 77 78 79 
-    ( 80)    80 81 82 83 84 85 86 87 88 89 
-    ( 90)    90 91 92 93 94 95 96 97 98 99 
-    (100)    100 101 102 103 104 105 106 107 108 109 
-    (110)    110 111 112 113 114 115 116 117 118 119 
-    (120)    120 121 122 123 124 125 126 127 128 129 
-    (130)    130 131 132 133 134 135 136 137 138 139 
+  double   temperature    {140} = 0 / 139 / 69.5 / 40.4135
+    (  0)    0 1 2 3 4 5 6 7 8 9
+    ( 10)    10 11 12 13 14 15 16 17 18 19
+    ( 20)    20 21 22 23 24 25 26 27 28 29
+    ( 30)    30 31 32 33 34 35 36 37 38 39
+    ( 40)    40 41 42 43 44 45 46 47 48 49
+    ( 50)    50 51 52 53 54 55 56 57 58 59
+    ( 60)    60 61 62 63 64 65 66 67 68 69
+    ( 70)    70 71 72 73 74 75 76 77 78 79
+    ( 80)    80 81 82 83 84 85 86 87 88 89
+    ( 90)    90 91 92 93 94 95 96 97 98 99
+    (100)    100 101 102 103 104 105 106 107 108 109
+    (110)    110 111 112 113 114 115 116 117 118 119
+    (120)    120 121 122 123 124 125 126 127 128 129
+    (130)    130 131 132 133 134 135 136 137 138 139
 
+  string   single_string  attr   = "A single string attribute"
+  char*[]  three_strings  attr   = {"X", "Yy", "ZzZ"}
+  integer  single_int     attr   = 5
+  double   single_double  attr   = 5.55555
+  integer  five_ints      attr   = {5, 4, 3, 2, 1}
+  double   five_double    attr   = {5.55555, 4.4444, 3.333, 2.22, 1.1}
diff --git a/tests/suite/reference/scalars_write_bpls.txt b/tests/suite/reference/scalars_write_bpls.txt
index 3eb07e8..7bb3998 100644
--- a/tests/suite/reference/scalars_write_bpls.txt
+++ b/tests/suite/reference/scalars_write_bpls.txt
@@ -4,19 +4,19 @@ File info:
   of attributes: 0
   of meshes:     0
   time steps:    0 - 0
-  bp version:    2
+  bp version:    3
   statistics:    Min / Max / Avg / Std_dev
 
-  byte                var_byte            scalar = -4 
-  short               var_short           scalar = -3 
-  integer             var_int             scalar = -2 
-  long long           var_long            scalar = -1 
-  unsigned byte       var_ubyte           scalar = 1 
-  unsigned short      var_ushort          scalar = 2 
-  unsigned integer    var_uint            scalar = 3 
-  unsigned long long  var_ulong           scalar = 4 
-  real                var_real            scalar = 5 
-  double              var_double          scalar = 6 
+  byte                var_byte            scalar = -4
+  short               var_short           scalar = -3
+  integer             var_int             scalar = -2
+  long long           var_long            scalar = -1
+  unsigned byte       var_ubyte           scalar = 1
+  unsigned short      var_ushort          scalar = 2
+  unsigned integer    var_uint            scalar = 3
+  unsigned long long  var_ulong           scalar = 4
+  real                var_real            scalar = 5
+  double              var_double          scalar = 6
   string              var_string          scalar = "ADIOS example"
-  complex             var_complex         scalar = (8,i9) 
+  complex             var_complex         scalar = (8,i9)
   double complex      var_double_complex  scalar = (10,i11)
diff --git a/tests/suite/reference/transforms_read_write_bpls.txt b/tests/suite/reference/transforms_read_write_bpls.txt
index 0a96d29..2bb4716 100644
--- a/tests/suite/reference/transforms_read_write_bpls.txt
+++ b/tests/suite/reference/transforms_read_write_bpls.txt
@@ -1,10 +1,12 @@
-  integer  l1          16*scalar = 1 / 1 / 1 / 0 
-  integer  l2          16*scalar = 64 / 64 / 64 / 0 
-  integer  o1          16*scalar = 0 / 15 / 7.5 / 4.60977 
-  integer  o2          16*scalar = 0 / 0 / 0 / 0 
-  integer  g1          16*scalar = 16 / 16 / 16 / 0 
-  integer  g2          16*scalar = 64 / 64 / 64 / 0 
-  double   t_none      16*{16, 64} = 0 / 1038 / 519 / 295.639 
-  double   t_identity  16*{16, 64} = 0 / 1038 / 519 / 295.639 
-  double   t_aplod     16*{16, 64} = 0 / 1038 / 519 / 295.639 
-  double   t_isobar    16*{16, 64} = 0 / 1038 / 519 / 295.639 
+  integer  l1          16*scalar = 1 / 1 / 1 / 0
+  integer  l2          16*scalar = 64 / 64 / 64 / 0
+  integer  o1          16*scalar = 0 / 15 / 7.5 / 4.60977
+  integer  o2          16*scalar = 0 / 0 / 0 / 0
+  integer  g1          16*scalar = 16 / 16 / 16 / 0
+  integer  g2          16*scalar = 64 / 64 / 64 / 0
+  double   t_none      16*{16, 64} = 0 / 1038 / 519 / 295.639
+  double   t_identity  16*{16, 64} = 0 / 1038 / 519 / 295.639
+  double   t_zlib      16*{16, 64} = 0 / 1038 / 519 / 295.639
+  double   t_bzip2     16*{16, 64} = 0 / 1038 / 519 / 295.639
+  double   t_aplod     16*{16, 64} = 0 / 1038 / 519 / 295.639
+  double   t_isobar    16*{16, 64} = 0 / 1038 / 519 / 295.639
diff --git a/tests/suite/test.sh b/tests/suite/test.sh
index 4e8342f..95ff3fe 100755
--- a/tests/suite/test.sh
+++ b/tests/suite/test.sh
@@ -11,13 +11,13 @@
 
 # default values
 XXX=`which aprun &>/dev/null`
-if [ $? == 0 ]; then
-    MPIRUN="aprun -q"
-    NP_MPIRUN=-n
-else
+#if [ $? == 0 ]; then
+#    MPIRUN="aprun -q"
+#    NP_MPIRUN=-n
+#else
     MPIRUN=mpirun
     NP_MPIRUN=-np
-fi
+#fi
 KEEPOUTPUT=no
 MAXPROCS=128
 
@@ -88,8 +88,7 @@ if [ "${SRCDIR:0:1}" != "/" ]; then
 fi
 
 # check if Fortran codes were built
-S=`grep BUILD_FORTRAN_TRUE $SRCDIR/$TRUNKDISTANCE/Makefile`
-if [ -z ${S#BUILD_FORTRAN_TRUE = } ]; then
+if [ -f $SRCDIR/$TRUNKDISTANCE/src/libadiosf.a ]; then
     HAVE_FORTRAN=yes
 else
     echo "WARNING: Fortran binaries are not built, so test will not use them"
diff --git a/tests/suite/tests/01_scalars.sh b/tests/suite/tests/01_scalars.sh
index 0bd2fec..bd67b7c 100755
--- a/tests/suite/tests/01_scalars.sh
+++ b/tests/suite/tests/01_scalars.sh
@@ -20,33 +20,33 @@ if [ $MAXPROCS -lt $PROCS ]; then
 fi
 
 # copy codes and inputs to . 
-cp $TRUNKDIR/examples/C/scalars/scalars_read .
-cp $TRUNKDIR/examples/C/scalars/scalars_write .
-cp $TRUNKDIR/examples/C/scalars/scalars.xml .
+cp $SRCDIR/programs/examples/scalars/scalars_read_C .
+cp $SRCDIR/programs/examples/scalars/scalars_write_C .
+cp $SRCDIR/programs/examples/scalars/scalars_C.xml .
 
 # Insert transform=X if requested by user
 add_transform_to_xmls
 
 echo "Run C scalars_write"
-echo $MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./scalars_write
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./scalars_write
+echo $MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./scalars_write_C
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./scalars_write_C
 EX=$?
-if [ ! -f scalars.bp ]; then
+if [ ! -f scalars_C.bp ]; then
     echo "ERROR: C version of scalars_write failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -lav scalars.bp | grep -v -e endianness -e 'file size' > c_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -lav scalars_C.bp | grep -v -e endianness -e 'file size' > c_bpls.txt
 diff -q c_bpls.txt $SRCDIR/reference/scalars_write_bpls.txt
 if [ $? != 0 ]; then
     echo "ERROR: C version of scalars_write produced a file different from the reference."
-    echo "Compare \"bpls -lav $PWD/scalars.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/scalars_write_bpls.txt"
+    echo "Compare \"bpls -lav $PWD/scalars_C.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/scalars_write_bpls.txt"
     exit 1
 fi
 
 echo "Run C scalars_read"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./scalars_read > c_read.txt
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./scalars_read_C > c_read.txt
 EX=$?
 if [ $? != 0 ]; then
     echo "ERROR: C version of scalars_read failed with exit code $EX"
@@ -65,34 +65,32 @@ if [ $HAVE_FORTRAN != yes ]; then
 fi
 # run the Fortran tests too if available
 
-mv scalars.xml scalars_c.xml
-mv scalars.bp scalars_c.bp
-cp $TRUNKDIR/examples/Fortran/scalars/scalars_read fortran_read
-cp $TRUNKDIR/examples/Fortran/scalars/scalars_write fortran_write
-cp $TRUNKDIR/examples/Fortran/scalars/scalars.xml .
+cp $SRCDIR/programs/examples/scalars/scalars_read_F .
+cp $SRCDIR/programs/examples/scalars/scalars_write_F .
+cp $SRCDIR/programs/examples/scalars/scalars_F.xml .
 
 # Insert transform=X if requested by user
 add_transform_to_xmls
 
 echo "Run Fortran scalar_write"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./fortran_write
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./scalars_write_F
 EX=$?
-if [ ! -f scalars.bp ]; then
+if [ ! -f scalars_F.bp ]; then
     echo "ERROR: Fortran version of scalars_write failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -lav scalars.bp | grep -v -e endianness -e 'file size' > f_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -lav scalars_F.bp | grep -v -e endianness -e 'file size' > f_bpls.txt
 diff -q f_bpls.txt $SRCDIR/reference/scalars_write_bpls.txt
 if [ $? != 0 ]; then
     echo "ERROR: Fortran version of scalars_write produced a file different from the reference"
-    echo "Compare \"bpls -lav scalars.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/scalars_write_bpls.txt"
+    echo "Compare \"bpls -lav scalars_F.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/scalars_write_bpls.txt"
     exit 1
 fi
 
 echo "Run Fortran scalars_read"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./fortran_read > f_read.txt
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./scalars_read_F > f_read.txt
 EX=$?
 if [ $? != 0 ]; then
     echo "ERROR: Fortran version of scalars_read failed with exit code $EX"
diff --git a/tests/suite/tests/02_attributes.sh b/tests/suite/tests/02_attributes.sh
index 7cb1204..b7492a2 100755
--- a/tests/suite/tests/02_attributes.sh
+++ b/tests/suite/tests/02_attributes.sh
@@ -20,41 +20,42 @@ if [ $MAXPROCS -lt $PROCS ]; then
 fi
 
 # copy codes and inputs to . 
-cp $TRUNKDIR/examples/C/attributes/attributes_read .
-cp $TRUNKDIR/examples/C/attributes/attributes_write .
-cp $TRUNKDIR/examples/C/attributes/attributes.xml .
+cp $SRCDIR/programs/examples/attributes/attributes_read_C .
+cp $SRCDIR/programs/examples/attributes/attributes_write_C .
+cp $SRCDIR/programs/examples/attributes/attributes_C.xml .
 
 # Insert transform=X if requested by user
 add_transform_to_xmls
 
-echo "Run C attributes_write"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./attributes_write
+echo "Run C attributes_write_C"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./attributes_write_C
 EX=$?
-if [ ! -f attributes.bp ]; then
-    echo "ERROR: C version of attributes_write failed. No BP file is created. Exit code=$EX"
+if [ ! -f attributes_C.bp ]; then
+    echo "ERROR: attributes_write_C failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -lav attributes.bp | grep -v -e endianness -e 'file size' > c_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -lav attributes_C.bp | grep -v -e endianness -e 'file size' > c_bpls.txt
 diff -q c_bpls.txt $SRCDIR/reference/attributes_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of attributes_write produced a file different from the reference."
-    echo "Compare \"bpls -lav $PWD/attributes.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/attributes_bpls.txt"
+    echo "ERROR: attributes_write_C produced a file different from the reference."
+    echo "Compare \"bpls -lav $PWD/attributes_C.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/attributes_bpls.txt"
     exit 1
 fi
 
-echo "Run C attributes_read"
-$MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./attributes_read | sort > c_read.txt
+echo "Run C attributes_read_C"
+$MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./attributes_read_C 
 EX=$?
 if [ $? != 0 ]; then
-    echo "ERROR: C version of attributes_read failed with exit code $EX"
+    echo "ERROR: attributes_read_C failed with exit code $EX"
     exit 1
 fi
 echo "Check output"
+cat log_read_C.[0-9]* | grep -F -v -e "DEBUG:" -e "INFO:" -e "WARN:" > c_read.txt
 diff -q c_read.txt $SRCDIR/reference/attributes_read.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of attributes_read produced an output different from the reference."
+    echo "ERROR: attributes_read_C produced an output different from the reference."
     echo "Compare $PWD/c_read.txt reference $SRCDIR/reference/attributes_read.txt"
     exit 1
 fi
diff --git a/tests/suite/tests/03_arrays.sh b/tests/suite/tests/03_arrays.sh
index fd8011c..c398349 100755
--- a/tests/suite/tests/03_arrays.sh
+++ b/tests/suite/tests/03_arrays.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 #
-# Test if adios can write and read arrays correctly
-# Uses codes from examples/C/arrays 
+# Test if adios can write and read local_array_C correctly
+# Uses codes from examples/C/local_array_C 
 #
 # Environment variables set by caller:
 # MPIRUN        Run command
@@ -19,42 +19,44 @@ if [ $MAXPROCS -lt $PROCS ]; then
 fi
 
 # copy codes and inputs to . 
-cp $TRUNKDIR/examples/C/arrays/arrays_read .
-cp $TRUNKDIR/examples/C/arrays/arrays_write .
-cp $TRUNKDIR/examples/C/arrays/arrays.xml .
+cp $SRCDIR/programs/examples/local_array/local_array_write_C .
+cp $SRCDIR/programs/examples/local_array/local_array_read_C .
+cp $SRCDIR/programs/examples/local_array/local_array_C.xml .
 
 # Insert transform=X if requested by user
 add_transform_to_xmls
 
-echo "Run C arrays_write"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./arrays_write
+echo "Run C local_array_write_C"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./local_array_write_C
 EX=$?
-if [ ! -f arrays.bp ]; then
-    echo "ERROR: C version of arrays_write failed. No BP file is created. Exit code=$EX"
+if [ ! -f local_array_C.bp ]; then
+    echo "ERROR: C version of local_array_write_C failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -lav arrays.bp | grep -v -e endianness -e 'file size' > c_bpls.txt
-diff -q c_bpls.txt $SRCDIR/reference/arrays_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -lav local_array_C.bp | grep -v -e endianness -e 'file size' > c_bpls.txt
+diff -q c_bpls.txt $SRCDIR/reference/local_array_C_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of arrays_write produced a file different from the reference."
-    echo "Compare \"bpls -lav $PWD/arrays.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/arrays_bpls.txt"
+    echo "ERROR: C version of local_array_write_C produced a file different from the reference."
+    echo "Compare \"bpls -lav $PWD/local_array_C.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/local_array_C_bpls.txt"
     exit 1
 fi
 
-echo "Run C arrays_read"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./arrays_read | sort > c_read.txt
+echo "Run C local_array_read_C"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./local_array_read_C 
 EX=$?
 if [ $? != 0 ]; then
-    echo "ERROR: C version of arrays_read failed with exit code $EX"
+    echo "ERROR: C version of local_array_read_C failed with exit code $EX"
     exit 1
 fi
+
 echo "Check output"
-diff -q c_read.txt $SRCDIR/reference/arrays_read.txt
+cat log_read_C.[0-9]* | grep -F -v -e "DEBUG:" -e "INFO:" -e "WARN:" > c_read.txt
+diff -q c_read.txt $SRCDIR/reference/local_array_C_read.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of arrays_read produced an output different from the reference."
-    echo "Compare $PWD/c_read.txt reference $SRCDIR/reference/arrays_read.txt"
+    echo "ERROR: C version of local_array_read_C produced an output different from the reference."
+    echo "Compare $PWD/c_read.txt reference $SRCDIR/reference/local_array_C_read.txt"
     exit 1
 fi
 
diff --git a/tests/suite/tests/04_global_array.sh b/tests/suite/tests/04_global_array.sh
index 3398d45..6872ae6 100755
--- a/tests/suite/tests/04_global_array.sh
+++ b/tests/suite/tests/04_global_array.sh
@@ -20,43 +20,44 @@ if [ $MAXPROCS -lt $PROCS ]; then
 fi
 
 # copy codes and inputs to . 
-cp $TRUNKDIR/examples/C/global-array/adios_global .
-cp $TRUNKDIR/examples/C/global-array/adios_read_global .
-cp $TRUNKDIR/examples/C/global-array/adios_global.xml .
+cp $SRCDIR/programs/examples/global_array/global_array_write_C .
+cp $SRCDIR/programs/examples/global_array/global_array_read_C .
+cp $SRCDIR/programs/examples/global_array/global_array_C.xml .
 
 # Insert transform=X if requested by user
 add_transform_to_xmls
 
-echo "Run C adios_global"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./adios_global
+echo "Run C global_array_write_C"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_write_C
 EX=$?
-if [ ! -f adios_global.bp ]; then
-    echo "ERROR: C version of adios_global failed. No BP file is created. Exit code=$EX"
+if [ ! -f global_array_C.bp ]; then
+    echo "ERROR: global_array_write_C failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -la adios_global.bp -d -n 10  | grep -v -e endianness -e 'file size' > c_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -la global_array_C.bp -d -n 10  | grep -v -e endianness -e 'file size' > c_bpls.txt
 diff -q c_bpls.txt $SRCDIR/reference/global_array_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of adios_global produced a file different from the reference."
-    echo "Compare \"bpls -la $PWD/adios_global.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_bpls.txt"
+    echo "ERROR: global_array_write_C produced a file different from the reference."
+    echo "Compare \"bpls -la $PWD/global_array_C.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_bpls.txt"
     exit 1
 fi
 
-echo "Run C adios_read_global"
-$MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./adios_read_global | sort > c_read.txt
+echo "Run C global_array_read_C"
+$MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./global_array_read_C 
 EX=$?
 if [ $? != 0 ]; then
-    echo "ERROR: C version of adios_read_global exited with $EX"
-    echo "Check $PWD/c_read.txt"
+    echo "ERROR: global_array_read_C exited with $EX"
+    echo "Check $PWD/log_read_C.* for each process' output"
     exit 1
 fi
 
 echo "Check output"
+cat log_read_C.[0-9]* | grep -F -v -e "DEBUG:" -e "INFO:" -e "WARN:" > c_read.txt
 diff -q c_read.txt $SRCDIR/reference/global_array_read.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of adios_read_global produced a file different from the reference."
+    echo "ERROR: global_array_read_C produced a file different from the reference."
     echo "$PWD/c_read.txt to reference $SRCDIR/reference/global_array_read.txt"
     exit 1
 fi
@@ -67,28 +68,26 @@ if [ $HAVE_FORTRAN != yes ]; then
 fi
 # run the Fortran tests too if available
 
-mv adios_global.xml adios_global_c.xml
-mv adios_global.bp adios_global_c.bp
-cp $TRUNKDIR/examples/Fortran/global-array/adios_global adios_global_f
-cp $TRUNKDIR/examples/Fortran/global-array/adios_global.xml .
+cp $SRCDIR/programs/examples/global_array/global_array_write_F .
+cp $SRCDIR/programs/examples/global_array/global_array_F.xml .
 
 # Insert transform=X if requested by user
 add_transform_to_xmls
 
-echo "Run Fortran adios_global_f"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./adios_global_f
+echo "Run Fortran global_array_write_F"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_write_F
 EX=$?
-if [ ! -f adios_global.bp ]; then
-    echo "ERROR: Fortran version of adios_global failed. No BP file is created. Exit code=$EX"
+if [ ! -f global_array_F.bp ]; then
+    echo "ERROR: global_array_write_F failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -la adios_global.bp -d -n 10 | grep -v -e endianness -e 'file size' > f_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -la global_array_F.bp -d -n 10 | grep -v -e endianness -e 'file size' > f_bpls.txt
 diff -q f_bpls.txt $SRCDIR/reference/global_array_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: Fortran version of adios_global produced a file different from the reference."
-    echo "Compare \"bpls -lav $PWD/adios_global.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_bpls.txt"
+    echo "ERROR: global_array_write_F produced a file different from the reference."
+    echo "Compare \"bpls -lav $PWD/global_array_F.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_bpls.txt"
     exit 1
 fi
 
diff --git a/tests/suite/tests/05_global_array_time.sh b/tests/suite/tests/05_global_array_time.sh
index 7e37b08..0227c92 100755
--- a/tests/suite/tests/05_global_array_time.sh
+++ b/tests/suite/tests/05_global_array_time.sh
@@ -19,43 +19,65 @@ if [ $MAXPROCS -lt $PROCS ]; then
 fi
 
 # copy codes and inputs to . 
-cp $TRUNKDIR/examples/C/global-array-time/adios_globaltime .
-cp $TRUNKDIR/examples/C/global-array-time/adios_read_globaltime .
-cp $TRUNKDIR/examples/C/global-array-time/adios_globaltime.xml .
+cp $SRCDIR/programs/examples/global_array_time/global_array_time_write_C .
+cp $SRCDIR/programs/examples/global_array_time/global_array_time_read_as_file_C .
+cp $SRCDIR/programs/examples/global_array_time/global_array_time_read_as_stream_C .
+cp $SRCDIR/programs/examples/global_array_time/global_array_time_C.xml .
 
 # Insert transform=X if requested by user
 add_transform_to_xmls
 
-echo "Run C adios_globaltime"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./adios_globaltime
+echo "Run C global_array_time_write_C"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_time_write_C
 EX=$?
-if [ ! -f adios_globaltime.bp ]; then
-    echo "ERROR: C version of adios_globaltime failed. No BP file is created. Exit code=$EX"
+if [ ! -f global_array_time_C.bp ]; then
+    echo "ERROR: global_array_time_write_C failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -la adios_globaltime.bp | grep -v -e endianness -e 'file size' > c_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -la global_array_time_C.bp | grep -v -e endianness -e 'file size' > c_bpls.txt
 diff -q c_bpls.txt $SRCDIR/reference/global_array_time_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of adios_globaltime produced a file different from the reference."
-    echo "Compare \"bpls -la $PWD/adios_globaltime.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_time_bpls.txt"
+    echo "ERROR: global_array_time_write_C produced a file different from the reference."
+    echo "Compare \"bpls -la $PWD/global_array_time_C.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_time_bpls.txt"
 fi
 
-echo "Run C adios_read_globaltime"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./adios_read_globaltime > c_read.txt
+###################################################
+echo "Run C global_array_time_read_as_file_C"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_time_read_as_file_C 
 EX=$?
 if [ $? != 0 ]; then
-    echo "ERROR: C version of adios_read_globaltime exited with $EX"
-    echo "Check $PWD/c_read.txt"
+    echo "ERROR: global_array_time_read_as_file_C exited with $EX"
+    echo "Check $PWD/c_read_as_file.txt"
     exit 1
 fi
 
 echo "Check output"
-diff -q c_read.txt $SRCDIR/reference/global_array_time_read.txt
+cat log_read_as_file_C.[0-9]* | grep -F -v -e "DEBUG:" -e "INFO:" -e "WARN:" > c_read_as_file.txt
+diff -q c_read_as_file.txt $SRCDIR/reference/global_array_time_read_as_file.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of adios_read_globaltime produced a file different from the reference."
-    echo "$PWD/c_read.txt to reference $SRCDIR/reference/global_array_time_read.txt"
+    echo "ERROR: global_array_time_read_as_file_C produced a file different from the reference."
+    echo "$PWD/c_read_as_file.txt to reference $SRCDIR/reference/global_array_time_read_as_file.txt"
+    exit 1
+fi
+
+###################################################
+echo "Run C global_array_time_read_as_stream_C"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_time_read_as_stream_C > c_read_as_stream.txt
+EX=$?
+if [ $? != 0 ]; then
+    echo "ERROR: global_array_time_read_as_stream_C exited with $EX"
+    echo "Check $PWD/c_read_as_stream.txt"
+    exit 1
+fi
+
+echo "Check output"
+cat log_read_as_stream_C.[0-9]* | grep -F -v -e "DEBUG:" -e "INFO:" -e "WARN:" > c_read_as_stream.txt
+diff -q c_read_as_stream.txt $SRCDIR/reference/global_array_time_read_as_stream.txt
+if [ $? != 0 ]; then
+    echo "ERROR: global_array_time_read_as_stream_C produced a stream different from the reference."
+    echo "$PWD/c_read_as_stream.txt to reference $SRCDIR/reference/global_array_time_read_as_stream.txt"
     exit 1
 fi
 
@@ -63,30 +85,29 @@ fi
 if [ $HAVE_FORTRAN != yes ]; then
     exit 0
 fi
+###################################################
 # run the Fortran tests too if available
 
-mv adios_globaltime.xml adios_globaltime_c.xml
-mv adios_globaltime.bp adios_globaltime_c.bp
-cp $TRUNKDIR/examples/Fortran/global-array-time/adios_globaltime adios_globaltime_f
-cp $TRUNKDIR/examples/Fortran/global-array-time/adios_globaltime.xml .
+cp $SRCDIR/programs/examples/global_array_time/global_array_time_write_F .
+cp $SRCDIR/programs/examples/global_array_time/global_array_time_F.xml .
 
 # Insert transform=X if requested by user
 add_transform_to_xmls
 
-echo "Run Fortran adios_globaltime_f"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./adios_globaltime_f
+echo "Run Fortran global_array_time_write_F"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_time_write_F
 EX=$?
-if [ ! -f adios_globaltime.bp ]; then
-    echo "ERROR: Fortran version of adios_globaltime failed. No BP file is created. Exit code=$EX"
+if [ ! -f global_array_time_F.bp ]; then
+    echo "ERROR: Fortran version of global_array_time_write_C failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -la adios_globaltime.bp | grep -v -e endianness -e 'file size' > f_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -la global_array_time_F.bp | grep -v -e endianness -e 'file size' > f_bpls.txt
 diff -q f_bpls.txt $SRCDIR/reference/global_array_time_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: Fortran version of adios_globaltime produced a file different from the reference."
-    echo "Compare \"bpls -la $PWD/adios_globaltime.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_time_bpls.txt"
+    echo "ERROR: global_array_time_write_F produced a file different from the reference."
+    echo "Compare \"bpls -la $PWD/global_array_time_F.bp | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_time_bpls.txt"
     exit 1
 fi
 
diff --git a/tests/suite/tests/07_global_array_no_xml.sh b/tests/suite/tests/07_global_array_no_xml.sh
index e8b3125..9f3d556 100755
--- a/tests/suite/tests/07_global_array_no_xml.sh
+++ b/tests/suite/tests/07_global_array_no_xml.sh
@@ -20,41 +20,42 @@ if [ $MAXPROCS -lt $PROCS ]; then
 fi
 
 # copy codes and inputs to . 
-cp $TRUNKDIR/examples/C/global-array/adios_global_no_xml .
-cp $TRUNKDIR/examples/C/global-array/adios_read_global_no_xml .
+cp $SRCDIR/programs/examples/global_array/global_array_write_noxml_C .
+cp $SRCDIR/programs/examples/global_array/global_array_read_noxml_C .
 
-echo "Run C adios_global_no_xml"
-ls -l ./adios_global_no_xml
-echo $MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./adios_global_no_xml
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./adios_global_no_xml
+echo "Run C global_array_write_noxml_C"
+echo $MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_write_noxml_C
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_write_noxml_C
 EX=$?
-if [ ! -f adios_global_no_xml.bp ]; then
-    echo "ERROR: C version of adios_global_no_xml failed. No BP file is created. Exit code=$EX"
+if [ ! -f global_array_noxml_C.bp ]; then
+    echo "ERROR: global_array_write_noxml_C failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -lav adios_global_no_xml.bp -d -n 10 | grep -v -e endianness -e 'file size' > c_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -lav global_array_noxml_C.bp -d -n 10 | grep -v -e endianness -e 'file size' > c_bpls.txt
 diff -q c_bpls.txt $SRCDIR/reference/global_array_no_xml_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of adios_global_no_xml produced a file different from the reference."
-    echo "Compare \"bpls -lav $PWD/adios_global_no_xml.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_no_xml_bpls.txt"
+    echo "ERROR: global_array_write_noxml_C produced a file different from the reference."
+    echo "Compare \"bpls -lav $PWD/global_array_noxml_C.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_no_xml_bpls.txt"
     exit 1
 fi
 
-echo "Run C adios_read_global_no_xml"
-$MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./adios_read_global_no_xml > c_read.txt
+echo "Run C global_array_read_noxml_C"
+echo $MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./global_array_read_noxml_C 
+$MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./global_array_read_noxml_C 
 EX=$?
 if [ $? != 0 ]; then
-    echo "ERROR: C version of adios_read_global_no_xml exited with $EX"
-    echo "Check $PWD/c_read.txt"
+    echo "ERROR: global_array_read_noxml_C exited with $EX"
+    echo "Check $PWD/log_read_noxml.* files."
     exit 1
 fi
 
 echo "Check output"
+cat log_read_C.[0-9]* | grep -F -v -e "DEBUG:" -e "INFO:" -e "WARN:" > c_read.txt
 diff -q c_read.txt $SRCDIR/reference/global_array_no_xml_read.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of adios_read_global produced a file different from the reference."
+    echo "ERROR: global_array_read_noxml_C produced a file different from the reference."
     echo "$PWD/c_read.txt to reference $SRCDIR/reference/global_array_no_xml_read.txt"
     exit 1
 fi
@@ -65,27 +66,22 @@ if [ $HAVE_FORTRAN != yes ]; then
 fi
 # run the Fortran tests too if available
 
-mv adios_global_no_xml.bp adios_global_no_xml_c.bp
-cp $TRUNKDIR/examples/Fortran/global-array/adios_global_no_xml adios_global_f
-cp $TRUNKDIR/examples/Fortran/global-array/adios_global.xml .
-
-# Insert transform=X if requested by user
-add_transform_to_xmls
+cp $SRCDIR/programs/examples/global_array/global_array_write_noxml_F .
 
 echo "Run Fortran adios_global_f"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./adios_global_f
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_write_noxml_F
 EX=$?
-if [ ! -f adios_global_no_xml.bp ]; then
-    echo "ERROR: Fortran version of adios_global failed. No BP file is created. Exit code=$EX"
+if [ ! -f global_array_noxml_F.bp ]; then
+    echo "ERROR: global_array_write_noxml_F failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -lav adios_global_no_xml.bp -d -n 10 | grep -v -e endianness -e 'file size' > f_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -lav global_array_noxml_F.bp -d -n 10 | grep -v -e endianness -e 'file size' > f_bpls.txt
 diff -q f_bpls.txt $SRCDIR/reference/global_array_no_xml_f_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: Fortran version of adios_global produced a file different from the reference."
-    echo "Compare \"bpls -lav $PWD/adios_global_no_xml.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_no_xml_f_bpls.txt"
+    echo "ERROR: global_array_write_noxml_F produced a file different from the reference."
+    echo "Compare \"bpls -lav $PWD/global_array_F.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/global_array_no_xml_f_bpls.txt"
     exit 1
 fi
 
diff --git a/tests/suite/tests/08_amr_write_read.sh b/tests/suite/tests/08_amr_write_read.sh
index 76d3d8b..326e620 100755
--- a/tests/suite/tests/08_amr_write_read.sh
+++ b/tests/suite/tests/08_amr_write_read.sh
@@ -13,6 +13,10 @@
 PROCS=32
 READPROCS=4
 
+echo "WARNING: This test is turned off" 
+exit 77  # not failure, just skip
+
+
 if [ $MAXPROCS -lt $PROCS ]; then
     echo "WARNING: Needs $PROCS processes at least"
     exit 77  # not failure, just skip
diff --git a/tests/suite/tests/09_amr_write_read_2vars.sh b/tests/suite/tests/09_amr_write_read_2vars.sh
index 5147a13..27bd886 100755
--- a/tests/suite/tests/09_amr_write_read_2vars.sh
+++ b/tests/suite/tests/09_amr_write_read_2vars.sh
@@ -13,6 +13,9 @@
 PROCS=32
 READPROCS=4
 
+echo "WARNING: This test is turned off"
+exit 77  # not failure, just skip
+
 if [ $MAXPROCS -lt $PROCS ]; then
     echo "WARNING: Needs $PROCS processes at least"
     exit 77  # not failure, just skip
diff --git a/tests/suite/tests/13_write_byid.sh b/tests/suite/tests/13_write_byid.sh
index e12e6f5..3a82d03 100755
--- a/tests/suite/tests/13_write_byid.sh
+++ b/tests/suite/tests/13_write_byid.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 #
 # Test if adios can write and read global arrays over time correctly
-# Uses codes from examples/C/global-array and examples/Fortran/global-array
+# Uses codes from tests/suite/programs/examples/global_array
 #
 # Environment variables set by caller:
 # MPIRUN        Run command
@@ -20,41 +20,42 @@ if [ $MAXPROCS -lt $PROCS ]; then
 fi
 
 # copy codes and inputs to . 
-cp $TRUNKDIR/examples/C/global-array/no_xml_write_byid .
-cp $TRUNKDIR/examples/C/global-array/read_no_xml_write_byid .
+cp $SRCDIR/programs/examples/global_array/global_array_write_byid_noxml_C .
+cp $SRCDIR/programs/examples/global_array/global_array_read_byid_noxml_C .
 
-echo "Run C no_xml_write_byid"
-ls -l ./no_xml_write_byid
-echo $MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./no_xml_write_byid
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./no_xml_write_byid
+echo "Run C global_array_write_byid_noxml_C"
+echo $MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_write_byid_noxml_C
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_write_byid_noxml_C
 EX=$?
-if [ ! -f no_xml_write_byid.bp ]; then
-    echo "ERROR: C version of no_xml_write_byid failed. No BP file is created. Exit code=$EX"
+if [ ! -f global_array_byid_noxml_C.bp ]; then
+    echo "ERROR: global_array_write_byid_noxml_C failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -lav no_xml_write_byid.bp -d -n 10 | grep -v -e endianness -e 'file size' > c_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -lav global_array_byid_noxml_C.bp -d -n 10 | grep -v -e endianness -e 'file size' > c_bpls.txt
 diff -q c_bpls.txt $SRCDIR/reference/no_xml_write_byid_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of no_xml_write_byid produced a file different from the reference."
-    echo "Compare \"bpls -lav $PWD/no_xml_write_byid.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/no_xml_write_byid_bpls.txt"
+    echo "ERROR: global_array_write_byid_noxml_C produced a file different from the reference."
+    echo "Compare \"bpls -lav $PWD/global_array_byid_noxml_C.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/no_xml_write_byid_bpls.txt"
     exit 1
 fi
 
-echo "Run C read_no_xml_write_byid"
-$MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./read_no_xml_write_byid > c_read.txt
+echo "Run C global_array_read_byid_noxml_C"
+echo $MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./global_array_read_byid_noxml_C
+$MPIRUN $NP_MPIRUN $READPROCS $EXEOPT ./global_array_read_byid_noxml_C
 EX=$?
 if [ $? != 0 ]; then
-    echo "ERROR: C version of read_no_xml_write_byid exited with $EX"
+    echo "ERROR: global_array_read_byid_noxml_C exited with $EX"
     echo "Check $PWD/c_read.txt"
     exit 1
 fi
 
 echo "Check output"
+cat log_read_C.[0-9]* | grep -F -v -e "DEBUG:" -e "INFO:" -e "WARN:" > c_read.txt
 diff -q c_read.txt $SRCDIR/reference/no_xml_write_byid_read.txt
 if [ $? != 0 ]; then
-    echo "ERROR: C version of read_no_xml_write_byid produced a file different from the reference."
+    echo "ERROR: global_array_read_byid_noxml_C produced a file different from the reference."
     echo "$PWD/c_read.txt to reference $SRCDIR/reference/no_xml_write_byid_read.txt"
     exit 1
 fi
@@ -65,23 +66,22 @@ if [ $HAVE_FORTRAN != yes ]; then
 fi
 # run the Fortran tests too if available
 
-mv no_xml_write_byid.bp no_xml_write_byid_c.bp
-cp $TRUNKDIR/examples/Fortran/global-array/no_xml_write_byid no_xml_write_byid_f
+cp $SRCDIR/programs/examples/global_array/global_array_write_byid_noxml_F .
 
-echo "Run Fortran no_xml_write_byid"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./no_xml_write_byid_f
+echo "Run Fortran global_array_write_noxml_F"
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_write_byid_noxml_F
 EX=$?
-if [ ! -f no_xml_write_byid.bp ]; then
-    echo "ERROR: Fortran version of no_xml_write_byid failed. No BP file is created. Exit code=$EX"
+if [ ! -f global_array_byid_noxml_F.bp ]; then
+    echo "ERROR: global_array_write_noxml_F failed. No BP file is created. Exit code=$EX"
     exit 1
 fi
 
 echo "Check output with bpls"
-$TRUNKDIR/utils/bpls/bpls -lav no_xml_write_byid.bp -d -n 10 | grep -v -e endianness -e 'file size' > f_bpls.txt
+$TRUNKDIR/utils/bpls/bpls -lav global_array_byid_noxml_F.bp -d -n 10 | grep -v -e endianness -e 'file size' > f_bpls.txt
 diff -q f_bpls.txt $SRCDIR/reference/no_xml_write_byid_f_bpls.txt
 if [ $? != 0 ]; then
-    echo "ERROR: Fortran version of no_xml_write_byid produced a file different from the reference."
-    echo "Compare \"bpls -lav $PWD/no_xml_write_byid.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/no_xml_write_byid_f_bpls.txt"
+    echo "ERROR: Fortran version of global_array_write_byid_noxml_F produced a file different from the reference."
+    echo "Compare \"bpls -lav $PWD/global_array_byid_noxml_F.bp -d -n 10 | grep -v -e endianness -e 'file size'\" to reference $SRCDIR/reference/no_xml_write_byid_f_bpls.txt"
     exit 1
 fi
 
diff --git a/tests/suite/tests/16_transform_write_read.sh b/tests/suite/tests/16_transform_write_read.sh
index 0d9e362..0e70e91 100755
--- a/tests/suite/tests/16_transform_write_read.sh
+++ b/tests/suite/tests/16_transform_write_read.sh
@@ -44,7 +44,7 @@ if [ $? != 0 ]; then
 fi
 rm c1.txt c2.txt
 
-for VAR in t_none t_identity t_aplod t_isobar
+for VAR in t_none t_identity t_aplod t_isobar t_zlib  t_bzip2
 do
     echo "  $VAR"
     grep "$VAR"  ${TEST_NAME}_bpls.txt > c1.txt
diff --git a/tests/suite/tests/18_aggregation_by_color.sh b/tests/suite/tests/18_aggregation_by_color.sh
index d1b6365..03d5d00 100755
--- a/tests/suite/tests/18_aggregation_by_color.sh
+++ b/tests/suite/tests/18_aggregation_by_color.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 #
 # Test if adios aggregates data by color properly.
-# Uses the example code from examples/C/global-array/adios_global_aggregate_by_color
+# Uses the example code from programs/examples/global_array/global_array_aggregate_by_color_C
 #
 # Environment variables set by caller:
 # MPIRUN        Run command
@@ -20,14 +20,14 @@ if [ $MAXPROCS -lt $PROCS ]; then
 fi
 
 # copy codes and inputs to . 
-cp $TRUNKDIR/examples/C/global-array/adios_global_aggregate_by_color .
+cp $SRCDIR/programs/examples/global_array/global_array_aggregate_by_color_C .
 
 echo "Run C adios_global_aggregate_by_color"
-$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./adios_global_aggregate_by_color
+$MPIRUN $NP_MPIRUN $PROCS $EXEOPT ./global_array_aggregate_by_color_C
 EX=$?
-if [ ! -f adios_global_aggregate_by_color.bp ] \
-|| [! -f adios_global_aggregate_by_color.bp.dir/adios_global_aggregate_by_color.bp.0 ] \
-|| [! -f adios_global_aggregate_by_color.bp.dir/adios_global_aggregate_by_color.bp.1 ]; then
-    echo "ERROR: adios_global_aggregate_by_color failed. No BP file is created. Exit code=$EX"
+if [ ! -f global_array_aggregate_by_color_C.bp ] \
+|| [! -f global_array_aggregate_by_color_C.bp.dir/global_array_aggregate_by_color_C.bp.0 ] \
+|| [! -f global_array_aggregate_by_color_C.bp.dir/global_array_aggregate_by_color_C.bp.1 ]; then
+    echo "ERROR: adios_global_aggregate_by_color failed. No BP file or subfiles are created. Exit code=$EX"
     exit 1
 fi
diff --git a/tests/suite/tests/19_query.sh b/tests/suite/tests/19_query.sh
index 7118c0b..b297976 100755
--- a/tests/suite/tests/19_query.sh
+++ b/tests/suite/tests/19_query.sh
@@ -175,7 +175,7 @@ function build_indexed_datasets_fastbit() {
   invoke_dataset_builder "$DSID" "$DSOUTPUT" "none"
   
   set -o xtrace
-  $FASTBIT_INDEXER_EXE_LOCAL "$DSOUTPUT".bp "<binning precision=5/>"||
+  $MPIRUN_SERIAL $FASTBIT_INDEXER_EXE_LOCAL "$DSOUTPUT".bp "<binning precision=5/>"||
     die "ERROR: $FASTBIT_INDEXER_EXE_LOCAL failed with exit code $?"
   set +o xtrace
 }
diff --git a/toolchain/cray/README.md b/toolchain/cray/README.md
index b591daa..c1cd133 100644
--- a/toolchain/cray/README.md
+++ b/toolchain/cray/README.md
@@ -10,6 +10,8 @@ A collection CMake code for use on various Cray supercomputing systems
 * ToolChain: CMake cross-compiling toolchain files
   * CrayPrgEnv-ToolChain.cmake: The Cray Programming Environment
 
+The toolchain was tested on Titan, eos and chester.
+
 How to use it:
 in ADIOS top source file
 $mkdir build
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index 72a1083..6939c14 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -4,6 +4,8 @@ add_subdirectory(bp2ascii)
 add_subdirectory(bpsplit)
 add_subdirectory(bpls)
 add_subdirectory(bpdiff)
+add_subdirectory(bpmeta)
+add_subdirectory(bprecover)
 add_subdirectory(list_methods)
 
 if(BUILD_WRITE)
diff --git a/utils/Makefile.am b/utils/Makefile.am
index f564048..e6d7bb6 100644
--- a/utils/Makefile.am
+++ b/utils/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS= gpp bpdump bp2ascii bpsplit bpls bpdiff skeldump list_methods bpmeta
+SUBDIRS= gpp bpdump bp2ascii bpsplit bpls bpdiff skeldump list_methods bpmeta bprecover
 
 if BUILD_WRITE
 SUBDIRS += adios_lint bp2bp 
diff --git a/utils/Makefile.in b/utils/Makefile.in
index 3e1228a..6058f18 100644
--- a/utils/Makefile.in
+++ b/utils/Makefile.in
@@ -101,7 +101,8 @@ AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = gpp bpdump bp2ascii bpsplit bpls bpdiff skeldump \
-	list_methods bpmeta adios_lint bp2bp fastbit bp2h5 bp2ncd skel
+	list_methods bpmeta bprecover adios_lint bp2bp fastbit bp2h5 \
+	bp2ncd skel
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -326,6 +327,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -384,7 +388,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 SUBDIRS = gpp bpdump bp2ascii bpsplit bpls bpdiff skeldump \
-	list_methods bpmeta $(am__append_1) $(am__append_2) \
+	list_methods bpmeta bprecover $(am__append_1) $(am__append_2) \
 	$(am__append_3) $(am__append_4) skel
 all: all-recursive
 
diff --git a/utils/adios_lint/CMakeLists.txt b/utils/adios_lint/CMakeLists.txt
index 784fb2f..c1d0353 100644
--- a/utils/adios_lint/CMakeLists.txt
+++ b/utils/adios_lint/CMakeLists.txt
@@ -2,7 +2,7 @@ include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
 include_directories(${PROJECT_SOURCE_DIR}/utils/adios_lint)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/utils/adios_lint)
 
 add_executable(adios_lint adios_lint.c)
diff --git a/utils/adios_lint/Makefile.am b/utils/adios_lint/Makefile.am
index a04ac86..ae642e4 100644
--- a/utils/adios_lint/Makefile.am
+++ b/utils/adios_lint/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src  -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public -I$(top_srcdir)/src  -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/adios_lint/Makefile.in b/utils/adios_lint/Makefile.in
index 6a58967..527ce9a 100644
--- a/utils/adios_lint/Makefile.in
+++ b/utils/adios_lint/Makefile.in
@@ -310,6 +310,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -367,7 +370,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 AUTOMAKE_OPTIONS = no-dependencies
 adios_lint_SOURCES = adios_lint.c
diff --git a/utils/bp2ascii/CMakeLists.txt b/utils/bp2ascii/CMakeLists.txt
index 1557df5..2238db1 100644
--- a/utils/bp2ascii/CMakeLists.txt
+++ b/utils/bp2ascii/CMakeLists.txt
@@ -2,7 +2,7 @@ include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/utils/bp2ascii)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/utils/bp2ascii)
 
 add_executable(bp2ascii bp2ascii.c)
diff --git a/utils/bp2ascii/Makefile.am b/utils/bp2ascii/Makefile.am
index 2e6de81..5ea6185 100644
--- a/utils/bp2ascii/Makefile.am
+++ b/utils/bp2ascii/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/bp2ascii/Makefile.in b/utils/bp2ascii/Makefile.in
index 9a650ca..6f708a6 100644
--- a/utils/bp2ascii/Makefile.in
+++ b/utils/bp2ascii/Makefile.in
@@ -308,6 +308,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -365,7 +368,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 AUTOMAKE_OPTIONS = no-dependencies
 bp2ascii_SOURCES = bp2ascii.c 
diff --git a/utils/bp2ascii/bp2ascii.c b/utils/bp2ascii/bp2ascii.c
index 9bdb7d1..f2a2f72 100644
--- a/utils/bp2ascii/bp2ascii.c
+++ b/utils/bp2ascii/bp2ascii.c
@@ -98,7 +98,7 @@ int main (int argc, char ** argv)
     adios_parse_index_offsets_v1 (b);
 
     adios_posix_read_process_group_index (b);
-    adios_parse_process_group_index_v1 (b, &pg_root);
+    adios_parse_process_group_index_v1 (b, &pg_root, NULL);
     print_process_group_index (pg_root);
 
     adios_posix_read_vars_index (b);
diff --git a/utils/bp2bp/CMakeLists.txt b/utils/bp2bp/CMakeLists.txt
index 733bb44..27d6211 100644
--- a/utils/bp2bp/CMakeLists.txt
+++ b/utils/bp2bp/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/utils/bp2bp)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/utils/bp2bp)
 
 add_executable(bp2bp bp2bp.c)
diff --git a/utils/bp2bp/Makefile.am b/utils/bp2bp/Makefile.am
index 28884b0..26ef548 100644
--- a/utils/bp2bp/Makefile.am
+++ b/utils/bp2bp/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/bp2bp/Makefile.in b/utils/bp2bp/Makefile.in
index c6da91e..2bdea12 100644
--- a/utils/bp2bp/Makefile.in
+++ b/utils/bp2bp/Makefile.in
@@ -309,6 +309,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -366,8 +369,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 bp2bp_SOURCES = bp2bp.c
 bp2bp_CPPFLAGS = $(AM_CPPFLAGS) ${MACRODEFFLAG}ADIOS_USE_READ_API_1 $(ADIOSLIB_CPPFLAGS) $(ADIOSLIB_CFLAGS) $(ADIOSLIB_EXTRA_CPPFLAGS) 
diff --git a/utils/bp2h5/CMakeLists.txt b/utils/bp2h5/CMakeLists.txt
index 09cfdde..03b8cc1 100644
--- a/utils/bp2h5/CMakeLists.txt
+++ b/utils/bp2h5/CMakeLists.txt
@@ -1,6 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/utils/bp2h5)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/utils/bp2h5)
 
 add_executable(bp2h5 bp2h5.c)
diff --git a/utils/bp2h5/Makefile.am b/utils/bp2h5/Makefile.am
index a018f55..6872239 100644
--- a/utils/bp2h5/Makefile.am
+++ b/utils/bp2h5/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/bp2h5/Makefile.in b/utils/bp2h5/Makefile.in
index 0a8b0e2..bb117d3 100644
--- a/utils/bp2h5/Makefile.in
+++ b/utils/bp2h5/Makefile.in
@@ -313,6 +313,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -370,8 +373,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 bp2h5_SOURCES = bp2h5.c
 @USE_PARALLEL_COMPILER_FALSE at bp2h5_CPPFLAGS = $(AM_CPPFLAGS) ${MACRODEFFLAG}H5_USE_16_API ${MACRODEFFLAG}ADIOS_USE_READ_API_1 $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSREADLIB_SEQ_CPPFLAGS) $(ADIOSREADLIB_SEQ_CFLAGS) $(HDF5_CPPFLAGS)
diff --git a/utils/bp2ncd/CMakeLists.txt b/utils/bp2ncd/CMakeLists.txt
index 25e6eff..25d8cfe 100644
--- a/utils/bp2ncd/CMakeLists.txt
+++ b/utils/bp2ncd/CMakeLists.txt
@@ -2,7 +2,7 @@ include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
 include_directories(${PROJECT_SOURCE_DIR}/utils/bp2ncd)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/src  ${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/utils/bp2ncd)
 
 add_executable(bp2ncd bp2ncd.c)
diff --git a/utils/bp2ncd/Makefile.am b/utils/bp2ncd/Makefile.am
index cda7870..5f80772 100644
--- a/utils/bp2ncd/Makefile.am
+++ b/utils/bp2ncd/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/bp2ncd/Makefile.in b/utils/bp2ncd/Makefile.in
index 5dac3cb..773d0b6 100644
--- a/utils/bp2ncd/Makefile.in
+++ b/utils/bp2ncd/Makefile.in
@@ -312,6 +312,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -369,7 +372,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 AUTOMAKE_OPTIONS = no-dependencies
 bp2ncd_SOURCES = bp2ncd.c
diff --git a/utils/bp2ncd/bp2ncd.c b/utils/bp2ncd/bp2ncd.c
index 03b292c..349a231 100644
--- a/utils/bp2ncd/bp2ncd.c
+++ b/utils/bp2ncd/bp2ncd.c
@@ -248,7 +248,7 @@ int ncd_dataset (int ncid
     enum ADIOS_FLAG time_flag;
     while (dims) {
         ++maxrank;
-        if (dims->dimension.time_index == adios_flag_yes) {
+        if (dims->dimension.is_time_index == adios_flag_yes) {
             time_flag = adios_flag_yes;
             time_dimrank = maxrank-1;
             //fprintf(stderr, "Time dim rank = %d\n",time_dimrank); 
@@ -377,7 +377,7 @@ int ncd_dataset (int ncid
                     else {
                         for (i = 0; i < var_dims_count; i++) {
                             if (var_dims [i].id == dims->dimension.var_id) {
-                                if (dims->dimension.time_index == adios_flag_yes) {
+                                if (dims->dimension.is_time_index == adios_flag_yes) {
                                     start_dims[rank] = var_dims[i].rank - 1;
                                     time_index = var_dims[i].rank;
                                     count_dims[rank] = 1;
@@ -455,7 +455,7 @@ int ncd_dataset (int ncid
                     count_dims[rank] = dims->dimension.rank;
                     start_dims[rank] =0; 
                     ERR(retval);
-                    fprintf(stderr, "\t local[%d]: %d\n",rank,dims->dimension.rank);
+                    fprintf(stderr, "\t local[%d]: %llu\n",rank,dims->dimension.rank);
                 } 
             }
             if (dims)
@@ -723,7 +723,7 @@ int main (int argc, char ** argv)
     adios_parse_index_offsets_v1 (b);
 
     adios_posix_read_process_group_index (b);
-    adios_parse_process_group_index_v1 (b, &pg_root);
+    adios_parse_process_group_index_v1 (b, &pg_root, NULL);
 
     copy_buffer(b_0, b);
     adios_posix_read_vars_index (b);
diff --git a/utils/bpdiff/CMakeLists.txt b/utils/bpdiff/CMakeLists.txt
index c58ad12..7541606 100644
--- a/utils/bpdiff/CMakeLists.txt
+++ b/utils/bpdiff/CMakeLists.txt
@@ -2,6 +2,7 @@ include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/utils/bpdiff)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/utils/bpdiff)
 
 add_executable(bpdiff bpdiff.c decompose_block.c utils.c)
diff --git a/utils/bpdiff/Makefile.am b/utils/bpdiff/Makefile.am
index 0034bf0..120e038 100644
--- a/utils/bpdiff/Makefile.am
+++ b/utils/bpdiff/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/bpdiff/Makefile.in b/utils/bpdiff/Makefile.in
index a0f438f..f98a04c 100644
--- a/utils/bpdiff/Makefile.in
+++ b/utils/bpdiff/Makefile.in
@@ -308,6 +308,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -365,8 +368,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 bpdiff_SOURCES = bpdiff.c decompose_block.c utils.c
 bpdiff_CPPFLAGS = $(AM_CPPFLAGS) $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSREADLIB_CPPFLAGS) $(ADIOSREADLIB_CFLAGS)
diff --git a/utils/bpdump/CMakeLists.txt b/utils/bpdump/CMakeLists.txt
index b32dfbd..1fdf10c 100644
--- a/utils/bpdump/CMakeLists.txt
+++ b/utils/bpdump/CMakeLists.txt
@@ -1,7 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
 include_directories(${PROJECT_SOURCE_DIR}/src/core/transforms)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 
diff --git a/utils/bpdump/Makefile.am b/utils/bpdump/Makefile.am
index 5dffe4f..ee38e4d 100644
--- a/utils/bpdump/Makefile.am
+++ b/utils/bpdump/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core -I$(top_srcdir)/src/core/transforms
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core -I$(top_srcdir)/src/core/transforms
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/bpdump/Makefile.in b/utils/bpdump/Makefile.in
index 1634df9..6e4eeda 100644
--- a/utils/bpdump/Makefile.in
+++ b/utils/bpdump/Makefile.in
@@ -309,6 +309,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -366,7 +369,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public -I$(top_srcdir)/src/core \
 	-I$(top_srcdir)/src/core/transforms
 AUTOMAKE_OPTIONS = no-dependencies
diff --git a/utils/bpdump/bpdump.c b/utils/bpdump/bpdump.c
index c896ba7..f95df9d 100644
--- a/utils/bpdump/bpdump.c
+++ b/utils/bpdump/bpdump.c
@@ -61,6 +61,8 @@ void print_attributes_index
 //const char * value_to_string (enum ADIOS_DATATYPES type, void * data);
 const char * value_to_string_ptr (enum ADIOS_DATATYPES type, void * data, uint64_t element);
 
+int have_subfiles = 0; // global flag indicating if we variables are stored in subfiles (bpdump does not process subfiles)
+
 int main (int argc, char ** argv)
 {
     char * filename;
@@ -112,6 +114,7 @@ int main (int argc, char ** argv)
         dump.dump_var = 0;
     }
 
+    have_subfiles = 0;
     struct adios_bp_buffer_struct_v1 * b = 0;
     uint32_t version = 0;
 
@@ -159,7 +162,7 @@ int main (int argc, char ** argv)
     */
 
     adios_posix_read_process_group_index (b);
-    adios_parse_process_group_index_v1 (b, &pg_root);
+    adios_parse_process_group_index_v1 (b, &pg_root, NULL);
     print_process_group_index (pg_root);
 
     printf (DIVIDER);
@@ -181,10 +184,27 @@ int main (int argc, char ** argv)
     }
 
 
-    uint64_t element_num = 1;
+    uint64_t pg_num = 0;
     pg = pg_root;
     while (pg)
     {
+
+        pg_num++;
+        /* Avoid processing PG's whose offset is beyond the start of index (they are actually in subfiles) */
+        /* Note: only variables have subfile index, PG's don't so we need to be this indirect in the test */
+        if (pg->offset_in_file >= b->pg_index_offset) 
+        {
+            printf ("Process Group %llu offset is beyond the footer.", pg_num);
+            if (have_subfiles) {
+                printf (" It is probably in a subfile but bpdump does not process subfiles.\n");
+            } else {
+                printf (" Since there are no subfiles, this probably means the BP file is corrupt.\n"
+                        "offset=%llu  footer starts at %llu\n", pg->offset_in_file, b->pg_index_offset);
+            }
+            pg = pg->next;
+            continue;
+        }
+
         int var_dims_count = 0;
         struct var_dim * var_dims = 0;
 
@@ -213,7 +233,7 @@ int main (int argc, char ** argv)
 
         adios_posix_read_process_group (b);
         adios_parse_process_group_header_v1 (b, &pg_header);
-        print_process_group_header (element_num++, &pg_header);
+        print_process_group_header (pg_num, &pg_header);
         //printf ("\tSize of group in fil: %llu bytes\n",  b->read_pg_size);
 
         adios_parse_vars_header_v1 (b, &vars_header);
@@ -561,7 +581,7 @@ void print_var_header (struct adios_var_header_struct_v1 * var_header)
             printf ("\t\t\tDim %d l:g:o: ", i++);
             if (d->dimension.var_id == 0)
             {
-                if (d->dimension.time_index == adios_flag_yes)
+                if (d->dimension.is_time_index == adios_flag_yes)
                 {
                     printf ("TIME");
                 }
@@ -581,7 +601,7 @@ void print_var_header (struct adios_var_header_struct_v1 * var_header)
             {
                 if (d->global_dimension.var_id == 0)
                 {
-                    if (d->global_dimension.time_index == adios_flag_yes)
+                    if (d->global_dimension.is_time_index == adios_flag_yes)
                     {
                         printf (":TIME");
                     }
@@ -596,7 +616,7 @@ void print_var_header (struct adios_var_header_struct_v1 * var_header)
                 }
                 if (d->local_offset.var_id == 0)
                 {
-                    if (d->local_offset.time_index == adios_flag_yes)
+                    if (d->local_offset.is_time_index == adios_flag_yes)
                     {
                         printf (":TIME");
                     }
@@ -898,7 +918,7 @@ void print_var_payload (struct adios_var_header_struct_v1 * var_header
                 }
                 else
                 {
-                    if (d->dimension.time_index == adios_flag_yes)
+                    if (d->dimension.is_time_index == adios_flag_yes)
                     {
                         *dims_t = 1;
                     }
@@ -970,6 +990,7 @@ void print_attrs_header (
 
 void print_attribute (struct adios_attribute_struct_v1 * attribute)
 {
+    int i;
     printf ("\t\tAttribute Name (ID): %s (%d)\n"
            ,attribute->name, attribute->id
            );
@@ -981,10 +1002,20 @@ void print_attribute (struct adios_attribute_struct_v1 * attribute)
     else
     {
         printf ("\t\tDatatype: %s\n", adios_type_to_string_int (attribute->type));
-        printf ("\t\tValue: %s\n", bp_value_to_string (attribute->type
-                                                   ,attribute->value
-                                                   )
-               );
+        printf ("\t\t# of elements:   %d\n", attribute->nelems);
+        printf ("\t\tLength in bytes: %d\n", attribute->length);
+        char * p = (char *) attribute->value;
+        int elemsize = (int) adios_get_type_size (attribute->type, attribute->value);
+        if (attribute->nelems == 1) {
+            printf ("\t\tValue: %s\n", bp_value_to_string (attribute->type ,attribute->value));
+        } else {
+            printf ("\t\tValues: %s", bp_value_to_string (attribute->type, p));
+            for (i=1; i<attribute->nelems; i++) {
+                p += elemsize;
+                printf (", %s", bp_value_to_string (attribute->type, p));
+            }
+            printf ("\n");
+        }
     }
 }
 
@@ -1034,6 +1065,10 @@ void print_vars_index (struct adios_index_var_struct_v1 * vars_root)
             printf ("\tFile Index(%d)", vars_root->characteristics [i].file_index);
             printf ("\tTime Index(%d)", vars_root->characteristics [i].time_index);
 
+            if (vars_root->characteristics [i].file_index != (uint32_t)-1) { 
+                have_subfiles = 1;
+            }
+
     		/* NCSU - Print min, max */
 			if (vars_root->type == adios_complex || vars_root->type == adios_double_complex)
 			{
@@ -1233,10 +1268,19 @@ void print_attributes_index
 
             if (attrs_root->characteristics [i].value)
             {
-                printf ("\t\tValue(%s)", bp_value_to_string (attrs_root->type
-                                        ,attrs_root->characteristics [i].value
-                                        )
-                       );
+                if (attrs_root->nelems == 1) {
+                    printf ("\t\tValue(%s)", bp_value_to_string (attrs_root->type, attrs_root->characteristics [i].value));
+                } else {
+                    char * p = (char *) attrs_root->characteristics [i].value;
+                    int elemsize = (int) adios_get_type_size (attrs_root->type, p);
+                    int k;
+                    printf ("\t\tValues(%s", bp_value_to_string (attrs_root->type, p));
+                    for (k=1; k<attrs_root->nelems; k++) {
+                        p += elemsize;
+                        printf (", %s", bp_value_to_string (attrs_root->type, p));
+                    }
+                    printf (")\n");
+                }
             }
             if (attrs_root->characteristics [i].var_id)
             {
diff --git a/utils/bpls/CMakeLists.txt b/utils/bpls/CMakeLists.txt
index 87ac92c..bd81356 100644
--- a/utils/bpls/CMakeLists.txt
+++ b/utils/bpls/CMakeLists.txt
@@ -2,6 +2,7 @@ include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/utils/bpls)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
+include_directories(${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/utils/bpls)
 
 add_executable(bpls bpls.c)
diff --git a/utils/bpls/Makefile.am b/utils/bpls/Makefile.am
index 45b899d..3bfbc3b 100644
--- a/utils/bpls/Makefile.am
+++ b/utils/bpls/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public
+AM_CPPFLAGS += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/bpls/Makefile.in b/utils/bpls/Makefile.in
index 3201874..9036460 100644
--- a/utils/bpls/Makefile.in
+++ b/utils/bpls/Makefile.in
@@ -307,6 +307,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -364,8 +367,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/public
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/public
 AUTOMAKE_OPTIONS = no-dependencies
 bpls_SOURCES = bpls.c 
 bpls_CPPFLAGS = $(AM_CPPFLAGS) $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSREADLIB_SEQ_CPPFLAGS) $(ADIOSREADLIB_SEQ_CFLAGS)
diff --git a/utils/bpls/bpls.c b/utils/bpls/bpls.c
index 3343d6b..165950c 100644
--- a/utils/bpls/bpls.c
+++ b/utils/bpls/bpls.c
@@ -560,7 +560,16 @@ int doList_group (ADIOS_FILE *fp)
                 // list (and print) attribute
                 if (readattrs || dump) {
                     fprintf(outf,"  attr   = ");
-                    print_data(value, 0, vartype, false); 
+                    int type_size = adios_type_size (vartype, value);
+                    int nelems = attrsize / type_size;
+                    char *p = (char*)value;
+                    if (nelems>1) fprintf(outf,"{");
+                    for (i=0; i<nelems; i++) { 
+                        if (i>0) fprintf(outf,", ");
+                        print_data(p, 0, vartype, false); 
+                        p += type_size;
+                    }
+                    if (nelems>1) fprintf(outf,"}");
                     fprintf(outf,"\n");
                     matches = false; // already printed
                 } else {
@@ -603,19 +612,19 @@ int doList_group (ADIOS_FILE *fp)
                         if(vartype == adios_complex || vartype == adios_double_complex) {
                             // force printing (double,double) here
                             print_data(vi->statistics->min, 0, adios_double_complex, false); 
-                            fprintf(outf,"/ ");
+                            fprintf(outf," / ");
                             print_data(vi->statistics->max, 0, adios_double_complex, false); 
-                            fprintf(outf,"/ ");
+                            fprintf(outf," / ");
                             print_data(vi->statistics->avg, 0, adios_double_complex, false);
-                            fprintf(outf,"/ ");
+                            fprintf(outf," / ");
                             print_data(vi->statistics->std_dev, 0, adios_double_complex, false);
                         } else {
                             print_data(vi->statistics->min, 0, vartype, false); 
-                            fprintf(outf,"/ ");
+                            fprintf(outf," / ");
                             print_data(vi->statistics->max, 0, vartype, false); 
-                            fprintf(outf,"/ ");
+                            fprintf(outf," / ");
                             print_data(vi->statistics->avg, 0, adios_double, false);
-                            fprintf(outf,"/ ");
+                            fprintf(outf," / ");
                             print_data(vi->statistics->std_dev, 0, adios_double, false);
                         }
 
@@ -1634,53 +1643,59 @@ int print_data(void *data, int item, enum ADIOS_DATATYPES adiosvartype, bool all
     // print next data item 
     switch(adiosvartype) {
         case adios_unsigned_byte:
-            fprintf(outf,(f ? format : "%hhu "), ((unsigned char *) data)[item]);
+            fprintf(outf,(f ? format : "%hhu"), ((unsigned char *) data)[item]);
             break;
         case adios_byte:
-            fprintf(outf,(f ? format : "%hhd "), ((signed char *) data)[item]);
+            fprintf(outf,(f ? format : "%hhd"), ((signed char *) data)[item]);
             break;
+
         case adios_string:
             fprintf(outf,(f ? format : "\"%s\""), ((char *) data)+item);
             break;
+        case adios_string_array:
+            // we expect one elemet of the array here
+            fprintf(outf,(f ? format : "\"%s\""), *((char **)data+item));
+            break;
+
 
         case adios_unsigned_short:  
-            fprintf(outf,(f ? format : "%hu "), ((unsigned short *) data)[item]);
+            fprintf(outf,(f ? format : "%hu"), ((unsigned short *) data)[item]);
             break;
         case adios_short:
-            fprintf(outf,(f ? format : "%hd "), ((signed short *) data)[item]);
+            fprintf(outf,(f ? format : "%hd"), ((signed short *) data)[item]);
             break;
 
         case adios_unsigned_integer:
-            fprintf(outf,(f ? format : "%u "), ((unsigned int *) data)[item]);
+            fprintf(outf,(f ? format : "%u"), ((unsigned int *) data)[item]);
             break;
         case adios_integer:    
-            fprintf(outf,(f ? format : "%d "), ((signed int *) data)[item]);
+            fprintf(outf,(f ? format : "%d"), ((signed int *) data)[item]);
             break;
 
         case adios_unsigned_long:
-            fprintf(outf,(f ? format : "%llu "), ((unsigned long long *) data)[item]);
+            fprintf(outf,(f ? format : "%llu"), ((unsigned long long *) data)[item]);
             break;
         case adios_long:        
-            fprintf(outf,(f ? format : "%lld "), ((signed long long *) data)[item]);
+            fprintf(outf,(f ? format : "%lld"), ((signed long long *) data)[item]);
             break;
 
         case adios_real:
-            fprintf(outf,(f ? format : "%g "), ((float *) data)[item]);
+            fprintf(outf,(f ? format : "%g"), ((float *) data)[item]);
             break;
 
         case adios_double:
-            fprintf(outf,(f ? format : "%g "), ((double *) data)[item]);
+            fprintf(outf,(f ? format : "%g"), ((double *) data)[item]);
             break;
 
 
         case adios_long_double:
-            fprintf(outf,(f ? format : "%Lg "), ((long double *) data)[item]);
+            fprintf(outf,(f ? format : "%Lg"), ((long double *) data)[item]);
             //fprintf(outf,(f ? format : "????????"));
             break;
 
 
         case adios_complex:  
-            fprintf(outf,(f ? format : "(%g,i%g) "), ((float *) data)[2*item], ((float *) data)[2*item+1]);
+            fprintf(outf,(f ? format : "(%g,i%g)"), ((float *) data)[2*item], ((float *) data)[2*item+1]);
             break;
 
         case adios_double_complex:
@@ -1746,6 +1761,8 @@ int print_dataset(void *data, enum ADIOS_DATATYPES adiosvartype,
         if (nextcol == ncols) {
             fprintf(outf,"\n");
             nextcol = 0;
+        } else {
+            fprintf(outf," ");
         }
 
         // increment indices
@@ -1792,6 +1809,8 @@ void print_decomp(ADIOS_VARINFO *vi)
     {
         // arrays
         int ndigits_nblocks;
+        int ndigits_procid;
+        int ndigits_time;
         int ndigits_dims[32];
         int blockid = 0;
         for (k=0; k < vi->ndim; k++) {
@@ -1803,8 +1822,17 @@ void print_decomp(ADIOS_VARINFO *vi)
             fprintf(outf, "        step %*d: ", ndigits_nsteps, i);
             fprintf(outf,"\n");
             ndigits_nblocks = ndigits (vi->nblocks[i]-1);
+            ndigits_procid  = ndigits (vi->blockinfo[blockid+vi->nblocks[i]-1].process_id);
+            ndigits_time    = ndigits (vi->blockinfo[blockid+vi->nblocks[i]-1].time_index);
             for (j=0; j < vi->nblocks[i]; j++) {
-                fprintf(outf,"          block %*d: [", ndigits_nblocks, j);
+                if (verbose < 1) {
+                    fprintf(outf,"          block %*d: [", ndigits_nblocks, j);
+                } else {
+                    fprintf(outf,"          block %*d proc %*u time %*u: [", 
+                        ndigits_nblocks, j, 
+                        ndigits_procid,  vi->blockinfo[blockid].process_id,
+                        ndigits_time,    vi->blockinfo[blockid].time_index);
+                }
                 for (k=0; k < vi->ndim; k++) {
                     if (vi->blockinfo[blockid].count[k]) {
                     fprintf(outf, "%*lld:%*lld", 
@@ -1833,7 +1861,7 @@ void print_decomp(ADIOS_VARINFO *vi)
                         fprintf(outf,"N/A ");
                     }
 
-                    fprintf(outf,"/ ");
+                    fprintf(outf," / ");
                     if (vi->statistics->blocks->maxs) {
                         if(vi->type == adios_complex || vi->type == adios_double_complex) {
                             print_data(vi->statistics->blocks->maxs[blockid], 0, adios_double_complex, false); 
diff --git a/utils/bpmeta/CMakeLists.txt b/utils/bpmeta/CMakeLists.txt
index b51b2b5..2e1e758 100644
--- a/utils/bpmeta/CMakeLists.txt
+++ b/utils/bpmeta/CMakeLists.txt
@@ -1,7 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
 include_directories(${PROJECT_SOURCE_DIR}/src/core/transforms)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 
diff --git a/utils/bpmeta/Makefile.am b/utils/bpmeta/Makefile.am
index ad37b0d..2648764 100644
--- a/utils/bpmeta/Makefile.am
+++ b/utils/bpmeta/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core -I$(top_srcdir)/src/core/transforms
+AM_CPPFLAGS += -I$(top_builddir)/src  -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core -I$(top_srcdir)/src/core/transforms
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/bpmeta/Makefile.in b/utils/bpmeta/Makefile.in
index d457b7f..185a01a 100644
--- a/utils/bpmeta/Makefile.in
+++ b/utils/bpmeta/Makefile.in
@@ -309,6 +309,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -366,7 +369,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public -I$(top_srcdir)/src/core \
 	-I$(top_srcdir)/src/core/transforms
 AUTOMAKE_OPTIONS = no-dependencies
diff --git a/utils/bpmeta/bpmeta.c b/utils/bpmeta/bpmeta.c
index ef8dddc..cc3cb8a 100644
--- a/utils/bpmeta/bpmeta.c
+++ b/utils/bpmeta/bpmeta.c
@@ -206,7 +206,7 @@ int main (int argc, char ** argv)
         }
         if (verbose)
             printf ("Process subfiles from %d to %d with thread %d\n", 
-                    targs[tid].startidx, targs[tid].endidx, targs[tid]);
+                    targs[tid].startidx, targs[tid].endidx, targs[tid].tid);
 
         if (tid < nthreads-1) {
             /* Start worker thread. */
@@ -256,7 +256,7 @@ int main (int argc, char ** argv)
         adios_merge_index_v1 (globalindex, 
                               subindex[tid]->pg_root, 
                               subindex[tid]->vars_root, 
-                              subindex[tid]->attrs_root); 
+                              subindex[tid]->attrs_root, 1); 
     }
     write_index (globalindex, filename);
 
@@ -377,7 +377,7 @@ int process_subfiles (int tid, int startidx, int endidx)
          */
 
         adios_posix_read_process_group_index (b[idx]);
-        adios_parse_process_group_index_v1 (b[idx], &new_pg_root);
+        adios_parse_process_group_index_v1 (b[idx], &new_pg_root, NULL);
         print_pg_index (tid, new_pg_root);
 
         adios_posix_read_vars_index (b[idx]);
@@ -388,7 +388,7 @@ int process_subfiles (int tid, int startidx, int endidx)
         adios_parse_attributes_index_v1 (b[idx], &new_attrs_root);
         print_attribute_index (tid, new_attrs_root);
 
-        adios_merge_index_v1 (subindex[tid], new_pg_root, new_vars_root, new_attrs_root); 
+        adios_merge_index_v1 (subindex[tid], new_pg_root, new_vars_root, new_attrs_root, 1); 
 
         adios_posix_close_internal (b[idx]);
         adios_shared_buffer_free (b[idx]);
@@ -546,9 +546,6 @@ void print_variable_index (int tid, struct adios_index_var_struct_v1 * vars_root
                     if (vars_root->type != adios_string)
                         printf ("\tValue(%s)", bp_value_to_string (vars_root->type,
                                     vars_root->characteristics [i].value));
-                    else
-                        printf ("\tValue(\"%s\")", bp_value_to_string (vars_root->type,
-                                    vars_root->characteristics [i].value));
                 }
                 if (vars_root->characteristics [i].dims.count != 0)
                 {
diff --git a/utils/bprecover/CMakeLists.txt b/utils/bprecover/CMakeLists.txt
new file mode 100644
index 0000000..d83abf8
--- /dev/null
+++ b/utils/bprecover/CMakeLists.txt
@@ -0,0 +1,12 @@
+include_directories(${PROJECT_SOURCE_DIR}/src)
+include_directories(${PROJECT_SOURCE_DIR}/src/core)
+include_directories(${PROJECT_SOURCE_DIR}/src/core/transforms)
+include_directories(${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
+include_directories(${PROJECT_SOURCE_DIR}/src/public)
+link_directories(${PROJECT_BINARY_DIR}/src)
+
+add_executable(bprecover bprecover.c)
+target_link_libraries(bprecover adios_internal_nompi ${ADIOSLIB_INT_LDADD})
+set_target_properties(bprecover PROPERTIES COMPILE_FLAGS "${ADIOSLIB_EXTRA_CPPFLAGS} ${ADIOSLIB_INT_CPPFLAGS} ${ADIOSLIB_INT_CFLAGS}")
+
+install(PROGRAMS ${CMAKE_BINARY_DIR}/utils/bprecover/bprecover DESTINATION ${bindir})
diff --git a/utils/bprecover/Makefile.am b/utils/bprecover/Makefile.am
new file mode 100644
index 0000000..a24cc00
--- /dev/null
+++ b/utils/bprecover/Makefile.am
@@ -0,0 +1,17 @@
+AM_CPPFLAGS = $(all_includes)
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core -I$(top_srcdir)/src/core/transforms
+
+AUTOMAKE_OPTIONS = no-dependencies
+
+bin_PROGRAMS = bprecover
+
+bprecover_SOURCES = bprecover.c
+bprecover_CPPFLAGS = $(AM_CPPFLAGS) $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSLIB_INT_CPPFLAGS) $(ADIOSLIB_INT_CFLAGS)
+bprecover_LDFLAGS = $(ADIOSLIB_INT_LDFLAGS)
+bprecover_LDADD = $(top_builddir)/src/libadios_internal_nompi.a
+bprecover_LDADD += $(ADIOSLIB_INT_LDADD)
+
+if USE_PARALLEL_COMPILER
+    CC=$(MPICC)
+    CXX=$(MPICXX)
+endif
diff --git a/utils/bpmeta/Makefile.in b/utils/bprecover/Makefile.in
similarity index 92%
copy from utils/bpmeta/Makefile.in
copy to utils/bprecover/Makefile.in
index d457b7f..adb6acd 100644
--- a/utils/bpmeta/Makefile.in
+++ b/utils/bprecover/Makefile.in
@@ -34,8 +34,8 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-bin_PROGRAMS = bpmeta$(EXEEXT)
-subdir = utils/bpmeta
+bin_PROGRAMS = bprecover$(EXEEXT)
+subdir = utils/bprecover
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/ac_alacrity.m4 \
@@ -84,14 +84,15 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
 PROGRAMS = $(bin_PROGRAMS)
-am_bpmeta_OBJECTS = bpmeta-bpmeta.$(OBJEXT)
-bpmeta_OBJECTS = $(am_bpmeta_OBJECTS)
+am_bprecover_OBJECTS = bprecover-bprecover.$(OBJEXT)
+bprecover_OBJECTS = $(am_bprecover_OBJECTS)
 am__DEPENDENCIES_1 =
-bpmeta_DEPENDENCIES = $(top_builddir)/src/libadios_internal_nompi.a \
+bprecover_DEPENDENCIES =  \
+	$(top_builddir)/src/libadios_internal_nompi.a \
 	$(am__DEPENDENCIES_1)
-bpmeta_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(bpmeta_LDFLAGS) \
-	$(LDFLAGS) -o $@
+bprecover_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(bprecover_LDFLAGS) $(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp =
 am__depfiles_maybe =
@@ -104,8 +105,8 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
-SOURCES = $(bpmeta_SOURCES)
-DIST_SOURCES = $(bpmeta_SOURCES)
+SOURCES = $(bprecover_SOURCES)
+DIST_SOURCES = $(bprecover_SOURCES)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -309,6 +310,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -366,14 +370,15 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public -I$(top_srcdir)/src/core \
 	-I$(top_srcdir)/src/core/transforms
 AUTOMAKE_OPTIONS = no-dependencies
-bpmeta_SOURCES = bpmeta.c
-bpmeta_CPPFLAGS = $(AM_CPPFLAGS) $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSLIB_INT_CPPFLAGS) $(ADIOSLIB_INT_CFLAGS)
-bpmeta_LDFLAGS = $(ADIOSLIB_INT_LDFLAGS)
-bpmeta_LDADD = $(top_builddir)/src/libadios_internal_nompi.a \
+bprecover_SOURCES = bprecover.c
+bprecover_CPPFLAGS = $(AM_CPPFLAGS) $(ADIOSLIB_EXTRA_CPPFLAGS) $(ADIOSLIB_INT_CPPFLAGS) $(ADIOSLIB_INT_CFLAGS)
+bprecover_LDFLAGS = $(ADIOSLIB_INT_LDFLAGS)
+bprecover_LDADD = $(top_builddir)/src/libadios_internal_nompi.a \
 	$(ADIOSLIB_INT_LDADD)
 all: all-am
 
@@ -388,9 +393,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/bpmeta/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/bprecover/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu utils/bpmeta/Makefile
+	  $(AUTOMAKE) --gnu utils/bprecover/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -452,9 +457,9 @@ clean-binPROGRAMS:
 	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
 	echo " rm -f" $$list; \
 	rm -f $$list
-bpmeta$(EXEEXT): $(bpmeta_OBJECTS) $(bpmeta_DEPENDENCIES) 
-	@rm -f bpmeta$(EXEEXT)
-	$(bpmeta_LINK) $(bpmeta_OBJECTS) $(bpmeta_LDADD) $(LIBS)
+bprecover$(EXEEXT): $(bprecover_OBJECTS) $(bprecover_DEPENDENCIES) 
+	@rm -f bprecover$(EXEEXT)
+	$(bprecover_LINK) $(bprecover_OBJECTS) $(bprecover_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -471,11 +476,11 @@ distclean-compile:
 .c.lo:
 	$(LTCOMPILE) -c -o $@ $<
 
-bpmeta-bpmeta.o: bpmeta.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bpmeta_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bpmeta-bpmeta.o `test -f 'bpmeta.c' || echo '$(srcdir)/'`bpmeta.c
+bprecover-bprecover.o: bprecover.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bprecover_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bprecover-bprecover.o `test -f 'bprecover.c' || echo '$(srcdir)/'`bprecover.c
 
-bpmeta-bpmeta.obj: bpmeta.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bpmeta_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bpmeta-bpmeta.obj `if test -f 'bpmeta.c'; then $(CYGPATH_W) 'bpmeta.c'; else $(CYGPATH_W) '$(srcdir)/bpmeta.c'; fi`
+bprecover-bprecover.obj: bprecover.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(bprecover_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bprecover-bprecover.obj `if test -f 'bprecover.c'; then $(CYGPATH_W) 'bprecover.c'; else $(CYGPATH_W) '$(srcdir)/bprecover.c'; fi`
 
 mostlyclean-libtool:
 	-rm -f *.lo
diff --git a/utils/bpdump/bpdump.c b/utils/bprecover/bprecover.c
similarity index 60%
copy from utils/bpdump/bpdump.c
copy to utils/bprecover/bprecover.c
index c896ba7..04e657d 100644
--- a/utils/bpdump/bpdump.c
+++ b/utils/bprecover/bprecover.c
@@ -7,7 +7,11 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
 #include "adios_types.h"
 #include "adios_internals.h"
 #include "adios_transport_hooks.h"
@@ -19,30 +23,13 @@
 
 #define DIVIDER "========================================================\n"
 
-struct dump_struct
-{
-    int do_dump;
-    char * dump_var;
-    enum ADIOS_FLAG host_language_fortran;
-};
-
-struct var_dim
-{
-    uint16_t id;
-    uint64_t rank;
-};
+int do_write_index = 0; // write recovered index at the end, default is no
 
 void print_process_group_header (uint64_t num
                       ,struct adios_process_group_header_struct_v1 * pg_header
                       );
 void print_vars_header (struct adios_vars_header_struct_v1 * vars_header);
 void print_var_header (struct adios_var_header_struct_v1 * var_header);
-void print_var_payload (struct adios_var_header_struct_v1 * var_header
-                       ,struct adios_var_payload_struct_v1 * var_payload
-                       ,struct dump_struct * dump
-                       ,int var_dims_count
-                       ,struct var_dim * var_dims
-                       );
 void print_attrs_header (
                       struct adios_attributes_header_struct_v1 * attrs_header
                       );
@@ -61,135 +48,511 @@ void print_attributes_index
 //const char * value_to_string (enum ADIOS_DATATYPES type, void * data);
 const char * value_to_string_ptr (enum ADIOS_DATATYPES type, void * data, uint64_t element);
 
+int have_subfiles = 0; // global flag indicating if we variables are stored in subfiles (bpdump does not process subfiles)
+
+/* Temporarily store scalar's values to be used to determine
+   an array's dimensions. Indexed by variable id (which is the reference 
+   in the array dimension to the scalar)
+*/
+#define MAX_DIMENSION_INDEX 1024
+uint64_t dim_value[MAX_DIMENSION_INDEX];
+const uint64_t INVALID_DIM = (uint64_t) -1L;
+
+void init_dimensions ()
+{
+    int i;
+    for (i=0; i < MAX_DIMENSION_INDEX; i++) {
+        dim_value[i] = INVALID_DIM;
+    }
+}
+
+/* Store a scalar variable's values temporarily while we process the 
+   dimensions of the arrays in the same PG */
+void store_scalar_dimensions (
+        struct adios_var_header_struct_v1 * var_header,
+        struct adios_var_payload_struct_v1 * var_payload)
+{
+    if (var_header->is_dim == adios_flag_yes)
+    {
+        if (var_header->id < MAX_DIMENSION_INDEX) {
+            uint64_t size = adios_get_type_size (var_header->type, var_payload->payload);
+            uint64_t d = 0L;
+            switch (var_header->type)
+            {
+                case adios_byte:
+                    d = *(signed char *) var_payload->payload;
+                    break;
+                case adios_unsigned_byte:
+                    d = *(unsigned char *) var_payload->payload;
+                    break;
+                case adios_short:
+                    d = *(signed short *) var_payload->payload;
+                    break;
+                case adios_unsigned_short:
+                    d = *(unsigned short *) var_payload->payload;
+                    break;
+                case adios_integer:
+                    d = *(signed int *) var_payload->payload;
+                    break;
+                case adios_unsigned_integer:
+                    d = *(unsigned int *) var_payload->payload;
+                    break;
+                case adios_long:
+                    d = *(signed long long *) var_payload->payload;
+                    break;
+                case adios_unsigned_long:
+                    d = *(unsigned long long *) var_payload->payload;
+                    break;
+
+                default:
+                    printf ("  !!! ERROR !!! The variable %s/%s appears to be used "
+                            "as dimension but it has non-integer type.\n",
+                           var_header->path, var_header->name);
+                    break;
+            }
+            dim_value [var_header->id] = *(unsigned int *) var_payload->payload;
+
+
+        } else {
+            printf ("  !!! ERROR !!! This tool can only handle scalar variables"
+                    " used as dimensions if they appear as the first %d variables. "
+                    "Here we encountered a scalar named %s/%s with id=%d\n",
+                    MAX_DIMENSION_INDEX, var_header->path, var_header->name, var_header->id);
+        }
+    }
+}
+
+/* Return the actual dimension/offset value.
+   If it points to a scalar variable, get its value.
+   If it's time return the value provided by the caller 
+     (should be 1 for a dimension, 0 for an offset)
+ */
+uint64_t get_dimension (struct adios_dimension_item_struct_v1 * d, int return_for_time)
+{
+    int id = d->var_id; 
+    uint64_t dim = 0L;
+    if (id == 0)
+    {
+        if (d->is_time_index == adios_flag_yes)
+        {
+            dim = return_for_time;
+        }
+        else
+        {
+            dim = d->rank;
+        }
+    } 
+    else 
+    {
+        if (id < 0 || id > MAX_DIMENSION_INDEX) 
+        {
+            printf ("  !!! ERROR !!! Reference to dimension of variable id %d cannot be handled."
+                    " We only store scalar variables up to id %d\n",
+                    id, MAX_DIMENSION_INDEX);
+            dim = INVALID_DIM;
+        }
+        else if (dim_value[id] == INVALID_DIM) 
+        {
+            printf ("  !!! ERROR !!! Reference to dimension of variable id %d but "
+                    " we haven't stored this scalar variable. Result is invalid dimension\n",
+                    id, MAX_DIMENSION_INDEX);
+            dim = INVALID_DIM;
+        }
+        else 
+        {
+            dim = dim_value[id];
+        }
+    }
+    return dim;
+}
+
+
+int MAX_GROUP_NAME_LENGTH = 64; // could be 65535 but who does that??? 
+
+/* print char with printable char or its \xxx code
+   return 1 if its ASCII 32..126, usable for names in ADIOS
+*/
+int print_namechar (char c)
+{
+    if (32 <= c && c <= 126) {
+        // SPACE, symbols, alphanumeric
+        printf ("%c",c);
+        return 1;
+    } else {
+        printf (" \\%3.3hhu", c);
+        return 0;
+    }
+}
+
+int looks_like_PG (const char * buf, int blen)
+{
+    printf ("  Check if it looks like a PG...\n");
+    int offset = 8; // skip now the PG size
+
+    // host_language_fortran flag, single char
+    char fort = buf[offset]; 
+    offset += 1;
+    printf ("       Fortran flag char should be 'y' or 'n': '");
+    print_namechar (fort);
+    printf ("'\n");
+    if (fort != 'y' && fort != 'n')
+        return 0; 
+
+    // group name length, 16 bit
+    uint16_t namelen =  *(uint16_t *) (buf + offset);
+    offset += 2;
+    printf ("       Group name length expected to be less than %d characters: %hu\n", 
+            MAX_GROUP_NAME_LENGTH, namelen);
+    if (namelen > MAX_GROUP_NAME_LENGTH)
+        return 0;
+
+    char gname[MAX_GROUP_NAME_LENGTH];
+    memcpy (gname, buf+offset, namelen);
+    offset += namelen;
+
+    int i;
+    int validname = 1;
+    printf ("       Group name: \"");
+    for (i = 0; i < namelen; i++)
+    {
+        validname &= print_namechar(gname[i]);
+    }
+    printf ("\"\n");
+
+    if (!validname) {
+        printf ("       Group name contains characters that are invalid for a name\n");
+        return 0;
+    }
+
+    return 1;
+}
+
+/* Look for a PG at a given offset. If it looks like a PG, 
+   return 1 and also return the reported PG size.
+   pgsize_reported is changed only when returning 1.
+*/
+int find_pg (int fd, uint64_t offset, uint64_t file_size, uint64_t * pgsize_reported) 
+{
+
+    const int N_READ_AHEAD = 1024;
+    char buf[N_READ_AHEAD]; // temporary buffer to read data in and parse for info
+
+    printf ("Look for a Process Group (PG) at offset %llu\n", offset);
+    lseek (fd, offset, SEEK_SET);
+    // read a few bytes in
+    errno = 0;
+    int blen = read (fd, buf, N_READ_AHEAD);
+
+    if (blen < 8) {
+        printf ("  === Could not read even 8 bytes. Finish PG reading\n");
+        if (errno) {
+            printf ("  Error when reading: %s\n", strerror(errno));
+        }
+        return 0;
+    }
+
+    uint64_t pgsize;
+    pgsize = *(uint64_t*) buf;  // first 8 bytes is size of PG
+    printf ("  PG reported size: %llu\n", pgsize);
+
+    if (pgsize < 28) {
+        printf ("   === PG reported size is too small. This is not a (good) PG.\n");
+        return 0;
+    }
+
+    if (pgsize + offset > file_size + 1024*1024*1024 /* a GB index??? */ ) {
+        printf ("   === Offset + PG reported size >> file size. This is not a (good) PG.\n");
+        return 0;
+    }
+
+    if (!looks_like_PG (buf, blen)) {
+        return 0;
+    }
+
+    // All tests passed, it seems to be a PG
+    *pgsize_reported = pgsize;
+    return 1;
+}
+
+
+void add_pg_to_index (
+        struct adios_index_struct_v1 *  index, 
+        struct adios_process_group_header_struct_v1 * pg_header, 
+        uint64_t curr_offset)
+{
+    /* similar to code from adios_internals.c:adios_build_index_v1() */
+    struct adios_index_process_group_struct_v1 * g_item;
+    g_item = (struct adios_index_process_group_struct_v1 *)
+        malloc (sizeof (struct adios_index_process_group_struct_v1));
+    g_item->group_name = strdup (pg_header->name);
+    g_item->adios_host_language_fortran = pg_header->host_language_fortran;
+
+    /* FIXME: process id (rank) is only recorded in the index, but not in the PG header.
+       This should be the original MPI rank of the writer. */
+    g_item->process_id = 0; 
+
+    g_item->time_index_name = strdup (pg_header->time_index_name);
+    g_item->time_index = pg_header->time_index;
+    g_item->offset_in_file = curr_offset;
+    g_item->next = 0;
+
+    // add to the groups
+    index_append_process_group_v1 (index, g_item);
+}
+
+
+/* Get the dimensions of the variable and add it to the index.
+   This is complicated because of references to other variables */
+void process_dimensions (
+        struct adios_var_header_struct_v1 * var_header,
+        struct adios_index_var_struct_v1 * v_index
+        )
+{
+    // Get number of dimensions first
+    struct adios_dimension_struct_v1 * d = var_header->dims;
+    v_index->characteristics [0].dims.count = 0;
+    while (d)
+    {
+        v_index->characteristics [0].dims.count++;
+        d = d->next;
+    }
+
+    if (v_index->characteristics [0].dims.count)
+    {
+        // (local, global, local offset)
+        v_index->characteristics [0].dims.dims = malloc
+            (3 * 8 * v_index->characteristics [0].dims.count);
+
+        int j;
+        d = var_header->dims;
+        for (j = 0; j < v_index->characteristics [0].dims.count; j++)
+        {
+            v_index->characteristics [0].dims.dims [j * 3 + 0] =
+                get_dimension (&d->dimension, 1);
+            v_index->characteristics [0].dims.dims [j * 3 + 1] =
+                get_dimension (&d->global_dimension, 0);
+            v_index->characteristics [0].dims.dims [j * 3 + 2] =
+                get_dimension (&d->local_offset, 0);
+
+            d = d->next;
+        }
+    } 
+    else
+    {
+        v_index->characteristics [0].dims.dims = NULL;
+    }
+}
+
+void add_var_to_index (
+        struct adios_index_struct_v1 *  index, 
+        struct adios_process_group_header_struct_v1 * pg_header, 
+        struct adios_var_header_struct_v1 * var_header,
+        struct adios_var_payload_struct_v1 * var_payload)
+{
+
+    /* similar to code from adios_internals.c:adios_build_index_v1() */
+    struct adios_index_var_struct_v1 * v_index;
+    v_index = malloc (sizeof (struct adios_index_var_struct_v1));
+    v_index->characteristics = malloc (
+            sizeof (struct adios_index_characteristic_struct_v1)
+            );
+
+    v_index->id = var_header->id;
+    v_index->group_name = strdup (pg_header->name);
+    v_index->var_name = (var_header->name ? strdup (var_header->name) : 0L);
+    v_index->var_path = (var_header->path ? strdup (var_header->path) : 0L);
+    v_index->type = var_header->type;
+
+    v_index->characteristics_count = 1;
+    v_index->characteristics_allocated = 1;
+    v_index->characteristics [0].offset = var_header->characteristics.offset;
+    v_index->characteristics [0].payload_offset = var_header->characteristics.payload_offset;
+
+    v_index->characteristics [0].file_index = -1; // It works only with single BP files
+    v_index->characteristics [0].time_index = pg_header->time_index;
+
+    v_index->characteristics [0].value = 0;
+
+    /* Determine the dimensions from actual values or references of scalars */
+    process_dimensions (var_header, v_index);
+
+
+    // NCSU - Initializing stat related info in index
+    v_index->characteristics [0].bitmap = 0;
+    v_index->characteristics [0].stats = 0;
+
+    memcpy (&v_index->characteristics[0].transform,
+            &var_header->characteristics.transform,
+            sizeof (struct adios_index_characteristic_transform_struct));
+
+    // Save scalar's value
+    if (var_payload->payload)
+    {
+        uint64_t size = adios_get_type_size (var_header->type, var_payload->payload);
+        if (var_header->type == adios_string) {
+            v_index->characteristics [0].value = malloc (size + 1);
+            memcpy (v_index->characteristics [0].value, var_payload->payload, size);
+            ((char *) (v_index->characteristics [0].value)) [size] = 0;
+        } else {
+            v_index->characteristics [0].value = malloc (size);
+            memcpy (v_index->characteristics [0].value, var_payload->payload, size);
+        }
+    }
+
+    /* FIXME: Missing statistics and transformation statistics */
+
+    v_index->next = 0;
+
+    // this fn will either take ownership for free
+    //printf ("  add index var %s/%s\n", v_index->var_path, v_index->var_name);
+    index_append_var_v1 (index, v_index, 1);
+}
+
+void write_index (int fd, uint64_t file_offset, struct adios_index_struct_v1 *  index)
+{
+    char * buffer = NULL;
+    uint64_t buffer_size = 0L;
+    uint64_t buffer_offset = 0L;
+    adios_write_index_v1 (&buffer, &buffer_size, &buffer_offset, file_offset, index);
+    adios_write_version_v1 (&buffer, &buffer_size, &buffer_offset);
+    printf ("Index metadata size is %llu bytes\n", buffer_offset);
+    if  (do_write_index) 
+    {
+        printf ("Ready to write index to file offset %llu. Size is %llu bytes\n",
+                file_offset, buffer_offset);
+        lseek (fd, file_offset, SEEK_SET);
+        ssize_t s = write (fd, buffer, buffer_offset);
+        if (s != buffer_offset) {
+            printf ("ERROR: Only wrote %llu bytes of index data instead of the attempted %llu bytes\n",
+                    (unsigned long long)s, buffer_offset);
+        } else {
+            printf ("Wrote index to file offset %llu. Size is %llu bytes\n", file_offset, buffer_offset);
+        }
+        printf ("Truncate file to size %llu\n", file_offset+s);
+        ftruncate (fd, file_offset+s);
+    }
+    else 
+    {
+        printf ("To actually recover the file by rewriting the index, use -f option.\n"
+                "Final file will be truncted to %llu bytes\n", file_offset+buffer_offset);
+    }
+}
+
+void print_usage (int argc, char ** argv)
+{
+    printf ("Usage: %s [-f | --force] <filename>\n"
+            "  -f:  do write the recovered index to the end of file\n",
+            argv [0]); 
+    printf (
+"This recovery tool parses the data blocks in the file, reconstructs the "
+"index metadata and writes it to the end. It is useful only if the original "
+"index is damaged somehow. It only works with a single BP file. Subfiles are "
+"not handled. Also, the tool is very limited. It does not work if the file "
+"has variables with transformations (compression). It does not recover attributes "
+"nor statistics. It does not recover the file beyond the first data corruption in "
+"the middle. So use it with care, copy the corrupted file before "
+"using this tool. Without -f option, you can test if the processing goes well "
+"without changing the file.\n"
+    );
+}
+
 int main (int argc, char ** argv)
 {
     char * filename;
     int rc = 0;
-    struct dump_struct dump;
 
-    if (argc < 2 || argc > 4)
+    if (argc < 2 || argc > 3)
     {
-        fprintf (stderr, "usage: %s [-d [var]|--dump [var]] <filename>\n"
-                ,argv [0]
-                );
-
+        print_usage (argc, argv);
         return -1;
     }
 
     if (argv [1][0] && argv [1][0] == '-')
     {
-        if (   !strcmp (argv [1], "-d")
-            || !strcmp (argv [1], "--dump")
+        if (   !strcmp (argv [1], "-f")
+            || !strcmp (argv [1], "--force")
            )
         {
-            dump.do_dump = 1;
-            if (argc > 3)
-            {
-                dump.dump_var = argv [2];
-                filename = argv [3];
-                printf("%s %s\n",dump.dump_var,filename);
-            }
-            else
-            {
-                dump.dump_var = 0;
-                filename = argv [2];
-                printf("ALLVARS %s\n",filename);
-            }
+            do_write_index = 1;
+            filename = argv [2];
         }
         else
         {
-            fprintf (stderr, "usage: %s [-d [var]|--dump [var]] <filename>\n"
-                    ,argv [0]
-                    );
-
+            print_usage (argc, argv);
             return -1;
         }
     }
     else
     {
         filename = argv [1];
-        dump.do_dump = 0;
-        dump.dump_var = 0;
+        do_write_index = 0;
     }
 
+    have_subfiles = 0;
     struct adios_bp_buffer_struct_v1 * b = 0;
     uint32_t version = 0;
 
     b = malloc (sizeof (struct adios_bp_buffer_struct_v1));
     adios_buffer_struct_init (b);
 
-    rc = adios_posix_open_read_internal (filename, "", b);
-    if (!rc)
-    {
-        fprintf (stderr, "bpdump: file not found: %s\n", filename);
+    int flags = O_RDONLY;
+    if (do_write_index)
+        flags = O_RDWR;
 
+    int fd = open (filename, flags);
+    if (fd < 0) {
+        fprintf (stderr, "recover: cannot open file %s\n", filename);
+        if (errno)
+            fprintf (stderr, "%s\n", strerror(errno));
         return -1;
     }
 
-    adios_posix_read_version (b);
-    adios_parse_version (b, &version);
-    version = version & ADIOS_VERSION_NUM_MASK;
-    printf ("BP format version: %d\n", version);
-    if (version < 2)
-    {
-        fprintf (stderr, "bpdump: This version of bpdump can only dump BP format version 2. "
-                 "Use an older bpdump from adios 1.6 to dump this file.\n");
-        adios_posix_close_internal (b);
-        return -1;
-    }
+    struct stat statbuf; 
+    fstat (fd, &statbuf);
+    uint64_t file_size = statbuf.st_size;
+
+    b->f = fd; 
+
+    printf ("File size in bytes: %llu\n", file_size);
 
-    struct adios_index_process_group_struct_v1 * pg_root = 0;
+    /* Variables to build new index */
+    struct adios_index_struct_v1 * index = adios_alloc_index_v1(1);
+    //struct adios_index_process_group_struct_v1 * pg_root = 0;
     struct adios_index_process_group_struct_v1 * pg = 0;
-    struct adios_index_var_struct_v1 * vars_root = 0;
-    struct adios_index_attribute_struct_v1 * attrs_root = 0;
+    //struct adios_index_var_struct_v1 * vars_root = 0;
+    //struct adios_index_attribute_struct_v1 * attrs_root = 0;
 
-    printf (DIVIDER);
-    printf ("Process Groups Index:\n");
-    adios_posix_read_index_offsets (b);
-    adios_parse_index_offsets_v1 (b);
-
-    /*
-    printf ("End of process groups       = %llu\n", b->end_of_pgs);
-    printf ("Process Groups Index Offset = %llu\n", b->pg_index_offset);
-    printf ("Process Groups Index Size   = %llu\n", b->pg_size);
-    printf ("Variable Index Offset       = %llu\n", b->vars_index_offset);
-    printf ("Variable Index Size         = %llu\n", b->vars_size);
-    printf ("Attribute Index Offset      = %llu\n", b->attrs_index_offset);
-    printf ("Attribute Index Size        = %llu\n", b->attrs_size);
-    */
-
-    adios_posix_read_process_group_index (b);
-    adios_parse_process_group_index_v1 (b, &pg_root);
-    print_process_group_index (pg_root);
 
-    printf (DIVIDER);
-    printf ("Vars Index:\n");
-    adios_posix_read_vars_index (b);
-    adios_parse_vars_index_v1 (b, &vars_root, NULL, NULL);
-    print_vars_index (vars_root);
+    uint64_t pg_num = 0L;
+    uint64_t curr_offset = 0L;
+    uint64_t new_offset = 0L;
+    uint64_t pgsize_reported; // size of current pg (as indicated in PG header (wrongly))
+    uint64_t pgsize_actual; // size of current pg based on processing (accurate)
+    int found_pg = 0;
 
     printf (DIVIDER);
-    printf ("Attributes Index:\n");
-    adios_posix_read_attributes_index (b);
-    adios_parse_attributes_index_v1 (b, &attrs_root);
-    print_attributes_index (attrs_root);
+    found_pg = find_pg (fd, new_offset, file_size, &pgsize_reported);
 
-    if (version & ADIOS_VERSION_HAVE_SUBFILE)
+    // pass over the PGs from beginning of file
+    while (found_pg)
     {
-        printf (DIVIDER);
-        return 0;
-    }
+        curr_offset = new_offset;
+        pg_num++;
+        printf ("PG %llu found at offset %llu\n", pg_num, curr_offset);
 
 
-    uint64_t element_num = 1;
-    pg = pg_root;
-    while (pg)
-    {
-        int var_dims_count = 0;
-        struct var_dim * var_dims = 0;
+        /* Let's process the group */
+        /* Allocate PG index struct here to allow to be used below */
+        pg = (struct adios_index_process_group_struct_v1 *)
+                malloc (sizeof(struct adios_index_process_group_struct_v1));
 
-        printf (DIVIDER);
+        // setup where to read the process group from (and size)
+        pg->offset_in_file = curr_offset;
+        //b->read_pg_offset = pg->offset_in_file;
+        b->read_pg_offset = curr_offset;
+        b->read_pg_size = pgsize_reported;
 
+        /* Temporary variables for parsing one PG */
         struct adios_process_group_header_struct_v1 pg_header;
         struct adios_vars_header_struct_v1 vars_header;
         struct adios_attributes_header_struct_v1 attrs_header;
@@ -198,28 +561,18 @@ int main (int argc, char ** argv)
         struct adios_var_payload_struct_v1 var_payload;
         struct adios_attribute_struct_v1 attribute;
 
-        // setup where to read the process group from (and size)
-        b->read_pg_offset = pg->offset_in_file;
-        if (pg->next)
-        {
-            b->read_pg_size =   pg->next->offset_in_file
-                              - pg->offset_in_file;
-        }
-        else
-        {
-            b->read_pg_size =   b->pg_index_offset
-                              - pg->offset_in_file;
-        }
+        init_dimensions ();  // store scalar values from this PG temporarily
 
+        /* Read the whole PG into a buffer and start parsing */
         adios_posix_read_process_group (b);
         adios_parse_process_group_header_v1 (b, &pg_header);
-        print_process_group_header (element_num++, &pg_header);
-        //printf ("\tSize of group in fil: %llu bytes\n",  b->read_pg_size);
+        print_process_group_header (pg_num, &pg_header);
+
+        add_pg_to_index (index, &pg_header, curr_offset);
 
         adios_parse_vars_header_v1 (b, &vars_header);
         print_vars_header (&vars_header);
 
-        dump.host_language_fortran = pg_header.host_language_fortran;
         int i;
         for (i = 0; i < vars_header.count; i++)
         {
@@ -228,14 +581,9 @@ int main (int argc, char ** argv)
             adios_parse_var_data_header_v1 (b, &var_header);
             print_var_header (&var_header);
 
-            if ( var_header.dims == 0 || 
-                 ( dump.do_dump &&
-                   dump.dump_var &&
-                   !strcasecmp (dump.dump_var, var_header.name)
-                 )
-               )
+            if ( var_header.dims == 0)
             {
-                // add one for string null terminators
+                // Load scalars to save them for handling as dimension values
                 var_payload.payload = malloc (var_header.payload_size + 1);
                 adios_parse_var_data_payload_v1 (b, &var_header, &var_payload
                                                 ,var_header.payload_size
@@ -243,34 +591,20 @@ int main (int argc, char ** argv)
             }
             else
             {
+                // Just parse to move the offset in buffer, don't read data
                 adios_parse_var_data_payload_v1 (b, &var_header, NULL, 0);
             }
 
-            if (var_header.is_dim == adios_flag_yes)
-            {
-                var_dims = realloc (var_dims,   (var_dims_count + 1)
-                                              * sizeof (struct var_dim)
-                                   );
-
-                var_dims [var_dims_count].id = var_header.id;
-                var_dims [var_dims_count].rank = *(unsigned int *)
-                                                        var_payload.payload;
-                var_dims_count++;
-            }
+            store_scalar_dimensions (&var_header, &var_payload);
+            add_var_to_index (index, &pg_header, &var_header, &var_payload);
 
-            if (dump.do_dump)
-            {
-                // make sure the buffer is big enough or send in null
-                print_var_payload (&var_header, &var_payload, &dump
-                                  ,var_dims_count, var_dims
-                                  );
-            }
             if (var_payload.payload)
             {
                 free (var_payload.payload);
                 var_payload.payload = 0;
             }
-            printf ("\n");
+            //printf ("\n");
+
         }
 
         adios_parse_attributes_header_v1 (b, &attrs_header);
@@ -279,96 +613,45 @@ int main (int argc, char ** argv)
         for (i = 0; i < attrs_header.count; i++)
         {
             adios_parse_attribute_v1 (b, &attribute);
-            print_attribute (&attribute);
-            printf ("\n");
+            //print_attribute (&attribute);
+            //printf ("\n");
         }
 
-        var_dims_count = 0;
-        if (var_dims)
-            free (var_dims);
+        pgsize_actual = b->offset;
+        printf ("Actual size of group by processing: %llu bytes\n", pgsize_actual);
+
         pg = pg->next;
+        
+
+        printf (DIVIDER);
+        found_pg = 0;
+        if (curr_offset + pgsize_actual < file_size) 
+        {
+            new_offset =  curr_offset + pgsize_actual;
+            found_pg = find_pg (fd, curr_offset+pgsize_actual, file_size, &pgsize_reported);
+        }
+        if (!found_pg && 
+            pgsize_actual != pgsize_reported &&
+            curr_offset + pgsize_reported < file_size) 
+        {
+            new_offset =  curr_offset + pgsize_reported;
+            found_pg = find_pg (fd, curr_offset+pgsize_reported, file_size, &pgsize_reported);
+        }
     }
+
+    // The end of the last successfully processed PG
+    // This will be the start of the index data
+    curr_offset += pgsize_actual;
+
     printf (DIVIDER);
-    printf ("End of %s\n", filename);
+    printf ("Found %llu PGs to be processable\n", pg_num);
 
-    adios_posix_close_internal (b);
+    write_index (fd, curr_offset, index);
+    adios_posix_close_internal (b); // will close fd
 
     return 0;
 }
 
-/* In src/bp_utils.c
-const char * value_to_string (enum ADIOS_DATATYPES type, void * data)
-{
-    static char s [100];
-    s [0] = 0;
-
-
-    switch (type)
-    {
-        case adios_unsigned_byte:
-            sprintf (s, "%u", *(((uint8_t *) data)));
-            break;
-
-        case adios_byte:
-            sprintf (s, "%d", *(((int8_t *) data)));
-            break;
-
-        case adios_short:
-            sprintf (s, "%hd", *(((int16_t *) data)));
-            break;
-
-        case adios_unsigned_short:
-            sprintf (s, "%uh", *(((uint16_t *) data)));
-            break;
-
-        case adios_integer:
-            sprintf (s, "%d", *(((int32_t *) data)));
-            break;
-
-        case adios_unsigned_integer:
-            sprintf (s, "%u", *(((uint32_t *) data)));
-            break;
-
-        case adios_long:
-            sprintf (s, "%lld", *(((int64_t *) data)));
-            break;
-
-        case adios_unsigned_long:
-            sprintf (s, "%llu", *(((uint64_t *) data)));
-            break;
-
-        case adios_real:
-            sprintf (s, "%f", *(((float *) data)));
-            break;
-
-        case adios_double:
-            sprintf (s, "%le", *(((double *) data)));
-            break;
-
-        case adios_long_double:
-            sprintf (s, "%Le", *(((long double *) data)));
-            break;
-
-        case adios_string:
-            sprintf (s, "%s", ((char *) data));
-            break;
-
-        case adios_complex:
-            sprintf (s, "(%f %f)", *(((float *) data) + 0)
-                                 , *(((float *) data) + 1)
-                    );
-            break;
-
-        case adios_double_complex:
-            sprintf (s, "(%lf %lf)", *(((double *) data) + 0)
-                                   , *(((double *) data) + 1)
-                    );
-            break;
-    }
-
-    return s;
-}
-*/
 
 const char * value_to_string_ptr (enum ADIOS_DATATYPES type, void * data, uint64_t element)
 {
@@ -494,7 +777,7 @@ void print_process_group_header (uint64_t num
 {
     struct adios_method_info_struct_v1 * m;
 
-    printf ("Process Group: %llu\n", num);
+    //printf ("Process Group: %llu\n", num);
     printf ("\tGroup Name: %s\n", pg_header->name);
     printf ("\tHost Language Fortran?: %c\n"
            ,(pg_header->host_language_fortran == adios_flag_yes ? 'Y' : 'N')
@@ -547,6 +830,7 @@ void print_var_header (struct adios_var_header_struct_v1 * var_header)
     int i = 0;
 
     printf ("\t\tVar Name (ID): %s (%d)\n", var_header->name, var_header->id);
+    return;
     printf ("\t\tVar Path: %s\n", var_header->path);
     printf ("\t\tDatatype: %s\n", adios_type_to_string_int (var_header->type));
     printf ("\t\tIs Dimension: %c\n"
@@ -561,7 +845,7 @@ void print_var_header (struct adios_var_header_struct_v1 * var_header)
             printf ("\t\t\tDim %d l:g:o: ", i++);
             if (d->dimension.var_id == 0)
             {
-                if (d->dimension.time_index == adios_flag_yes)
+                if (d->dimension.is_time_index == adios_flag_yes)
                 {
                     printf ("TIME");
                 }
@@ -581,7 +865,7 @@ void print_var_header (struct adios_var_header_struct_v1 * var_header)
             {
                 if (d->global_dimension.var_id == 0)
                 {
-                    if (d->global_dimension.time_index == adios_flag_yes)
+                    if (d->global_dimension.is_time_index == adios_flag_yes)
                     {
                         printf (":TIME");
                     }
@@ -596,7 +880,7 @@ void print_var_header (struct adios_var_header_struct_v1 * var_header)
                 }
                 if (d->local_offset.var_id == 0)
                 {
-                    if (d->local_offset.time_index == adios_flag_yes)
+                    if (d->local_offset.is_time_index == adios_flag_yes)
                     {
                         printf (":TIME");
                     }
@@ -847,119 +1131,6 @@ int dims_not_max (uint64_t * position, uint64_t * dims, int ranks)
     return 0;
 }
 
-void print_var_payload (struct adios_var_header_struct_v1 * var_header
-                       ,struct adios_var_payload_struct_v1 * var_payload
-                       ,struct dump_struct * dump
-                       ,int var_dims_count
-                       ,struct var_dim * var_dims
-                       )
-{
-    if (   dump->do_dump
-    	&& dump->dump_var
-        && var_header->dims
-        && !strcasecmp (dump->dump_var, var_header->name)
-       )
-    {
-        if (var_header->dims)
-        {
-            uint64_t element = 0;
-            int ranks = 0;
-            struct adios_dimension_struct_v1 * d = var_header->dims;
-            int c = 0;
-            uint64_t * position = 0;
-            uint64_t * dims = 0;
-            int i = 0;
-
-            while (d)
-            {
-                ranks++;
-                d = d->next;
-            }
-
-            position = (uint64_t *) malloc (8 * ranks);
-            memset (position, 0, 8 * ranks);
-            dims = (uint64_t *) malloc (8 * ranks);
-            memset (dims, 0, 8 * ranks);
-
-            d = var_header->dims;
-            uint64_t * dims_t = dims;
-
-            while (d)
-            {
-                if (d->dimension.var_id != 0)
-                {
-                    for (i = 0; i < var_dims_count; i++)
-                    {
-                        if (var_dims [i].id == d->dimension.var_id)
-                        {
-                            *dims_t = var_dims [i].rank;
-                        }
-                    }
-                }
-                else
-                {
-                    if (d->dimension.time_index == adios_flag_yes)
-                    {
-                        *dims_t = 1;
-                    }
-                    else
-                    {
-                        *dims_t = d->dimension.rank;
-                    }
-                }
-
-                d = d->next;
-                dims_t++;
-            }
-
-            while (dims_not_max (position, dims, ranks))
-            {
-                increment_dimension (dump->host_language_fortran
-                                    ,element
-                                    ,ranks
-                                    ,dims
-                                    ,position
-                                    );
-                if (c > 65)
-                {
-                    printf ("\n");
-                    c = 0;
-                }
-
-                c += printf ("[");
-                for (i = 0; i < ranks; i++)
-                {
-                    if (i > 0)
-                        c += printf (",%llu", position [i]);
-                    else
-                        c += printf ("%llu", position [i]);
-                }
-                c += printf ("] ");
-                c += printf ("%s ", value_to_string_ptr (var_header->type
-                                                 ,var_payload->payload, element
-                                                 )
-                       );
-
-                element++;
-            }
-            printf ("\n");
-
-            if (position)
-                free (position);
-            if (dims)
-                free (dims);
-            position = 0;
-            dims = 0;
-        }
-    }
-    if (!var_header->dims)
-    {
-        if (var_header->type != adios_string) 
-            printf ("\t\t\tValue: %s\n", bp_value_to_string (var_header->type ,var_payload->payload));
-        else
-            printf ("\t\t\tValue: \"%s\"\n", bp_value_to_string (var_header->type ,var_payload->payload));
-    }
-}
 
 void print_attrs_header (
                       struct adios_attributes_header_struct_v1 * attrs_header
@@ -970,9 +1141,11 @@ void print_attrs_header (
 
 void print_attribute (struct adios_attribute_struct_v1 * attribute)
 {
+    int i;
     printf ("\t\tAttribute Name (ID): %s (%d)\n"
            ,attribute->name, attribute->id
            );
+    return;
     printf ("\t\tAttribute Path: %s\n", attribute->path);
     if (attribute->is_var == adios_flag_yes)
     {
@@ -981,10 +1154,20 @@ void print_attribute (struct adios_attribute_struct_v1 * attribute)
     else
     {
         printf ("\t\tDatatype: %s\n", adios_type_to_string_int (attribute->type));
-        printf ("\t\tValue: %s\n", bp_value_to_string (attribute->type
-                                                   ,attribute->value
-                                                   )
-               );
+        printf ("\t\t# of elements:   %d\n", attribute->nelems);
+        printf ("\t\tLength in bytes: %d\n", attribute->length);
+        char * p = (char *) attribute->value;
+        int elemsize = (int) adios_get_type_size (attribute->type, attribute->value);
+        if (attribute->nelems == 1) {
+            printf ("\t\tValue: %s\n", bp_value_to_string (attribute->type ,attribute->value));
+        } else {
+            printf ("\t\tValues: %s", bp_value_to_string (attribute->type, p));
+            for (i=1; i<attribute->nelems; i++) {
+                p += elemsize;
+                printf (", %s", bp_value_to_string (attribute->type, p));
+            }
+            printf ("\n");
+        }
     }
 }
 
@@ -1034,6 +1217,10 @@ void print_vars_index (struct adios_index_var_struct_v1 * vars_root)
             printf ("\tFile Index(%d)", vars_root->characteristics [i].file_index);
             printf ("\tTime Index(%d)", vars_root->characteristics [i].time_index);
 
+            if (vars_root->characteristics [i].file_index != (uint32_t)-1) { 
+                have_subfiles = 1;
+            }
+
     		/* NCSU - Print min, max */
 			if (vars_root->type == adios_complex || vars_root->type == adios_double_complex)
 			{
@@ -1233,10 +1420,19 @@ void print_attributes_index
 
             if (attrs_root->characteristics [i].value)
             {
-                printf ("\t\tValue(%s)", bp_value_to_string (attrs_root->type
-                                        ,attrs_root->characteristics [i].value
-                                        )
-                       );
+                if (attrs_root->nelems == 1) {
+                    printf ("\t\tValue(%s)", bp_value_to_string (attrs_root->type, attrs_root->characteristics [i].value));
+                } else {
+                    char * p = (char *) attrs_root->characteristics [i].value;
+                    int elemsize = (int) adios_get_type_size (attrs_root->type, p);
+                    int k;
+                    printf ("\t\tValues(%s", bp_value_to_string (attrs_root->type, p));
+                    for (k=1; k<attrs_root->nelems; k++) {
+                        p += elemsize;
+                        printf (", %s", bp_value_to_string (attrs_root->type, p));
+                    }
+                    printf (")\n");
+                }
             }
             if (attrs_root->characteristics [i].var_id)
             {
diff --git a/utils/bpsplit/CMakeLists.txt b/utils/bpsplit/CMakeLists.txt
index 6c28575..93235a9 100644
--- a/utils/bpsplit/CMakeLists.txt
+++ b/utils/bpsplit/CMakeLists.txt
@@ -2,7 +2,7 @@ include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/utils/bpsplit)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/utils/bpsplit)
 
 add_executable(bpsplit bpsplit.c)
diff --git a/utils/bpsplit/Makefile.am b/utils/bpsplit/Makefile.am
index daf1680..093e8b6 100644
--- a/utils/bpsplit/Makefile.am
+++ b/utils/bpsplit/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/bpsplit/Makefile.in b/utils/bpsplit/Makefile.in
index 899cd15..890b0b2 100644
--- a/utils/bpsplit/Makefile.in
+++ b/utils/bpsplit/Makefile.in
@@ -325,6 +325,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -382,7 +385,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 AUTOMAKE_OPTIONS = no-dependencies
 bpsplit_SOURCES = bpsplit.c
diff --git a/utils/bpsplit/bpappend.c b/utils/bpsplit/bpappend.c
index c3b7f99..714fcf3 100644
--- a/utils/bpsplit/bpappend.c
+++ b/utils/bpsplit/bpappend.c
@@ -199,7 +199,7 @@ int read_indexes(char *filename, bool input) {
     adios_posix_read_index_offsets (bp);
     adios_parse_index_offsets_v1 (bp);
     adios_posix_read_process_group_index (bp);
-    adios_parse_process_group_index_v1 (bp, &pg_root);
+    adios_parse_process_group_index_v1 (bp, &pg_root, NULL);
     
     // read and parse variable index
     adios_posix_read_vars_index (bp);
@@ -508,7 +508,7 @@ int append_in_to_out( const char *fileout, const char *filein) {
 
     // merge in old indicies
     adios_merge_index_v1 (idx,
-                          in_pg_root, in_vars_root, in_attrs_root);
+                          in_pg_root, in_vars_root, in_attrs_root, 0);
     adios_write_index_v1 (&buffer, &buffer_size, &buffer_offset, index_start, 
                           idx);
     if (verbose>1) printf("  index size %llu 0x%llx\n", buffer_offset, buffer_offset);
diff --git a/utils/bpsplit/bpgettime.c b/utils/bpsplit/bpgettime.c
index 9594a1c..2c7074d 100644
--- a/utils/bpsplit/bpgettime.c
+++ b/utils/bpsplit/bpgettime.c
@@ -175,7 +175,7 @@ int bpgettime(char *filename) {
     adios_posix_read_index_offsets (in_bp);
     adios_parse_index_offsets_v1 (in_bp);
     adios_posix_read_process_group_index (in_bp);
-    adios_parse_process_group_index_v1 (in_bp, &in_pg_root);
+    adios_parse_process_group_index_v1 (in_bp, &in_pg_root, NULL);
 
     // close file
     adios_posix_close_internal (in_bp);
diff --git a/utils/bpsplit/bpsplit.c b/utils/bpsplit/bpsplit.c
index 92bc4c6..9ca6e4c 100644
--- a/utils/bpsplit/bpsplit.c
+++ b/utils/bpsplit/bpsplit.c
@@ -243,7 +243,7 @@ int read_indexes(char *filename) {
     adios_posix_read_index_offsets (in_bp);
     adios_parse_index_offsets_v1 (in_bp);
     adios_posix_read_process_group_index (in_bp);
-    adios_parse_process_group_index_v1 (in_bp, &in_pg_root);
+    adios_parse_process_group_index_v1 (in_bp, &in_pg_root, NULL);
     
     // read and parse variable index
     adios_posix_read_vars_index (in_bp);
diff --git a/utils/fastbit/CMakeLists.txt b/utils/fastbit/CMakeLists.txt
index b9f9d38..7794bbc 100644
--- a/utils/fastbit/CMakeLists.txt
+++ b/utils/fastbit/CMakeLists.txt
@@ -1,7 +1,7 @@
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
 include_directories(${PROJECT_SOURCE_DIR}/src/core/transforms)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 
diff --git a/utils/fastbit/Makefile.am b/utils/fastbit/Makefile.am
index b97cb13..287071f 100644
--- a/utils/fastbit/Makefile.am
+++ b/utils/fastbit/Makefile.am
@@ -2,7 +2,7 @@ AUTOMAKE_OPTIONS = no-dependencies
 
 INCLUDES = $(all_includes)
 
-INCLUDES += -I$(top_srcdir)/src -I$(top_srcdir)/src/core
+INCLUDES += -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/core
 
 
 bin_PROGRAMS = adios_index_fastbit
diff --git a/utils/fastbit/Makefile.in b/utils/fastbit/Makefile.in
index a018356..76cede3 100644
--- a/utils/fastbit/Makefile.in
+++ b/utils/fastbit/Makefile.in
@@ -308,6 +308,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -366,8 +369,8 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = no-dependencies
-INCLUDES = $(all_includes) -I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/core
+INCLUDES = $(all_includes) -I$(top_builddir)/src/public \
+	-I$(top_srcdir)/src -I$(top_srcdir)/src/core
 adios_index_fastbit_SOURCES = adios_index_fastbit.c 
 adios_index_fastbit_CPPFLAGS = $(ADIOSLIB_CPPFLAGS) $(ADIOSLIB_CFLAGS) $(ADIOSLIB_EXTRA_CPPFLAGS)
 adios_index_fastbit_LDADD = $(top_builddir)/src/libadios.a $(ADIOSLIB_LDADD)
diff --git a/utils/fastbit/adios_index_fastbit.c b/utils/fastbit/adios_index_fastbit.c
index 68468d2..4671ce9 100644
--- a/utils/fastbit/adios_index_fastbit.c
+++ b/utils/fastbit/adios_index_fastbit.c
@@ -14,6 +14,9 @@
   char gGroupNameFastbitIdx[20] = "notNamed";
 
   char* gBinningOption = 0;
+  char* gIdxFileName = 0;
+  int   pack = 4800; // # of blocks to index with per process 
+  uint64_t recommended_index_ele = 20000000; // 20M elements
 
   int64_t       gAdios_group;
   int64_t       gAdios_write_file;
@@ -28,7 +31,12 @@
 
   uint64_t sum_nb=0, sum_nk=0, sum_no=0;
 
+  uint64_t workCounter=0;
+
+#define BOX
 //void printData(void* data, enum ADIOS_DATATYPES type, uint64_t size);
+void processData(void* data, uint64_t dataCount, int rank, int timestep, char* selName, FastBitDataType ft, ADIOS_VARINFO* v);
+
 
 void defineFastbitVar(int nblocks, const char* name, int64_t* ids, int adiosType, uint64_t* localDim, const char* globalStr, uint64_t* offset)
 {
@@ -48,6 +56,20 @@ void defineFastbitVar(int nblocks, const char* name, int64_t* ids, int adiosType
   }
 }
 
+int64_t defineAdiosVar(const char* name,  int adiosType, uint64_t localDim, const char* globalStr, uint64_t offset)
+{
+    char offsetStr[100] = "";
+    if (offset != 0) {
+      sprintf(offsetStr, "%llu", offset);
+    } 
+
+    char dimStr[100];
+    sprintf(dimStr, "%llu", localDim);
+    int64_t id =  adios_define_var (gAdios_group, name, "", adiosType, dimStr, globalStr, offsetStr);
+    printf("id = %ld \n", id);
+    return id;
+}
+
 
 // k is numbered from 1 to sum_nblocks
 void verifyData(ADIOS_FILE* f, ADIOS_VARINFO* v, int k, int timestep) 
@@ -203,87 +225,285 @@ void sumLogTime(int stage) {
   */
 }
 
-void onBlock(int rank, ADIOS_FILE* f, ADIOS_VARINFO* v, int i, int j, int blockCounter, FastBitDataType ft)
+
+/*
+void onSelection(int rank, ADIOS_FILE* f, ADIOS_VARINFO* v, int timestep, char* selName,  ADIOS_SELECTION* sel, uint64_t selCount, FastBitDataType ft)
 {
       char bmsVarName[100];
       char keyVarName[100];
       char offsetName[100];
 
-       int64_t       var_ids_bms[v->nblocks[i]];
-       int64_t       var_ids_key[v->nblocks[i]];
-       int64_t       var_ids_offset[v->nblocks[i]];
-
-
-       
-	 sprintf(bmsVarName, "bms-%d-%d-%d", v->varid, i, j);
-	 sprintf(keyVarName, "key-%d-%d-%d", v->varid, i, j);
-	 sprintf(offsetName, "offset-%d-%d-%d", v->varid, i, j);
-
-	 //	 blockCounter++;
-	 uint64_t blockSize = fastbit_adios_util_getBlockSize(v, i, j); //blockCounter);
-	 uint64_t blockDataByteSize = adios_type_size (v->type, v->value) * blockSize; 
-
-	 char notes[100];
-	 logTime(NULL); logTimeMillis(NULL);
-
-	 sprintf(notes, "  reading data from adios  on varid=%d, time=%d, block: %d, size=%ld bytes=%ld", v->varid, i, j, blockSize, blockDataByteSize);
-
-	 logTime(notes); logTimeMillis(notes);
-	 localtime(&indexRefresh);
-
-	    //printf("   %d th block / (%d), size= %llu bytes=%llu", j, blockSize, blockCounter, blockDataByteSize);
-	    
-	    void* data = malloc (blockDataByteSize);
-	    ADIOS_SELECTION* blockSel = adios_selection_writeblock(j);
-
-	    //adios_selcton_writeblock(num),  0 <= num <  nblocks[timestep]
-	    //ADIOS_SELECTION* blockSel = adios_selection_writeblock(blockCounter);
-	    int err = adios_schedule_read_byid(f, blockSel, v->varid, i, 1, data);
-	    if (!err) {	
-	      err = adios_perform_reads(f, 1);
-	    } else {
-	      printf("Unable to read block %d at timestep: %d \n", j, i);
-	      return;
-	      //break;
-	    }
-	    //fastbit_adios_util_printData(data, v->type, blockSize);
-	   
-	    double* keys = NULL;
-	    int64_t *offsets = NULL;
-	    uint32_t *bms = NULL;
-	    uint64_t nk=0, no=0, nb=0;
-	    
-	    const char* datasetName = "test";
-	    logTime("  data collected, fastbit start indexing"); 
-	    logTimeMillis("  data collected, fastbit start indexing"); 
-	    //fastbit_adios_util_printData(data, v->type, blockBytes/adios_type_size(v->type, v->value));
+      int64_t       var_ids_bms;
+      int64_t       var_ids_key;
+      int64_t       var_ids_offset;
+             
+      sprintf(bmsVarName, "bms-%d-%d-%s", v->varid, timestep, selName);
+      sprintf(keyVarName, "key-%d-%d-%s", v->varid, timestep, selName);
+      sprintf(offsetName, "offset-%d-%d-%s", v->varid, timestep, selName);
+      
+      uint64_t selByteSize = adios_type_size (v->type, v->value) * selCount; 
+      
+      char notes[100];
+      logTime(NULL); logTimeMillis(NULL);
+      
+      sprintf(notes, "  reading data from adios  on varid=%d, time=%d, name=%s, bytes=%ld", v->varid, timestep, selName,  selByteSize);
+      
+      logTime(notes); logTimeMillis(notes);
+      localtime(&indexRefresh);      
+      
+      void* data = malloc (selByteSize);
+
+      int err = adios_schedule_read_byid(f, sel, v->varid, timestep, 1, data);
+      if (!err) {	
+	err = adios_perform_reads(f, 1);
+      } else {
+	printf("Unable to read sel %s at timestep: %d \n", selName, timestep);
+	return;
+	//break;
+      }
 
-	    fastbitIndex(datasetName, data, blockSize, ft, &keys, &nk, &offsets, &no, &bms, &nb);
-	    logTime("  indexed on block");
-	    logTimeMillis("  indexed on block");
+      
+      double* keys = NULL;
+      int64_t *offsets = NULL;
+      uint32_t *bms = NULL;
+      uint64_t nk=0, no=0, nb=0;
+      
+      const char* datasetName = "test";
+      logTime("  data collected, fastbit start indexing"); 
+      logTimeMillis("  data collected, fastbit start indexing"); 
+      
+      fastbitIndex(datasetName, data, selCount, ft, &keys, &nk, &offsets, &no, &bms, &nb);
+      logTime("  indexed on block");
+      logTimeMillis("  indexed on block");
+      
+      printf("    rank:%d, index created =  %llu, %llu, %llu, on var:%d, timestep: %d, selection %s\n", rank, nb, nk, no, v->varid, timestep, selName);
+      sum_nb += nb; sum_nk += nk, sum_no += no;
+
+      adios_allocate_buffer (ADIOS_BUFFER_ALLOC_NOW, 500); // +5MB for extra room in buffer
+      adios_declare_group (&gAdios_group, gGroupNameFastbitIdx, "", adios_flag_yes);
+      adios_select_method (gAdios_group, "MPI", "", "");
+
+      adios_open (&gAdios_write_file, gGroupNameFastbitIdx, gIdxFileName, "w", MPI_COMM_WORLD);
+
+      uint64_t estimatedbytes = (nb+nk+no)*adios_type_size(adios_double, NULL);
+      uint64_t adios_totalsize;     
+      adios_group_size (gAdios_write_file, estimatedbytes +1048576, &adios_totalsize);     
+
+      printf("=> adios open output file: %s, rank %d allocated %llu bytes... \n", gIdxFileName, rank, adios_totalsize); 
+
+
+      defineFastbitVar(1, bmsVarName, &var_ids_bms, adios_unsigned_integer, &nb,0,0);    			    
+      defineFastbitVar(1, keyVarName, &var_ids_key, adios_double, &nk, 0, 0);
+      defineFastbitVar(1, offsetName, &var_ids_offset, adios_long, &no, 0, 0); 
+
+
+      logTime("  write starts");
+      logTimeMillis("  write starts");
+
+      adios_write_byid(gAdios_write_file, var_ids_bms, bms);
+      adios_write_byid(gAdios_write_file, var_ids_key, keys);
+      adios_write_byid(gAdios_write_file, var_ids_offset, offsets);
+
+      logTime("  write ends");
+      logTimeMillis("  write ends");
+      sumLogTime(1);
+      sumLogTimeMillis(1);
+      
+      adios_selection_delete(sel);
+      free(data);	 
+      data = NULL;
+      
+} // onselection
+*/
 
-	    printf("    rank:%d, index created =  %llu, %llu, %llu, on var:%d, timestep: %d, block %d\n", rank, nb, nk, no, v->varid, i, j);
-	    sum_nb += nb; sum_nk += nk, sum_no += no;
+void onMultiBlock(int rank, ADIOS_FILE* f, ADIOS_VARINFO* v, int timestep, int blockStart,  int blockEnd, FastBitDataType ft)
+{
+  int i=0;
+  
+  char selName[100];
+  sprintf(selName, "block-%d", blockStart, blockEnd);
+
+  uint64_t blockSizeArray[blockEnd-blockStart];
+
+  uint64_t totalCount = 0;
+  for (i = blockStart; i< blockEnd; i++) {
+      blockSizeArray[i-blockStart] = fastbit_adios_util_getBlockSize(v, timestep, i); 
+      //totalBytes += blockSizeArray[i-blockStart] * adios_type_size (v->type, v->value);
+      totalCount += blockSizeArray[i-blockStart];
+  }
+
+  //void* data = malloc (totalBytes);
+  double* data = (double *) calloc (totalCount, sizeof (double));
+
+  uint64_t currStart = 0;
+  for (i = blockStart; i < blockEnd; i++) {
+      ADIOS_SELECTION* blockSel = adios_selection_writeblock(i);
+      
+      int err = adios_schedule_read_byid(f, blockSel, v->varid, timestep, 1, &data[currStart]);
+      currStart += blockSizeArray[i-blockStart];
+      if (!err) {	
+	err = adios_perform_reads(f, 1);
+      } else {
+	printf("Unable to read block %d at timestep: %d \n", i, timestep);
+	return;
+	//break;
+      }
+  }
+  
+  processData(data, totalCount, rank, timestep, selName, ft, v);
+      //processData(void* data, uint64_t dataCount, int rank, int timestep, char* selName, FastBitDataType ft, ADIOS_VARINFO* v)
 
-	    defineFastbitVar(1,bmsVarName, &var_ids_bms[j], adios_unsigned_integer, &nb,0,0);    			    
-	    defineFastbitVar(1, keyVarName, &var_ids_key[j], adios_double, &nk, 0, 0);
-	    defineFastbitVar(1, offsetName, &var_ids_offset[j], adios_long, &no, 0, 0); 
+} // on multi block
 
-	    logTime("  write starts");
-	    logTimeMillis("  write starts");
-	    adios_write_byid(gAdios_write_file, var_ids_bms[j], bms);
-	    adios_write_byid(gAdios_write_file, var_ids_key[j], keys);
-	    adios_write_byid(gAdios_write_file, var_ids_offset[j], offsets);
-	    logTime("  write ends");
-	    logTimeMillis("  write ends");
-	    sumLogTime(1);
-	    sumLogTimeMillis(1);
 
-	    adios_selection_delete(blockSel);
-	    free(data);	 
+void onBox(int rank, ADIOS_FILE* f, ADIOS_VARINFO* v, int timestep, uint64_t* start, uint64_t* count,  FastBitDataType ft)
+{
+  int i=0;
+  
+  char selName[100];
+  sprintf(selName, "box-%lu", start[0]);
+
 
-	    verifyData(f, v, blockCounter, i);
+  uint64_t totalCount = 1;
+  for (i = 0; i<v->ndim; i++) {
+      totalCount *= count[i];
+  }
+
+  double* data = (double *) calloc (totalCount, sizeof (double));
+
+  uint64_t currStart = 0;
+
+  ADIOS_SELECTION* boxSel = adios_selection_boundingbox(v->ndim, start, count);
+  
+  int err = adios_schedule_read_byid(f, boxSel, v->varid, timestep, 1, data);
+
+  if (!err) {	
+    err = adios_perform_reads(f, 1);
+  }    
+  
+  processData(data, totalCount, rank, timestep, selName, ft, v);
+
+} // on box
+
+
+void processData(void* data, uint64_t dataCount, int rank, int timestep, char* selName, FastBitDataType ft, ADIOS_VARINFO* v)
+{
+      char bmsVarName[100];
+      char keyVarName[100];
+      char offsetName[100];
+
+      int64_t       var_ids_bms;
+      int64_t       var_ids_key;
+      int64_t       var_ids_offset;
+             
+      sprintf(bmsVarName, "bms-%d-%d-%s", v->varid, timestep, selName);
+      sprintf(keyVarName, "key-%d-%d-%s", v->varid, timestep, selName);
+      sprintf(offsetName, "offset-%d-%d-%s", v->varid, timestep, selName);
+      
+
+      double* keys = NULL;
+      int64_t *offsets = NULL;
+      uint32_t *bms = NULL;
+      uint64_t nk=0, no=0, nb=0;
+      
+      const char* datasetName = "test";
+      logTime("  data collected, fastbit start indexing"); 
+      logTimeMillis("  data collected, fastbit start indexing"); 
+	    //fastbit_adios_util_printData(data, v->type, blockBytes/adios_type_size(v->type, v->value));
+      
+      fastbitIndex(datasetName, data, dataCount, ft, &keys, &nk, &offsets, &no, &bms, &nb);
+
+      logTime("  indexed on block");
+      logTimeMillis("  indexed on block");
+      
+      printf("  RANK:%d, index created =  %llu, %llu, %llu, on var:%d, timestep: %d, block %s\n", rank, nb, nk, no, v->varid, timestep, selName);
+      sum_nb += nb; sum_nk += nk, sum_no += no;
+
+      
+      defineFastbitVar(1, bmsVarName, &var_ids_bms, adios_unsigned_integer, &nb,0,0);    			    
+      defineFastbitVar(1, keyVarName, &var_ids_key, adios_double, &nk, 0, 0);
+      defineFastbitVar(1, offsetName, &var_ids_offset, adios_long, &no, 0, 0); 
+
+      printf("bms[0] = %llu, bms[1]=%llu \n", bms[0], bms[1]);
+      //var_ids_bms = defineAdiosVar(bmsVarName, adios_unsigned_integer, nb, 0, 0);
+      //var_ids_key = defineAdiosVar(keyVarName, adios_double, nk, 0, 0);
+      //var_ids_offset = defineAdiosVar(offsetName, adios_long, no, 0, 0);
+
+
+      logTime("  write starts");
+      logTimeMillis("  write starts");
+
+      adios_write_byid(gAdios_write_file, var_ids_bms, bms);
+      adios_write_byid(gAdios_write_file, var_ids_key, keys);
+      adios_write_byid(gAdios_write_file, var_ids_offset, offsets);
+
+      logTime("  write ends");
+      logTimeMillis("  write ends");
+      sumLogTime(1);
+      sumLogTimeMillis(1);
+      
+      free(data);	 
+      data = NULL;
+      free(bms); bms = NULL;
+      free(keys); keys = NULL;
+      free(offsets); offsets = NULL;
+
+     
 }
+void onBlock(int rank, ADIOS_FILE* f, ADIOS_VARINFO* v, int i, int j, int blockCounter, FastBitDataType ft)
+{
+      char bmsVarName[100];
+      char keyVarName[100];
+      char offsetName[100];
+
+      int64_t       var_ids_bms[v->nblocks[i]];
+      int64_t       var_ids_key[v->nblocks[i]];
+      int64_t       var_ids_offset[v->nblocks[i]];
+             
+      sprintf(bmsVarName, "bms-%d-%d-%d", v->varid, i, j);
+      sprintf(keyVarName, "key-%d-%d-%d", v->varid, i, j);
+      sprintf(offsetName, "offset-%d-%d-%d", v->varid, i, j);
+      
+
+      uint64_t blockSize = fastbit_adios_util_getBlockSize(v, i, j); 
+      uint64_t blockDataByteSize = adios_type_size (v->type, v->value) * blockSize; 
+      
+      char notes[100];
+      logTime(NULL); logTimeMillis(NULL);
+      
+      sprintf(notes, "  reading data from adios  on varid=%d, time=%d, block: %d, size=%ld bytes=%ld", v->varid, i, j, blockSize, blockDataByteSize);
+      
+      logTime(notes); logTimeMillis(notes);
+      localtime(&indexRefresh);
+      
+      //printf("   %d th block / (%d), size= %llu bytes=%llu", j, blockSize, blockCounter, blockDataByteSize);
+      
+      void* data = malloc (blockDataByteSize);
+      ADIOS_SELECTION* blockSel = adios_selection_writeblock(j);
+      
+      //adios_selcton_writeblock(num),  0 <= num <  nblocks[timestep]
+      //ADIOS_SELECTION* blockSel = adios_selection_writeblock(blockCounter);
+      int err = adios_schedule_read_byid(f, blockSel, v->varid, i, 1, data);
+      if (!err) {	
+	err = adios_perform_reads(f, 1);
+      } else {
+	printf("Unable to read block %d at timestep: %d \n", j, i);
+	return;
+	//break;
+      }
+      //fastbit_adios_util_printData(data, v->type, blockSize);
+
+      char selName[20];
+      sprintf(selName, "block-%d", j);
+      processData(data, blockSize, rank, i, selName, ft, v);
+
+      //processData(void* data, uint64_t dataCount, int rank, int timestep, char* selName, FastBitDataType ft, ADIOS_VARINFO* v)
+
+
+      adios_selection_delete(blockSel);
+      verifyData(f, v, blockCounter, i);
+} // onblock
+
 
 void buildIndex_mpi(ADIOS_FILE* f, ADIOS_VARINFO* v, int rank, int size)
 {
@@ -299,23 +519,98 @@ void buildIndex_mpi(ADIOS_FILE* f, ADIOS_VARINFO* v, int rank, int size)
   int blockCounter = -1;
   FastBitDataType ft = fastbit_adios_util_getFastbitDataType(v->type);
 
+
+#ifdef SINGLE_BLOCK
   for (i=0; i < v->nsteps; i++) {
        int nblocks = v->nblocks[i];
-
-       for (j=0; j < v->nblocks[i]; j++) {
+       for (j=0; j < nblocks; j++) {
 	 blockCounter++;
 	 if (blockCounter % size == rank) {
+
 	   onBlock(rank, f, v, i, j, blockCounter, ft);
+
+	   fastbit_cleanup();
 	 }
        }
+
        printf(" rank %d, varid %d, timestep %d  total index created =  %llu, %llu, %llu, \n", rank, v->varid, i, sum_nb, sum_nk, sum_no);
        printf(" rank %d, varid %d, timestep %d  total bytes         =  %llu, %llu, %llu, \n", rank, v->varid, i,
 	      adios_type_size(adios_unsigned_integer , NULL)*sum_nb,
 	      adios_type_size(adios_double, NULL)*sum_nk, 
 	      adios_type_size(adios_long, NULL)*sum_no);
-       fastbit_cleanup();
+
        printf("\n");
   }
+#endif
+
+#ifdef MULTI_BLOCK
+  for (i=0; i<v->nsteps; i++) {
+    int nblocks = v->nblocks[i];
+    int blockStart = 0;
+    int blockEnd = blockStart+pack;
+
+   
+    while (blockStart < nblocks) {
+      if (blockEnd > nblocks) {
+	blockEnd = nblocks;
+      } 
+      printf("block start=%d, end=%d, max=%d\n", blockStart, blockEnd, nblocks);
+      
+      if (workCounter % size == rank) {
+	printf("%ld  mod %ld == %d \n", workCounter,  size, rank);
+	onMultiBlock(rank, f, v, i, blockStart, blockEnd, ft);
+	fastbit_cleanup();
+      }
+
+      workCounter ++;
+
+      blockStart += pack;
+      blockEnd = blockStart+pack;
+    }
+
+    fastbit_cleanup();
+  }
+#endif
+
+#ifdef BOX
+  for (i=0; i<v->nsteps; i++) {
+    uint64_t s = 0;
+    uint64_t dataSize = 1;
+    uint64_t start[v->ndim];
+    for (s=0; s<v->ndim; s++) {
+      dataSize *= v->dims[s];
+      start[s] = 0;
+    }
+    
+    uint64_t split = dataSize/recommended_index_ele;
+    uint64_t startRef = 0;
+    if (split == 0) {
+      if (rank == 0) {
+	onBox(rank, f, v, i, start, v->dims, ft);
+      }
+    } else {
+      while (startRef < v->dims[0]) {
+	uint64_t count[v->ndim];
+	start[0] = startRef;
+	startRef += v->dims[0]/split;
+	if (startRef >= v->dims[0]) {
+	  startRef = v->dims[0];	  
+	}
+	count[0] = startRef - start[0];
+	for (s=1; s<v->ndim; s++) {
+	  start[s] = 0;
+	  count[s] = v->dims[s];
+	}
+
+	if (workCounter % size == rank) {
+	  onBox(rank, f, v, i, start, count, ft);
+	}
+
+	workCounter ++;
+      }
+    }    
+  }
+#endif
 }
 
 void buildIndexOnAllVar(ADIOS_FILE* f, int rank, int size) 
@@ -373,6 +668,42 @@ uint64_t estimateBytesOnVar(ADIOS_FILE* f, ADIOS_VARINFO* v)
     //return result * typeSize;
 }
 
+int getJobCounter(ADIOS_FILE* f)
+{
+  int numVars = f->nvars;
+  int counter = 0;
+
+  int i=0, k=0;
+  for (i=0; i<numVars; i++) {
+    char* varName = f->var_namelist[i];
+    ADIOS_VARINFO* v = adios_inq_var(f, varName);
+    if (v->ndim == 0) {
+      continue;
+    }
+    for (k=0; k<v->nsteps; k++) {
+#ifdef MULTI_BOX
+      int nblocks = v->nblocks[k];
+      printf("var = %s, timestep = %ld,  nblocks=%ld\n", varName, k, nblocks);
+      int remainder = nblocks % pack;
+      counter += nblocks/pack;
+#endif
+#ifdef BOX
+      int j=0;
+      uint64_t totalElements =1;
+      for (j=0; j<v->ndim; j++) {
+	totalElements *= v->dims[j];
+      }
+      int remainder = totalElements % recommended_index_ele;      
+      counter += totalElements/recommended_index_ele;      
+#endif
+      if (remainder > 0) {
+	counter += 1;
+      }
+    }
+  }
+  return counter;
+}
+
 int64_t getByteEstimationOnFile(ADIOS_FILE* f, int rank) 
 {
   // check all vars
@@ -439,15 +770,12 @@ int main (int argc, char** argv)
   //MPI_Comm    comm_dummy = 0;  // MPI_Comm is defined through adios_read.h 
   MPI_Comm comm_dummy = MPI_COMM_WORLD;
 
-
   int         rank, size;
   MPI_Init (&argc, &argv);			   
   MPI_Comm_rank (comm_dummy, &rank);
   MPI_Comm_size (comm_dummy, &size);
 
   adios_init_noxml (comm_dummy);
-
-  char *idxFileName;
   
   if (argc < 2) {
     printf("Usage: index_fastbit fileName (attrName)");
@@ -459,28 +787,57 @@ int main (int argc, char** argv)
     printf ("::%s\n", adios_errmsg());
     return -1;
   }
-
+  
+  /*
   adios_allocate_buffer (ADIOS_BUFFER_ALLOC_NOW, (f->file_size)*2/1048576 + 5); // +5MB for extra room in buffer
   adios_declare_group (&gAdios_group, gGroupNameFastbitIdx, "", adios_flag_yes);
   adios_select_method (gAdios_group, "MPI", "", "");
+  */
+  gIdxFileName = fastbit_adios_util_getFastbitIndexFileName(argv[1]);
+  unlink(gIdxFileName);
 
-  
-  idxFileName = fastbit_adios_util_getFastbitIndexFileName(argv[1]);
+      adios_allocate_buffer (ADIOS_BUFFER_ALLOC_NOW, 500); // +5MB for extra room in buffer
+      adios_declare_group (&gAdios_group, gGroupNameFastbitIdx, "", adios_flag_yes);
+      adios_select_method (gAdios_group, "MPI", "", "");
 
-  unlink(idxFileName);
-  adios_open (&gAdios_write_file, gGroupNameFastbitIdx, idxFileName, "w", comm_dummy);
+      adios_open (&gAdios_write_file, gGroupNameFastbitIdx, gIdxFileName, "w", MPI_COMM_WORLD);
 
-  uint64_t adios_totalsize;
-  
-  uint64_t estimatedbytes = getByteEstimation(f, rank, argc, argv);
-  // each processor is writing call this function, so the eventual size would add up 
-  adios_group_size (gAdios_write_file, estimatedbytes/size+1048576, &adios_totalsize);     
+#ifdef MULTI_BLOCK
+      int testid = adios_define_var (gAdios_group, "pack", "", adios_integer , 0, 0, 0);
+#endif
+#ifdef BOX
+      int testid = adios_define_var (gAdios_group, "elements", "", adios_integer , 0, 0, 0);
+#endif
+      //uint64_t estimatedbytes = (nb+nk+no)*adios_type_size(adios_double, NULL);
+      int jobCounter = getJobCounter(f);
+      uint64_t estimatedbytes =  getByteEstimationOnFile(f, rank);
+      if (size > 1) {
+	int maxJobsPP = jobCounter/size + 1;
+        estimatedbytes = estimatedbytes * maxJobsPP /jobCounter +1048576;
+      }
+
+      estimatedbytes += 1048576;
+
+      uint64_t adios_totalsize;      // adios_group_size needs to be call before any write_byid, Otherwise write_byid does nothing 
+      adios_group_size (gAdios_write_file, estimatedbytes , &adios_totalsize);     
+
+      printf("=> .. adios open output file: %s, rank %d allocated %llu bytes... \n", gIdxFileName, rank, adios_totalsize); 
+      // IMPORTANT: 
+      // can only call open/close once in a process
+      // otherwise data is tangled or only the data in the last open/close call is recorded
+
+#ifdef MULTI_BLOCK
+      adios_write_byid(gAdios_write_file, testid, &pack);
+#endif
+#ifdef BOX
+      adios_write_byid(gAdios_write_file, testid, &recommended_index_ele);
+#endif
 
-  printf("=> adios open output file: %s, rank %d allocated %llu bytes... \n", idxFileName, rank, adios_totalsize); 
 
   sumLogTime(-1);
   sumLogTimeMillis(-1);
 
+  
   if (argc >= 3) {
      int i=2;
      while (i<argc) {
@@ -511,6 +868,7 @@ int main (int argc, char** argv)
     buildIndexOnAllVar(f, rank, size);
   }
 
+
   sumLogTime(0);
   sumLogTimeMillis(0);
 
@@ -523,9 +881,9 @@ int main (int argc, char** argv)
 
 
   // read back:
-  f = adios_read_open_file (idxFileName, ADIOS_READ_METHOD_BP, comm_dummy);
+  f = adios_read_open_file (gIdxFileName, ADIOS_READ_METHOD_BP, comm_dummy);
   if (f == NULL) {
-    printf("No such file: %s \n", idxFileName);
+    printf("No such file: %s \n", gIdxFileName);
     return 0;
   }
 
@@ -550,14 +908,14 @@ int main (int argc, char** argv)
   adios_read_close(f);
 
   if (rank == 0) {
-    printf(" ==>  index file is at: %s\n", idxFileName);
+    printf(" ==>  index file is at: %s\n", gIdxFileName);
   }
 
   // clean up
   MPI_Barrier (comm_dummy);
   adios_finalize (rank);
   MPI_Finalize ();
-  free (idxFileName);
+  free (gIdxFileName);
 
   fastbit_cleanup();
   return 0;
diff --git a/utils/gpp/Makefile.in b/utils/gpp/Makefile.in
index 6a2d4f5..a579b0c 100644
--- a/utils/gpp/Makefile.in
+++ b/utils/gpp/Makefile.in
@@ -306,6 +306,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/utils/list_methods/CMakeLists.txt b/utils/list_methods/CMakeLists.txt
index 93bddc1..1d42587 100644
--- a/utils/list_methods/CMakeLists.txt
+++ b/utils/list_methods/CMakeLists.txt
@@ -1,6 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/utils/list_methods)
 link_directories(${PROJECT_BINARY_DIR}/utils/list_methods)
 
diff --git a/utils/list_methods/Makefile.am b/utils/list_methods/Makefile.am
index 83530e9..9b1f9bd 100644
--- a/utils/list_methods/Makefile.am
+++ b/utils/list_methods/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/core
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public  -I$(top_srcdir)/src -I$(top_srcdir)/src/core
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/list_methods/Makefile.in b/utils/list_methods/Makefile.in
index 8dec06c..c60f94d 100644
--- a/utils/list_methods/Makefile.in
+++ b/utils/list_methods/Makefile.in
@@ -349,6 +349,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -406,7 +409,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/core
 AUTOMAKE_OPTIONS = no-dependencies
 @BUILD_WRITE_TRUE at list_methods_SOURCES = list_methods.c
diff --git a/utils/skel/Makefile.in b/utils/skel/Makefile.in
index 0974ead..62b9130 100644
--- a/utils/skel/Makefile.in
+++ b/utils/skel/Makefile.in
@@ -350,6 +350,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/utils/skel/etc/Makefile.in b/utils/skel/etc/Makefile.in
index e40100c..37b24c4 100644
--- a/utils/skel/etc/Makefile.in
+++ b/utils/skel/etc/Makefile.in
@@ -305,6 +305,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/utils/skel/src/Makefile.in b/utils/skel/src/Makefile.in
index 67811d0..efbb5b5 100644
--- a/utils/skel/src/Makefile.in
+++ b/utils/skel/src/Makefile.in
@@ -332,6 +332,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
diff --git a/utils/skeldump/CMakeLists.txt b/utils/skeldump/CMakeLists.txt
index 031da20..d3f9bc8 100644
--- a/utils/skeldump/CMakeLists.txt
+++ b/utils/skeldump/CMakeLists.txt
@@ -1,6 +1,6 @@
 include_directories(${PROJECT_SOURCE_DIR}/src)
 include_directories(${PROJECT_SOURCE_DIR}/src/core)
-include_directories(${PROJECT_BINARY_DIR})
+include_directories(${PROJECT_BINARY_DIR}  ${PROJECT_BINARY_DIR}/src ${PROJECT_BINARY_DIR}/src/public)
 include_directories(${PROJECT_SOURCE_DIR}/src/public)
 link_directories(${PROJECT_BINARY_DIR}/src)
 link_directories(${PROJECT_BINARY_DIR}/src/core)
diff --git a/utils/skeldump/Makefile.am b/utils/skeldump/Makefile.am
index 28126bb..cd62189 100644
--- a/utils/skeldump/Makefile.am
+++ b/utils/skeldump/Makefile.am
@@ -1,5 +1,5 @@
 AM_CPPFLAGS = $(all_includes)
-AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_builddir)/src/public -I$(top_srcdir)/src -I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 
 AUTOMAKE_OPTIONS = no-dependencies
 
diff --git a/utils/skeldump/Makefile.in b/utils/skeldump/Makefile.in
index 0e9c86c..3008f61 100644
--- a/utils/skeldump/Makefile.in
+++ b/utils/skeldump/Makefile.in
@@ -307,6 +307,9 @@ TIMER_CPPFLAGS = @TIMER_CPPFLAGS@
 TIMER_LDFLAGS = @TIMER_LDFLAGS@
 TIMER_LIBS = @TIMER_LIBS@
 VERSION = @VERSION@
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MICRO = @VERSION_MICRO@
+VERSION_MINOR = @VERSION_MINOR@
 ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
 ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -364,7 +367,8 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/src \
+AM_CPPFLAGS = $(all_includes) -I$(top_builddir)/src \
+	-I$(top_builddir)/src/public -I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/public -I$(top_srcdir)/src/core
 AUTOMAKE_OPTIONS = no-dependencies
 skeldump_SOURCES = skeldump.c 
diff --git a/wrappers/matlab/adiosload.m b/wrappers/matlab/adiosload.m
new file mode 100644
index 0000000..8fc4238
--- /dev/null
+++ b/wrappers/matlab/adiosload.m
@@ -0,0 +1,33 @@
+function adiosload(file, prefix)
+%ADIOSLOAD Read all variables in an ADIOS BP file
+%
+%   ADIOSLOAD is a batch process to load all variables in an ADIOS BP 
+%   file. The simplest way is to give an ADIOS BP file name. An optional 
+%   'prefix' string can be given to avoid name conflict or name conversion. 
+%
+%   ADIOSLOAD(FILE)
+%      Read all the variables in FILE and use the same variable names.
+%
+%   ADIOSLOAD(FILE, PREFIX)
+%      Read all the variables in FILE and add PREFIX to the varaible names.
+%
+%   See also ADIOSOPEN, ADIOSCLOSE, ADIOS.
+
+%   Copyright 2009 UT-BATTELLE, LLC
+%   $Revision: 1.0 $  $Date: 2009/08/05 12:53:41 $
+%   Author: Norbert Podhorszki <pnorbert at ornl.gov>
+
+if (~exist('prefix', 'var'))
+    prefix = '';
+end
+fp = adiosopen(file);
+for i = 1:length(fp.Groups.Variables)
+    try
+        name{i} = fp.Groups.Variables(i).Name;
+        data{i} = adiosread(fp.Groups, fp.Groups.Variables(i).Name);
+        assignin('base',[prefix name{i}],data{i});
+    catch
+        warning(['Skip ... ', fp.Groups.Variables(i).Name]);
+    end
+end
+adiosclose(fp);
diff --git a/wrappers/matlab/posix_method.bp b/wrappers/matlab/posix_method.bp
new file mode 100644
index 0000000..dc7b0cd
Binary files /dev/null and b/wrappers/matlab/posix_method.bp differ
diff --git a/wrappers/matlab/posix_method.bp.dir/posix_method.bp.0 b/wrappers/matlab/posix_method.bp.dir/posix_method.bp.0
new file mode 100644
index 0000000..13efbd1
Binary files /dev/null and b/wrappers/matlab/posix_method.bp.dir/posix_method.bp.0 differ
diff --git a/wrappers/matlab/two_groups19.bp b/wrappers/matlab/two_groups19.bp
new file mode 120000
index 0000000..f798eed
--- /dev/null
+++ b/wrappers/matlab/two_groups19.bp
@@ -0,0 +1 @@
+/ccs/home/pnorbert/two_groups19.bp
\ No newline at end of file
diff --git a/wrappers/matlab/xgc.diagnosis.bp b/wrappers/matlab/xgc.diagnosis.bp
new file mode 120000
index 0000000..3a792f7
--- /dev/null
+++ b/wrappers/matlab/xgc.diagnosis.bp
@@ -0,0 +1 @@
+/lustre/atlas/proj-shared/env003/jyc/titan/test-adios/xgc.diagnosis.bp
\ No newline at end of file
diff --git a/wrappers/numpy/MANIFEST.in b/wrappers/numpy/MANIFEST.in
new file mode 100644
index 0000000..0d9cf57
--- /dev/null
+++ b/wrappers/numpy/MANIFEST.in
@@ -0,0 +1,2 @@
+include mpi.cfg
+include conf/*.py
diff --git a/wrappers/numpy/README b/wrappers/numpy/README
index 8ad5d19..032a868 100644
--- a/wrappers/numpy/README
+++ b/wrappers/numpy/README
@@ -7,6 +7,31 @@ to call the native ADIOS library. This module is built by Cython.
 This module requires ADIOS built with the GNU C compiler with
 relocatable codes. Add -fPIC flag to CFLAGS before configuring ADIOS.
 
+== Quick install with pip ==
+
+ADIOS Python wrapper can be installed with pip. Check if pip is
+installed already. Otherwise, install pip first:
+
+$ wget https://bootstrap.pypa.io/get-pip.py
+$ sudo python get-pip.py
+Or,
+$ python get-pip.py --user
+to install in a local directory, $HOME/.local
+
+Before installing ADIOS Python wrappers, make sure Numpy and MPI4Py
+installed. Otherwise, install them as follows:
+
+$ pip install numpy
+$ pip install mpi4py
+
+Then, install Adios and Adios-MPI wrapper as follows:
+
+$ pip install adios
+$ pip install adios_mpi
+
+If you want to install in a custom directory, use the following:
+$ pip install --install-option="--prefix=$PREFIX" adios
+$ pip install --install-option="--prefix=$PREFIX" adios_mpi
 
 == Build and install with make ==
 
@@ -44,6 +69,7 @@ You can also install in your local directory, run
 
 $ python setup.py install --user
 
+
 == Test cases and examples ==
 
 Test cases and example files are located in tests and example
@@ -63,3 +89,62 @@ for the serial version of Adios wrapper. If you need to generated C++
 for MPI-enabled version, try the following
 
 $ make CYTHON=y MPI=y python
+
+
+== Upload to PyPI ==
+
+Create $HOME/.pypirc as follows:
+[distutils] 
+    index-servers =
+        pypi
+
+[pypi]
+    repository: https://pypi.python.org/pypi
+    username: {{your_username}}
+    password: {{your_password}}
+
+Then, do the followings:
+$ python setup.py register 
+$ python setup.py sdist upload
+
+
+== Build Document ==
+
+Need sphinx. Install as follows:
+$ pip install Sphinx
+
+== Trouble Shooting ==
+
+-. Custom MPICC and MPICXX
+
+If one needs to use a custom MPICC and MPICXX command (e.g., Titan),
+then use the following command:
+
+$ python setup_mpi.py build_ext --mpicc=cc --mpicxx=CC
+
+Or, to do with pip, try:
+
+$ pip --global-option=build_ext \
+      --global-option=--mpicc=cc --global-option=--mpicxx=CC adios
+
+-. Import error due to undefined "clock_gettime" symbol
+
+When getting the following error:
+
+$ python test_adios.py Traceback (most recent call last):
+  File "test_adios.py", line 8, in <module>
+      import adios as ad
+      ImportError: /path/to/adios.so: undefined symbol: clock_gettime
+
+Try to use the following command to install:
+
+$ pip install --global-option build_ext --global-option -lrt adios
+$ pip install --global-option build_ext --global-option -lrt adios_mpi
+
+-. "Could not find any downloads that satisfy the requirement" with pip
+
+If the error is caused by a certificate error, then, try 
+
+$ wget http://curl.haxx.se/ca/cacert.pem
+$ pip --cert cacert.pem search adios
+$ pip --cert cacert.pem install adios
diff --git a/wrappers/numpy/adios.cpp b/wrappers/numpy/adios.cpp
index 9fb1609..47b2bb7 100644
--- a/wrappers/numpy/adios.cpp
+++ b/wrappers/numpy/adios.cpp
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.21.1 */
+/* Generated by Cython 0.22 */
 
 #define PY_SSIZE_T_CLEAN
 #ifndef CYTHON_USE_PYLONG_INTERNALS
@@ -19,7 +19,7 @@
 #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000)
     #error Cython requires Python 2.6+ or Python 3.2+.
 #else
-#define CYTHON_ABI "0_21_1"
+#define CYTHON_ABI "0_22"
 #include <stddef.h>
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
@@ -54,7 +54,7 @@
 #define CYTHON_COMPILING_IN_PYPY 0
 #define CYTHON_COMPILING_IN_CPYTHON 1
 #endif
-#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
 #define Py_OptimizeFlag 0
 #endif
 #define __PYX_BUILD_PY_SSIZE_T "n"
@@ -203,11 +203,22 @@ static CYTHON_INLINE float __PYX_NAN() {
   return value;
 }
 #endif
+#define __Pyx_void_to_None(void_result) (void_result, Py_INCREF(Py_None), Py_None)
 #ifdef __cplusplus
 template<typename T>
 void __Pyx_call_destructor(T* x) {
     x->~T();
 }
+template<typename T>
+class __Pyx_FakeReference {
+  public:
+    __Pyx_FakeReference() : ptr(NULL) { }
+    __Pyx_FakeReference(T& ref) : ptr(&ref) { }
+    T *operator->() { return ptr; }
+    operator T&() { return *ptr; }
+  private:
+    T *ptr;
+};
 #endif
 
 
@@ -298,11 +309,11 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
 #endif
 #define __Pyx_PyObject_AsSString(s)    ((signed char*) __Pyx_PyObject_AsString(s))
 #define __Pyx_PyObject_AsUString(s)    ((unsigned char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_FromUString(s)  __Pyx_PyObject_FromString((const char*)s)
-#define __Pyx_PyBytes_FromUString(s)   __Pyx_PyBytes_FromString((const char*)s)
-#define __Pyx_PyByteArray_FromUString(s)   __Pyx_PyByteArray_FromString((const char*)s)
-#define __Pyx_PyStr_FromUString(s)     __Pyx_PyStr_FromString((const char*)s)
-#define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((const char*)s)
+#define __Pyx_PyObject_FromCString(s)  __Pyx_PyObject_FromString((const char*)s)
+#define __Pyx_PyBytes_FromCString(s)   __Pyx_PyBytes_FromString((const char*)s)
+#define __Pyx_PyByteArray_FromCString(s)   __Pyx_PyByteArray_FromString((const char*)s)
+#define __Pyx_PyStr_FromCString(s)     __Pyx_PyStr_FromString((const char*)s)
+#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
 #if PY_MAJOR_VERSION < 3
 static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
 {
@@ -338,7 +349,7 @@ static int __Pyx_init_sys_getdefaultencoding_params(void) {
     const char* default_encoding_c;
     sys = PyImport_ImportModule("sys");
     if (!sys) goto bad;
-    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
+    default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
     Py_DECREF(sys);
     if (!default_encoding) goto bad;
     default_encoding_c = PyBytes_AsString(default_encoding);
@@ -451,7 +462,7 @@ static const char *__pyx_f[] = {
   "type.pxd",
 };
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":723
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":726
  * # in Cython to enable them only on the right systems.
  * 
  * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<
@@ -460,7 +471,7 @@ static const char *__pyx_f[] = {
  */
 typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":724
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":727
  * 
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<
@@ -469,7 +480,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t;
  */
 typedef npy_int16 __pyx_t_5numpy_int16_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":725
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":728
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<
@@ -478,7 +489,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t;
  */
 typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":726
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":729
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t
  * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<
@@ -487,7 +498,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t;
  */
 typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":730
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":733
  * #ctypedef npy_int128     int128_t
  * 
  * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<
@@ -496,7 +507,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t;
  */
 typedef npy_uint8 __pyx_t_5numpy_uint8_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":731
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":734
  * 
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<
@@ -505,7 +516,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  */
 typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":732
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":735
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<
@@ -514,7 +525,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  */
 typedef npy_uint32 __pyx_t_5numpy_uint32_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":733
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":736
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t
  * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<
@@ -523,7 +534,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  */
 typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":737
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":740
  * #ctypedef npy_uint128    uint128_t
  * 
  * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<
@@ -532,7 +543,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  */
 typedef npy_float32 __pyx_t_5numpy_float32_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":738
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":741
  * 
  * ctypedef npy_float32    float32_t
  * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<
@@ -541,7 +552,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t;
  */
 typedef npy_float64 __pyx_t_5numpy_float64_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":747
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":750
  * # The int types are mapped a bit surprising --
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<
@@ -550,7 +561,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t;
  */
 typedef npy_long __pyx_t_5numpy_int_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":748
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":751
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<
@@ -559,7 +570,7 @@ typedef npy_long __pyx_t_5numpy_int_t;
  */
 typedef npy_longlong __pyx_t_5numpy_long_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":749
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":752
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t
  * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<
@@ -568,7 +579,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t;
  */
 typedef npy_longlong __pyx_t_5numpy_longlong_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":751
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":754
  * ctypedef npy_longlong   longlong_t
  * 
  * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<
@@ -577,7 +588,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t;
  */
 typedef npy_ulong __pyx_t_5numpy_uint_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":752
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":755
  * 
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<
@@ -586,7 +597,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":753
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":756
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t
  * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<
@@ -595,7 +606,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":755
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":758
  * ctypedef npy_ulonglong  ulonglong_t
  * 
  * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<
@@ -604,7 +615,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  */
 typedef npy_intp __pyx_t_5numpy_intp_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":756
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":759
  * 
  * ctypedef npy_intp       intp_t
  * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<
@@ -613,7 +624,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t;
  */
 typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":758
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":761
  * ctypedef npy_uintp      uintp_t
  * 
  * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<
@@ -622,7 +633,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t;
  */
 typedef npy_double __pyx_t_5numpy_float_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":759
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":762
  * 
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<
@@ -631,7 +642,7 @@ typedef npy_double __pyx_t_5numpy_float_t;
  */
 typedef npy_double __pyx_t_5numpy_double_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":760
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":763
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t
  * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<
@@ -663,8 +674,16 @@ typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
 /*--- Type declarations ---*/
 struct __pyx_obj_5adios_file;
 struct __pyx_obj_5adios_var;
-
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":762
+struct __pyx_obj_5adios_attr;
+struct __pyx_obj_5adios_smartdict;
+struct __pyx_obj_5adios_writer;
+struct __pyx_obj_5adios_attrinfo;
+struct __pyx_obj_5adios_varinfo;
+struct __pyx_obj_5adios___pyx_scope_struct____getitem__;
+struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr;
+struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr;
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":765
  * ctypedef npy_longdouble longdouble_t
  * 
  * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<
@@ -673,7 +692,7 @@ struct __pyx_obj_5adios_var;
  */
 typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":763
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":766
  * 
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<
@@ -682,7 +701,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":764
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":767
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t
  * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<
@@ -691,7 +710,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  */
 typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":766
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":769
  * ctypedef npy_clongdouble clongdouble_t
  * 
  * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<
@@ -701,17 +720,19 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 typedef npy_cdouble __pyx_t_5numpy_complex_t;
 struct __pyx_opt_args_5adios_init;
 struct __pyx_opt_args_5adios_open;
+struct __pyx_opt_args_5adios_write;
 struct __pyx_opt_args_5adios_finalize;
 struct __pyx_opt_args_5adios_init_noxml;
 struct __pyx_opt_args_5adios_declare_group;
 struct __pyx_opt_args_5adios_define_var;
 struct __pyx_opt_args_5adios_select_method;
+struct __pyx_opt_args_5adios_adios2npdtype;
 struct __pyx_opt_args_5adios_read_init;
 struct __pyx_opt_args_5adios_read_finalize;
 struct __pyx_opt_args_5adios_4file_advance;
 struct __pyx_opt_args_5adios_3var_read;
 
-/* "adios.pyx":259
+/* "adios.pyx":305
  * ## ====================
  * 
  * cpdef init(char * config, MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
@@ -723,7 +744,7 @@ struct __pyx_opt_args_5adios_init {
   MPI_Comm comm;
 };
 
-/* "adios.pyx":262
+/* "adios.pyx":308
  *     return adios_init(config, comm)
  * 
  * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
@@ -735,7 +756,19 @@ struct __pyx_opt_args_5adios_open {
   MPI_Comm comm;
 };
 
-/* "adios.pyx":303
+/* "adios.pyx":323
+ *     return total_size
+ * 
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):             # <<<<<<<<<<<<<<
+ *     cdef np.ndarray val_
+ *     if isinstance(val, (np.ndarray)):
+ */
+struct __pyx_opt_args_5adios_write {
+  int __pyx_n;
+  PyObject *dtype;
+};
+
+/* "adios.pyx":356
  *     return adios_close(fd_p)
  * 
  * cpdef int finalize(int mype = 0):             # <<<<<<<<<<<<<<
@@ -747,7 +780,7 @@ struct __pyx_opt_args_5adios_finalize {
   int mype;
 };
 
-/* "adios.pyx":309
+/* "adios.pyx":362
  * ## ADIOS No-XML API
  * ## ====================
  * cpdef int init_noxml(MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
@@ -759,7 +792,7 @@ struct __pyx_opt_args_5adios_init_noxml {
   MPI_Comm comm;
 };
 
-/* "adios.pyx":317
+/* "adios.pyx":370
  *                                  buffer_size)
  * 
  * cpdef int64_t declare_group(char * name,             # <<<<<<<<<<<<<<
@@ -772,7 +805,7 @@ struct __pyx_opt_args_5adios_declare_group {
   int stats;
 };
 
-/* "adios.pyx":327
+/* "adios.pyx":380
  *     return id
  * 
  * cpdef int define_var(int64_t group_id,             # <<<<<<<<<<<<<<
@@ -786,8 +819,8 @@ struct __pyx_opt_args_5adios_define_var {
   char *local_offsets;
 };
 
-/* "adios.pyx":354
- *                                    var)
+/* "adios.pyx":450
+ *                                         <void *> val_.data)
  * 
  * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
  *                          char * method,
@@ -799,7 +832,19 @@ struct __pyx_opt_args_5adios_select_method {
   char *base_path;
 };
 
-/* "adios.pyx":487
+/* "adios.pyx":464
+ * ## ====================
+ * 
+ * cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):             # <<<<<<<<<<<<<<
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None
+ */
+struct __pyx_opt_args_5adios_adios2npdtype {
+  int __pyx_n;
+  int strlen;
+};
+
+/* "adios.pyx":592
  * 
  * """ Call adios_read_init_method """
  * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
@@ -813,7 +858,7 @@ struct __pyx_opt_args_5adios_read_init {
   char *parameters;
 };
 
-/* "adios.pyx":495
+/* "adios.pyx":600
  * 
  * """ Call adios_read_finalize_method """
  * cpdef int read_finalize(char * method_name = "BP"):             # <<<<<<<<<<<<<<
@@ -825,12 +870,12 @@ struct __pyx_opt_args_5adios_read_finalize {
   char *method_name;
 };
 
-/* "adios.pyx":568
+/* "adios.pyx":736
  *         printfile(self.fp)
  * 
  *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
- *         return adios_advance_step(self.fp, last, timeout_sec)
- * 
+ *         """
+ *         Advance a timestep for stream reader.
  */
 struct __pyx_opt_args_5adios_4file_advance {
   int __pyx_n;
@@ -838,12 +883,12 @@ struct __pyx_opt_args_5adios_4file_advance {
   float timeout_sec;
 };
 
-/* "adios.pyx":611
+/* "adios.pyx":888
+ *         self.nsteps = self.vp.nsteps
+ * 
+ *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):             # <<<<<<<<<<<<<<
+ *         """ Perform read.
  * 
- *     """ Call adios_schedule_read and adios_perform_reads """
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):             # <<<<<<<<<<<<<<
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):
  */
 struct __pyx_opt_args_5adios_3var_read {
   int __pyx_n;
@@ -851,14 +896,15 @@ struct __pyx_opt_args_5adios_3var_read {
   PyObject *count;
   PyObject *from_steps;
   PyObject *nsteps;
+  PyObject *fill;
 };
 
-/* "adios.pyx":500
+/* "adios.pyx":605
  * 
- * """ Python class for ADIOS_FILE structure """
+ * ## Python class for ADIOS_FILE structure
  * cdef class file:             # <<<<<<<<<<<<<<
- *     """ Private Memeber """
- *     cpdef ADIOS_FILE * fp
+ *     """
+ *     file class for Adios file read and write.
  */
 struct __pyx_obj_5adios_file {
   PyObject_HEAD
@@ -872,18 +918,18 @@ struct __pyx_obj_5adios_file {
   int endianness;
   int version;
   int file_size;
+  int is_stream;
   PyObject *var;
   PyObject *attr;
-  int is_stream;
 };
 
 
-/* "adios.pyx":572
+/* "adios.pyx":798
+ *                  self.file_size)
  * 
- * """ Python class for ADIOS_VARINFO structure """
  * cdef class var:             # <<<<<<<<<<<<<<
- *     """ Private Memeber """
- *     cdef file file
+ *     """
+ *     Adios variable class.
  */
 struct __pyx_obj_5adios_var {
   PyObject_HEAD
@@ -892,20 +938,152 @@ struct __pyx_obj_5adios_var {
   ADIOS_VARINFO *vp;
   PyObject *name;
   int varid;
-  PyObject *type;
+  PyArray_Descr *dtype;
   int ndim;
   PyObject *dims;
   int nsteps;
 };
 
 
+/* "adios.pyx":1063
+ *                          nsteps=nsteps_)
+ * 
+ * cdef class attr:             # <<<<<<<<<<<<<<
+ *     """
+ *     Adios attribute class.
+ */
+struct __pyx_obj_5adios_attr {
+  PyObject_HEAD
+  struct __pyx_obj_5adios_file *file;
+  PyObject *name;
+  PyArray_Descr *dtype;
+  PyArrayObject *value;
+};
 
-/* "adios.pyx":500
+
+/* "adios.pyx":1141
+ * 
+ * ## Helper dict
+ * cdef class smartdict(dict):             # <<<<<<<<<<<<<<
+ *     cdef factory
+ *     def __init__(self, factory):
+ */
+struct __pyx_obj_5adios_smartdict {
+  PyDictObject __pyx_base;
+  PyObject *factory;
+};
+
+
+/* "adios.pyx":1153
+ *             self.factory(key, value)
+ * 
+ * cdef class writer:             # <<<<<<<<<<<<<<
+ *     """
+ *     writer class for Adios write.
+ */
+struct __pyx_obj_5adios_writer {
+  PyObject_HEAD
+  int64_t gid;
+  PyObject *fname;
+  PyObject *gname;
+  PyObject *method;
+  PyObject *method_params;
+  int is_noxml;
+  MPI_Comm comm;
+  PyObject *var;
+  PyObject *attr;
+};
+
+
+/* "adios.pyx":1347
+ *                  self.attr.keys())
+ * 
+ * cdef class attrinfo:             # <<<<<<<<<<<<<<
+ *     cdef bytes name
+ *     cdef bint is_static # Use define_byvalue, if True
+ */
+struct __pyx_obj_5adios_attrinfo {
+  PyObject_HEAD
+  PyObject *name;
+  int is_static;
+  PyObject *dtype;
+  PyObject *value;
+};
+
+
+/* "adios.pyx":1400
+ *                  self.dtype)
+ * 
+ * cdef class varinfo:             # <<<<<<<<<<<<<<
+ *     cdef bytes name
+ *     cdef public ldim
+ */
+struct __pyx_obj_5adios_varinfo {
+  PyObject_HEAD
+  PyObject *name;
+  PyObject *ldim;
+  PyObject *gdim;
+  PyObject *offset;
+  PyObject *value;
+};
+
+
+/* "adios.pyx":1010
+ *                 self.nsteps)
+ * 
+ *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1
+ */
+struct __pyx_obj_5adios___pyx_scope_struct____getitem__ {
+  PyObject_HEAD
+  PyObject *__pyx_v_dims_;
+  PyObject *__pyx_v_index_;
+  struct __pyx_obj_5adios_var *__pyx_v_self;
+};
+
+
+/* "adios.pyx":1031
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *__pyx_outer_scope;
+  PyObject *__pyx_v_x;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
+};
+
+
+/* "adios.pyx":1039
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *__pyx_outer_scope;
+  PyObject *__pyx_v_x;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
+};
+
+
+
+/* "adios.pyx":605
  * 
- * """ Python class for ADIOS_FILE structure """
+ * ## Python class for ADIOS_FILE structure
  * cdef class file:             # <<<<<<<<<<<<<<
- *     """ Private Memeber """
- *     cpdef ADIOS_FILE * fp
+ *     """
+ *     file class for Adios file read and write.
  */
 
 struct __pyx_vtabstruct_5adios_file {
@@ -916,20 +1094,23 @@ struct __pyx_vtabstruct_5adios_file {
 static struct __pyx_vtabstruct_5adios_file *__pyx_vtabptr_5adios_file;
 
 
-/* "adios.pyx":572
+/* "adios.pyx":798
+ *                  self.file_size)
  * 
- * """ Python class for ADIOS_VARINFO structure """
  * cdef class var:             # <<<<<<<<<<<<<<
- *     """ Private Memeber """
- *     cdef file file
+ *     """
+ *     Adios variable class.
  */
 
 struct __pyx_vtabstruct_5adios_var {
   PyObject *(*close)(struct __pyx_obj_5adios_var *, int __pyx_skip_dispatch);
+  PyObject *(*advance)(struct __pyx_obj_5adios_var *, int __pyx_skip_dispatch);
   PyObject *(*read)(struct __pyx_obj_5adios_var *, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_3var_read *__pyx_optional_args);
   PyObject *(*printself)(struct __pyx_obj_5adios_var *, int __pyx_skip_dispatch);
 };
 static struct __pyx_vtabstruct_5adios_var *__pyx_vtabptr_5adios_var;
+
+/* --- Runtime support code (head) --- */
 #ifndef CYTHON_REFNANNY
   #define CYTHON_REFNANNY 0
 #endif
@@ -1009,14 +1190,72 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject
 
 static PyObject *__Pyx_GetBuiltinName(PyObject *name);
 
+#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
+    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
+    __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) : \
+    (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) : \
+               __Pyx_GetItemInt_Generic(o, to_py_func(i))))
+#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
+    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
+    __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
+    (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
+                                                              int wraparound, int boundscheck);
+#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
+    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
+    __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
+    (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
+                                                              int wraparound, int boundscheck);
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
+                                                     int is_list, int wraparound, int boundscheck);
+
+static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb);
+static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb);
+
+static void __Pyx_WriteUnraisable(const char *name, int clineno,
+                                  int lineno, const char *filename,
+                                  int full_traceback);
+
+static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyObject* none = _PyList_Extend((PyListObject*)L, v);
+    if (unlikely(!none))
+        return -1;
+    Py_DECREF(none);
+    return 0;
+#else
+    return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v);
+#endif
+}
+
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
+    PyListObject* L = (PyListObject*) list;
+    Py_ssize_t len = Py_SIZE(list);
+    if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
+        Py_INCREF(x);
+        PyList_SET_ITEM(list, len, x);
+        Py_SIZE(list) = len+1;
+        return 0;
+    }
+    return PyList_Append(list, x);
+}
+#else
+#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
+#endif
+
+static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
+    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);
+
 static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);
 
 static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
     const char* function_name);
 
-static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
-    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
 
 static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name);
 
@@ -1026,17 +1265,26 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg
 #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
 #endif
 
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
+static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact);
 
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb);
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb);
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
+#endif
 
-static void __Pyx_WriteUnraisable(const char *name, int clineno,
-                                  int lineno, const char *filename,
-                                  int full_traceback);
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
 
-static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
-    const char *name, int exact);
+#include <string.h>
+
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);
+
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals);
+
+#if PY_MAJOR_VERSION >= 3
+#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
+#else
+#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
+#endif
 
 #if CYTHON_COMPILING_IN_CPYTHON
 static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) {
@@ -1054,43 +1302,57 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) {
 #define __Pyx_ListComp_Append(L,x) PyList_Append(L,x)
 #endif
 
-#include <string.h>
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
+#else
+#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
+#endif
 
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);
+static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg);
 
-#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
-    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
-    __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) : \
-    (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) : \
-               __Pyx_GetItemInt_Generic(o, to_py_func(i))))
-#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
-    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
-    __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
-    (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck);
-#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
-    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
-    __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
-    (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck);
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
-                                                     int is_list, int wraparound, int boundscheck);
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d);
 
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
-#endif
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
 
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Keys(PyObject* d);
+
+static CYTHON_INLINE int __Pyx_PySequence_Contains(PyObject* item, PyObject* seq, int eq) {
+    int result = PySequence_Contains(seq, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+}
+
+static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value);
+
+#define __Pyx_PyObject_DelSlice(obj, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound) \
+    __Pyx_PyObject_SetSlice(obj, (PyObject*)NULL, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound)
+static CYTHON_INLINE int __Pyx_PyObject_SetSlice(
+        PyObject* obj, PyObject* value, Py_ssize_t cstart, Py_ssize_t cstop,
+        PyObject** py_start, PyObject** py_stop, PyObject** py_slice,
+        int has_cstart, int has_cstop, int wraparound);
+
+static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname);
+
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
+        PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
+        PyObject** py_start, PyObject** py_stop, PyObject** py_slice,
+        int has_cstart, int has_cstop, int wraparound);
 
 #if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
+static CYTHON_INLINE PyObject* __Pyx_PyList_GetSlice(PyObject* src, Py_ssize_t start, Py_ssize_t stop);
+static CYTHON_INLINE PyObject* __Pyx_PyTuple_GetSlice(PyObject* src, Py_ssize_t start, Py_ssize_t stop);
 #else
-#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
+#define __Pyx_PyList_GetSlice(seq, start, stop)   PySequence_GetSlice(seq, start, stop)
+#define __Pyx_PyTuple_GetSlice(seq, start, stop)  PySequence_GetSlice(seq, start, stop)
+#endif
+
+#ifndef __PYX_FORCE_INIT_THREADS
+  #define __PYX_FORCE_INIT_THREADS 0
 #endif
 
+static CYTHON_INLINE int __Pyx_div_int(int, int); /* proto */
+
+#define UNARY_NEG_WOULD_OVERFLOW(x)            (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
+
 #if PY_MAJOR_VERSION >= 3
 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
     PyObject *value;
@@ -1111,6 +1373,23 @@ static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
     #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key)
 #endif
 
+#if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o,n,NULL)
+static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) {
+    PyTypeObject* tp = Py_TYPE(obj);
+    if (likely(tp->tp_setattro))
+        return tp->tp_setattro(obj, attr_name, value);
+#if PY_MAJOR_VERSION < 3
+    if (likely(tp->tp_setattr))
+        return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value);
+#endif
+    return PyObject_SetAttr(obj, attr_name, value);
+}
+#else
+#define __Pyx_PyObject_DelAttrStr(o,n)   PyObject_DelAttr(o,n)
+#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
+#endif
+
 static CYTHON_INLINE int __Pyx_IterFinish(void);
 
 static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name);
@@ -1133,8 +1412,6 @@ static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict,
 static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos,
                                               PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict);
 
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
-
 static int __Pyx_SetVtable(PyObject *dict, void *vtable);
 
 static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases);
@@ -1161,10 +1438,6 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
 static void __Pyx_AddTraceback(const char *funcname, int c_line,
                                int py_line, const char *filename);
 
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
-
-static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
-
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);
 
 static CYTHON_INLINE MPI_Comm __Pyx_PyInt_As_MPI_Comm(PyObject *);
@@ -1173,8 +1446,12 @@ static CYTHON_INLINE int64_t __Pyx_PyInt_As_int64_t(PyObject *);
 
 static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *);
 
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
+
 static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
 
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
+
 static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int64_t(int64_t value);
 
 static int __Pyx_Print(PyObject*, PyObject *, int);
@@ -1289,6 +1566,39 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
     #endif
 #endif
 
+static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type);
+
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);
+
+#define __Pyx_Generator_USED
+#include <structmember.h>
+#include <frameobject.h>
+typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
+typedef struct {
+    PyObject_HEAD
+    __pyx_generator_body_t body;
+    PyObject *closure;
+    PyObject *exc_type;
+    PyObject *exc_value;
+    PyObject *exc_traceback;
+    PyObject *gi_weakreflist;
+    PyObject *classobj;
+    PyObject *yieldfrom;
+    PyObject *gi_name;
+    PyObject *gi_qualname;
+    int resume_label;
+    char is_running;
+} __pyx_GeneratorObject;
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure, PyObject *name, PyObject *qualname);
+static int __pyx_Generator_init(void);
+static int __Pyx_Generator_clear(PyObject* self);
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
+#else
+#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
+#endif
+
 static int __Pyx_check_binary_version(void);
 
 #if !defined(__Pyx_PyIdentifier_FromString)
@@ -1309,6 +1619,7 @@ static PyObject *__pyx_f_5adios_4file_close(struct __pyx_obj_5adios_file *__pyx_
 static PyObject *__pyx_f_5adios_4file_printself(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
 static PyObject *__pyx_f_5adios_4file_advance(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_4file_advance *__pyx_optional_args); /* proto*/
 static PyObject *__pyx_f_5adios_3var_close(struct __pyx_obj_5adios_var *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
+static PyObject *__pyx_f_5adios_3var_advance(struct __pyx_obj_5adios_var *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
 static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_3var_read *__pyx_optional_args); /* proto*/
 static PyObject *__pyx_f_5adios_3var_printself(struct __pyx_obj_5adios_var *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
 
@@ -1341,18 +1652,31 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, cha
 
 /* Module declarations from 'cython' */
 
+/* Module declarations from 'cpython.string' */
+
 /* Module declarations from 'libc.stdint' */
 
 /* Module declarations from 'adios' */
 static PyTypeObject *__pyx_ptype_5adios_file = 0;
 static PyTypeObject *__pyx_ptype_5adios_var = 0;
+static PyTypeObject *__pyx_ptype_5adios_attr = 0;
+static PyTypeObject *__pyx_ptype_5adios_smartdict = 0;
+static PyTypeObject *__pyx_ptype_5adios_writer = 0;
+static PyTypeObject *__pyx_ptype_5adios_attrinfo = 0;
+static PyTypeObject *__pyx_ptype_5adios_varinfo = 0;
+static PyTypeObject *__pyx_ptype_5adios___pyx_scope_struct____getitem__ = 0;
+static PyTypeObject *__pyx_ptype_5adios___pyx_scope_struct_1_genexpr = 0;
+static PyTypeObject *__pyx_ptype_5adios___pyx_scope_struct_2_genexpr = 0;
+static char **__pyx_f_5adios_to_cstring_array(PyObject *); /*proto*/
+static PyObject *__pyx_f_5adios___parse_index(PyObject *, PyObject *, int __pyx_skip_dispatch); /*proto*/
 static PyObject *__pyx_f_5adios_init(char *, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_init *__pyx_optional_args); /*proto*/
 static int64_t __pyx_f_5adios_open(char *, char *, char *, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_open *__pyx_optional_args); /*proto*/
 static int64_t __pyx_f_5adios_set_group_size(int64_t, uint64_t, int __pyx_skip_dispatch); /*proto*/
-static int __pyx_f_5adios_write(int64_t, char *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/
+static int __pyx_f_5adios_write(int64_t, char *, PyObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_write *__pyx_optional_args); /*proto*/
 static int __pyx_f_5adios_write_int(int64_t, char *, int, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_5adios_write_long(int64_t, char *, long, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_5adios_write_float(int64_t, char *, float, int __pyx_skip_dispatch); /*proto*/
+static int __pyx_f_5adios_write_double(int64_t, char *, double, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_5adios_read(int64_t, char *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_5adios_close(int64_t, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_5adios_finalize(int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_finalize *__pyx_optional_args); /*proto*/
@@ -1361,102 +1685,159 @@ static int __pyx_f_5adios_allocate_buffer(int, uint64_t, int __pyx_skip_dispatch
 static int64_t __pyx_f_5adios_declare_group(char *, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_declare_group *__pyx_optional_args); /*proto*/
 static int __pyx_f_5adios_define_var(int64_t, char *, char *, int, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_define_var *__pyx_optional_args); /*proto*/
 static int __pyx_f_5adios_define_attribute(int64_t, char *, char *, int, char *, char *, int __pyx_skip_dispatch); /*proto*/
+static int __pyx_f_5adios_define_attribute_byvalue(int64_t, char *, char *, PyObject *, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_5adios_select_method(int64_t, char *, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_select_method *__pyx_optional_args); /*proto*/
-static PyObject *__pyx_f_5adios_adios2nptype(ADIOS_DATATYPES); /*proto*/
+static PyArray_Descr *__pyx_f_5adios_adios2npdtype(ADIOS_DATATYPES, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_adios2npdtype *__pyx_optional_args); /*proto*/
 static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *); /*proto*/
 static PyObject *__pyx_f_5adios_printvar(ADIOS_VARINFO *); /*proto*/
 static ADIOS_READ_METHOD __pyx_f_5adios_str2adiosreadmethod(PyObject *); /*proto*/
-static PyObject *__pyx_f_5adios_np2adiostype(PyObject *, int __pyx_skip_dispatch); /*proto*/
+static PyObject *__pyx_f_5adios_np2adiostype(PyArray_Descr *, int __pyx_skip_dispatch); /*proto*/
+static PyObject *__pyx_f_5adios_adiostype2string(ADIOS_DATATYPES, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_5adios_read_init(int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_read_init *__pyx_optional_args); /*proto*/
 static int __pyx_f_5adios_read_finalize(int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_read_finalize *__pyx_optional_args); /*proto*/
 #define __Pyx_MODULE_NAME "adios"
 int __pyx_module_is_main_adios = 0;
 
 /* Implementation of 'adios' */
+static PyObject *__pyx_builtin_xrange;
+static PyObject *__pyx_builtin_Ellipsis;
 static PyObject *__pyx_builtin_range;
+static PyObject *__pyx_builtin_KeyError;
+static PyObject *__pyx_builtin_TypeError;
+static PyObject *__pyx_builtin_IndexError;
+static PyObject *__pyx_builtin_zip;
+static PyObject *__pyx_builtin_NotImplementedError;
 static PyObject *__pyx_builtin_ValueError;
 static PyObject *__pyx_builtin_RuntimeError;
-static PyObject *__pyx_pf_5adios_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_config, MPI_Comm __pyx_v_comm); /* proto */
-static PyObject *__pyx_pf_5adios_2open(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, MPI_Comm __pyx_v_comm); /* proto */
-static PyObject *__pyx_pf_5adios_4set_group_size(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size); /* proto */
-static PyObject *__pyx_pf_5adios_6write(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val); /* proto */
-static PyObject *__pyx_pf_5adios_8write_int(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_5adios_10write_long(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_5adios_12write_float(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_5adios_14read(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val); /* proto */
-static PyObject *__pyx_pf_5adios_16close(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p); /* proto */
-static PyObject *__pyx_pf_5adios_18finalize(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_mype); /* proto */
-static PyObject *__pyx_pf_5adios_20init_noxml(CYTHON_UNUSED PyObject *__pyx_self, MPI_Comm __pyx_v_comm); /* proto */
-static PyObject *__pyx_pf_5adios_22allocate_buffer(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_when, uint64_t __pyx_v_buffer_size); /* proto */
-static PyObject *__pyx_pf_5adios_24declare_group(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_name, char *__pyx_v_time_index, int __pyx_v_stats); /* proto */
-static PyObject *__pyx_pf_5adios_26define_var(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_dimensions, char *__pyx_v_global_dimensions, char *__pyx_v_local_offsets); /* proto */
-static PyObject *__pyx_pf_5adios_28define_attribute(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_value, char *__pyx_v_var); /* proto */
-static PyObject *__pyx_pf_5adios_30select_method(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_method, char *__pyx_v_parameters, char *__pyx_v_base_path); /* proto */
-static PyObject *__pyx_pf_5adios_32np2adiostype(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_nptype); /* proto */
-static PyObject *__pyx_pf_5adios_34read_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name, MPI_Comm __pyx_v_comm, char *__pyx_v_parameters); /* proto */
-static PyObject *__pyx_pf_5adios_36read_finalize(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name); /* proto */
-static int __pyx_pf_5adios_4file___init__(struct __pyx_obj_5adios_file *__pyx_v_self, char *__pyx_v_fname, char *__pyx_v_method_name, MPI_Comm __pyx_v_comm, PyObject *__pyx_v_is_stream, ADIOS_LOCKMODE __pyx_v_lock_mode, float __pyx_v_timeout_sec); /* proto */
-static PyObject *__pyx_pf_5adios_4file_2__del__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_5adios_4file_4close(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_5adios_4file_6printself(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_5adios_4file_8advance(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_v_last, float __pyx_v_timeout_sec); /* proto */
+static PyObject *__pyx_pf_5adios___parse_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_index, PyObject *__pyx_v_ndim); /* proto */
+static PyObject *__pyx_pf_5adios_2init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_config, MPI_Comm __pyx_v_comm); /* proto */
+static PyObject *__pyx_pf_5adios_4open(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, MPI_Comm __pyx_v_comm); /* proto */
+static PyObject *__pyx_pf_5adios_6set_group_size(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size); /* proto */
+static PyObject *__pyx_pf_5adios_8write(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyObject *__pyx_v_val, PyObject *__pyx_v_dtype); /* proto */
+static PyObject *__pyx_pf_5adios_10write_int(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_5adios_12write_long(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_5adios_14write_float(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_5adios_16write_double(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, double __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_5adios_18read(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_5adios_20close(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p); /* proto */
+static PyObject *__pyx_pf_5adios_22finalize(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_mype); /* proto */
+static PyObject *__pyx_pf_5adios_24init_noxml(CYTHON_UNUSED PyObject *__pyx_self, MPI_Comm __pyx_v_comm); /* proto */
+static PyObject *__pyx_pf_5adios_26allocate_buffer(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_when, uint64_t __pyx_v_buffer_size); /* proto */
+static PyObject *__pyx_pf_5adios_28declare_group(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_name, char *__pyx_v_time_index, int __pyx_v_stats); /* proto */
+static PyObject *__pyx_pf_5adios_30define_var(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_dimensions, char *__pyx_v_global_dimensions, char *__pyx_v_local_offsets); /* proto */
+static PyObject *__pyx_pf_5adios_32define_attribute(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_value, char *__pyx_v_var); /* proto */
+static PyObject *__pyx_pf_5adios_34define_attribute_byvalue(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, PyObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_5adios_36select_method(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_method, char *__pyx_v_parameters, char *__pyx_v_base_path); /* proto */
+static PyObject *__pyx_pf_5adios_38adios2npdtype(CYTHON_UNUSED PyObject *__pyx_self, ADIOS_DATATYPES __pyx_v_t, int __pyx_v_strlen); /* proto */
+static PyObject *__pyx_pf_5adios_40np2adiostype(CYTHON_UNUSED PyObject *__pyx_self, PyArray_Descr *__pyx_v_nptype); /* proto */
+static PyObject *__pyx_pf_5adios_42adiostype2string(CYTHON_UNUSED PyObject *__pyx_self, ADIOS_DATATYPES __pyx_v_type); /* proto */
+static PyObject *__pyx_pf_5adios_44read_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name, MPI_Comm __pyx_v_comm, char *__pyx_v_parameters); /* proto */
+static PyObject *__pyx_pf_5adios_46read_finalize(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name); /* proto */
 static PyObject *__pyx_pf_5adios_4file_4name___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_4file_4name_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_5adios_4file_4name_4__del__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_5adios_4file_5nvars___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_4file_5nvars_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_5adios_4file_6nattrs___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_4file_6nattrs_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_5adios_4file_12current_step___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_4file_12current_step_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_5adios_4file_9last_step___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_4file_9last_step_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_5adios_4file_10endianness___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_4file_10endianness_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_5adios_4file_7version___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_4file_7version_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_5adios_4file_9file_size___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_4file_9file_size_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static PyObject *__pyx_pf_5adios_4file_10file_sizec___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_4file_9is_stream___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_4file___init__(struct __pyx_obj_5adios_file *__pyx_v_self, char *__pyx_v_fname, char *__pyx_v_method_name, MPI_Comm __pyx_v_comm, PyObject *__pyx_v_is_stream, ADIOS_LOCKMODE __pyx_v_lock_mode, float __pyx_v_timeout_sec); /* proto */
+static PyObject *__pyx_pf_5adios_4file_2__del__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_4file_4close(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_4file_6printself(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_4file_8advance(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_v_last, float __pyx_v_timeout_sec); /* proto */
+static PyObject *__pyx_pf_5adios_4file_10__getitem__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_varname); /* proto */
+static PyObject *__pyx_pf_5adios_4file_12__repr__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_5adios_4file_3var___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
 static int __pyx_pf_5adios_4file_3var_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static int __pyx_pf_5adios_4file_3var_4__del__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_5adios_4file_4attr___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
 static int __pyx_pf_5adios_4file_4attr_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static int __pyx_pf_5adios_4file_4attr_4__del__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_5adios_4file_9is_stream___get__(struct __pyx_obj_5adios_file *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_4file_9is_stream_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_self, struct __pyx_obj_5adios_file *__pyx_v_file, char *__pyx_v_name); /* proto */
-static PyObject *__pyx_pf_5adios_3var_2__del__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_5adios_3var_4close(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_5adios_3var_6read(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_offset, PyObject *__pyx_v_count, PyObject *__pyx_v_from_steps, PyObject *__pyx_v_nsteps); /* proto */
-static PyObject *__pyx_pf_5adios_3var_8printself(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_5adios_3var_4name___get__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_3var_4name_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_5adios_3var_4name_4__del__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_5adios_3var_5varid___get__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_3var_5varid_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_5adios_3var_4type___get__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_3var_4type_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_5adios_3var_4type_4__del__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_3var_5dtype___get__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_5adios_3var_4ndim___get__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_3var_4ndim_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_5adios_3var_4dims___get__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_3var_4dims_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_5adios_3var_4dims_4__del__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_5adios_3var_6nsteps___get__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
-static int __pyx_pf_5adios_3var_6nsteps_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_5adios_38readvar(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname, PyObject *__pyx_v_varname); /* proto */
-static PyObject *__pyx_pf_5adios_40bpls(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname); /* proto */
+static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_self, struct __pyx_obj_5adios_file *__pyx_v_file, char *__pyx_v_name); /* proto */
+static PyObject *__pyx_pf_5adios_3var_2__del__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_3var_4close(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_3var_6advance(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_3var_8read(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_offset, PyObject *__pyx_v_count, PyObject *__pyx_v_from_steps, PyObject *__pyx_v_nsteps, PyObject *__pyx_v_fill); /* proto */
+static PyObject *__pyx_pf_5adios_3var_10printself(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_3var_12__repr__(struct __pyx_obj_5adios_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_3var_11__getitem___genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_5adios_3var_11__getitem___3genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_5adios_3var_14__getitem__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
+static PyObject *__pyx_pf_5adios_4attr_4name___get__(struct __pyx_obj_5adios_attr *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_4attr_5dtype___get__(struct __pyx_obj_5adios_attr *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_4attr_5value___get__(struct __pyx_obj_5adios_attr *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_4attr___init__(struct __pyx_obj_5adios_attr *__pyx_v_self, struct __pyx_obj_5adios_file *__pyx_v_file, char *__pyx_v_name); /* proto */
+static PyObject *__pyx_pf_5adios_4attr_2__repr__(struct __pyx_obj_5adios_attr *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_9smartdict___init__(struct __pyx_obj_5adios_smartdict *__pyx_v_self, PyObject *__pyx_v_factory); /* proto */
+static int __pyx_pf_5adios_9smartdict_2__setitem__(struct __pyx_obj_5adios_smartdict *__pyx_v_self, PyObject *__pyx_v_key, PyObject *__pyx_v_value); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_5fname___get__(struct __pyx_obj_5adios_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_5gname___get__(struct __pyx_obj_5adios_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_8is_noxml___get__(struct __pyx_obj_5adios_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_3var___get__(struct __pyx_obj_5adios_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_4attr___get__(struct __pyx_obj_5adios_writer *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_6writer___init__(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_fname, int __pyx_v_is_noxml, MPI_Comm __pyx_v_comm); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_2declare_group(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_gname, char *__pyx_v_method, char *__pyx_v_method_params); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_4define_var(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_varname, PyObject *__pyx_v_ldim, PyObject *__pyx_v_gdim, PyObject *__pyx_v_offset); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_6define_attr(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_attrname); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_8define_dynamic_attr(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_attrname, char *__pyx_v_varname, PyObject *__pyx_v_dtype); /* proto */
+static int __pyx_pf_5adios_6writer_10__setitem__(struct __pyx_obj_5adios_writer *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_12__getitem__(struct __pyx_obj_5adios_writer *__pyx_v_self, PyObject *__pyx_v_name); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_14close(struct __pyx_obj_5adios_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_6writer_16__repr__(struct __pyx_obj_5adios_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_8attrinfo_4name___get__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_8attrinfo_9is_static___get__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_8attrinfo_5dtype___get__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_8attrinfo_5value___get__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_8attrinfo_5value_2__set__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_5adios_8attrinfo___init__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self, char *__pyx_v_name, PyObject *__pyx_v_value, PyObject *__pyx_v_dtype, int __pyx_v_is_static); /* proto */
+static PyObject *__pyx_pf_5adios_8attrinfo_2define(struct __pyx_obj_5adios_attrinfo *__pyx_v_self, int64_t __pyx_v_gid); /* proto */
+static PyObject *__pyx_pf_5adios_8attrinfo_4__repr__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_7varinfo___init__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, char *__pyx_v_name, PyObject *__pyx_v_ldim, PyObject *__pyx_v_gdim, PyObject *__pyx_v_offset); /* proto */
+static PyObject *__pyx_pf_5adios_7varinfo_2define(struct __pyx_obj_5adios_varinfo *__pyx_v_self, int64_t __pyx_v_gid); /* proto */
+static PyObject *__pyx_pf_5adios_7varinfo_4bytes(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_7varinfo_6write(struct __pyx_obj_5adios_varinfo *__pyx_v_self, int64_t __pyx_v_fd); /* proto */
+static PyObject *__pyx_pf_5adios_7varinfo_8__repr__(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_7varinfo_4ldim___get__(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_7varinfo_4ldim_2__set__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_5adios_7varinfo_4ldim_4__del__(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_7varinfo_4gdim___get__(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_7varinfo_4gdim_2__set__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_5adios_7varinfo_4gdim_4__del__(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_7varinfo_6offset___get__(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_7varinfo_6offset_2__set__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_5adios_7varinfo_6offset_4__del__(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_7varinfo_5value___get__(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_5adios_7varinfo_5value_2__set__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_5adios_7varinfo_5value_4__del__(struct __pyx_obj_5adios_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_5adios_48readvar(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname, PyObject *__pyx_v_varname); /* proto */
+static PyObject *__pyx_pf_5adios_50bpls(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname); /* proto */
 static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */
 static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */
 static PyObject *__pyx_tp_new_5adios_file(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
 static PyObject *__pyx_tp_new_5adios_var(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_5adios_attr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_5adios_smartdict(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_5adios_writer(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_5adios_attrinfo(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_5adios_varinfo(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_5adios___pyx_scope_struct____getitem__(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_5adios___pyx_scope_struct_1_genexpr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_5adios___pyx_scope_struct_2_genexpr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
 static char __pyx_k_B[] = "B";
 static char __pyx_k_H[] = "H";
 static char __pyx_k_I[] = "I";
 static char __pyx_k_L[] = "L";
 static char __pyx_k_O[] = "O";
 static char __pyx_k_Q[] = "Q";
+static char __pyx_k_S[] = "S";
 static char __pyx_k_b[] = "b";
 static char __pyx_k_d[] = "d";
 static char __pyx_k_f[] = "f";
@@ -1466,39 +1847,51 @@ static char __pyx_k_i[] = "i";
 static char __pyx_k_k[] = "k";
 static char __pyx_k_l[] = "l";
 static char __pyx_k_q[] = "q";
+static char __pyx_k_t[] = "t";
 static char __pyx_k_v[] = "v";
+static char __pyx_k_w[] = "w";
 static char __pyx_k_BP[] = "BP";
 static char __pyx_k_NO[] = "NO";
 static char __pyx_k_Zd[] = "Zd";
 static char __pyx_k_Zf[] = "Zf";
 static char __pyx_k_Zg[] = "Zg";
-static char __pyx_k__4[] = "";
-static char __pyx_k__8[] = "/";
+static char __pyx_k__7[] = "";
 static char __pyx_k_fh[] = "fh";
 static char __pyx_k_fp[] = "fp";
 static char __pyx_k_np[] = "np";
 static char __pyx_k_vp[] = "vp";
 static char __pyx_k_NOW[] = "NOW";
 static char __pyx_k_YES[] = "YES";
-static char __pyx_k_all[] = "all";
+static char __pyx_k__11[] = "/";
+static char __pyx_k__31[] = " ";
+static char __pyx_k__33[] = "(,)";
+static char __pyx_k_any[] = "any";
 static char __pyx_k_doc[] = "__doc__";
 static char __pyx_k_end[] = "end";
+static char __pyx_k_get[] = "get";
 static char __pyx_k_str[] = "str_";
 static char __pyx_k_val[] = "val";
 static char __pyx_k_var[] = "var";
+static char __pyx_k_zip[] = "zip";
 static char __pyx_k_FLAG[] = "FLAG";
 static char __pyx_k_ICEE[] = "ICEE";
+static char __pyx_k_args[] = "args";
 static char __pyx_k_bool[] = "bool_";
 static char __pyx_k_bpls[] = "bpls";
 static char __pyx_k_byte[] = "byte";
+static char __pyx_k_char[] = "char";
 static char __pyx_k_comm[] = "comm";
 static char __pyx_k_copy[] = "copy";
 static char __pyx_k_dims[] = "dims";
 static char __pyx_k_fd_p[] = "fd_p";
 static char __pyx_k_file[] = "file";
 static char __pyx_k_fill[] = "fill";
+static char __pyx_k_gdim[] = "gdim";
+static char __pyx_k_init[] = "__init__";
 static char __pyx_k_int8[] = "int8";
+static char __pyx_k_keys[] = "keys";
 static char __pyx_k_last[] = "last";
+static char __pyx_k_ldim[] = "ldim";
 static char __pyx_k_long[] = "long";
 static char __pyx_k_main[] = "__main__";
 static char __pyx_k_mode[] = "mode";
@@ -1508,7 +1901,9 @@ static char __pyx_k_ndim[] = "ndim";
 static char __pyx_k_path[] = "path";
 static char __pyx_k_read[] = "read";
 static char __pyx_k_real[] = "real";
+static char __pyx_k_send[] = "send";
 static char __pyx_k_size[] = "size";
+static char __pyx_k_step[] = "step";
 static char __pyx_k_test[] = "__test__";
 static char __pyx_k_type[] = "type";
 static char __pyx_k_vars[] = "vars";
@@ -1520,6 +1915,7 @@ static char __pyx_k_LATER[] = "LATER";
 static char __pyx_k_adios[] = "adios";
 static char __pyx_k_array[] = "array";
 static char __pyx_k_attrs[] = "attrs";
+static char __pyx_k_atype[] = "atype";
 static char __pyx_k_bytes[] = "(bytes)";
 static char __pyx_k_close[] = "close";
 static char __pyx_k_count[] = "count";
@@ -1527,7 +1923,9 @@ static char __pyx_k_dtype[] = "dtype";
 static char __pyx_k_flags[] = "flags";
 static char __pyx_k_float[] = "float_";
 static char __pyx_k_fname[] = "fname";
+static char __pyx_k_gname[] = "gname";
 static char __pyx_k_group[] = "group";
+static char __pyx_k_index[] = "index";
 static char __pyx_k_int16[] = "int16";
 static char __pyx_k_int32[] = "int32";
 static char __pyx_k_int64[] = "int64";
@@ -1535,15 +1933,21 @@ static char __pyx_k_numpy[] = "numpy";
 static char __pyx_k_nvars[] = "nvars";
 static char __pyx_k_print[] = "print";
 static char __pyx_k_range[] = "range";
+static char __pyx_k_shape[] = "shape";
 static char __pyx_k_short[] = "short";
 static char __pyx_k_split[] = "split";
 static char __pyx_k_stats[] = "stats";
+static char __pyx_k_strip[] = "strip";
+static char __pyx_k_throw[] = "throw";
 static char __pyx_k_uint8[] = "uint8";
 static char __pyx_k_value[] = "value";
 static char __pyx_k_varid[] = "varid";
+static char __pyx_k_write[] = "write";
 static char __pyx_k_zeros[] = "zeros";
 static char __pyx_k_15s_lu[] = "%15s : %lu";
+static char __pyx_k_POSIX1[] = "POSIX1";
 static char __pyx_k_config[] = "config";
+static char __pyx_k_define[] = "define";
 static char __pyx_k_double[] = "double";
 static char __pyx_k_import[] = "__import__";
 static char __pyx_k_method[] = "method";
@@ -1552,41 +1956,62 @@ static char __pyx_k_nattrs[] = "nattrs";
 static char __pyx_k_nsteps[] = "nsteps";
 static char __pyx_k_offset[] = "offset";
 static char __pyx_k_string[] = "string";
+static char __pyx_k_strlen[] = "strlen";
 static char __pyx_k_uint16[] = "uint16";
 static char __pyx_k_uint32[] = "uint32";
 static char __pyx_k_uint64[] = "uint64";
+static char __pyx_k_values[] = "values";
+static char __pyx_k_xrange[] = "xrange";
 static char __pyx_k_Reading[] = "Reading ... ";
 static char __pyx_k_UNKNOWN[] = "UNKNOWN";
 static char __pyx_k_advance[] = "advance";
+static char __pyx_k_bytes_2[] = "bytes";
 static char __pyx_k_complex[] = "complex_";
+static char __pyx_k_factory[] = "factory";
 static char __pyx_k_float16[] = "float16";
 static char __pyx_k_float32[] = "float32";
 static char __pyx_k_float64[] = "float64";
+static char __pyx_k_genexpr[] = "genexpr";
+static char __pyx_k_indices[] = "indices";
 static char __pyx_k_integer[] = "integer";
 static char __pyx_k_prepare[] = "__prepare__";
 static char __pyx_k_readvar[] = "readvar";
+static char __pyx_k_replace[] = "replace";
+static char __pyx_k_setitem[] = "__setitem__";
+static char __pyx_k_squeeze[] = "squeeze";
 static char __pyx_k_unknown[] = "unknown";
 static char __pyx_k_varname[] = "varname";
 static char __pyx_k_version[] = "version";
 static char __pyx_k_DATATYPE[] = "DATATYPE";
+static char __pyx_k_Ellipsis[] = "Ellipsis";
 static char __pyx_k_FLEXPATH[] = "FLEXPATH";
+static char __pyx_k_KeyError[] = "KeyError";
+static char __pyx_k_attrname[] = "attrname";
 static char __pyx_k_float128[] = "float128";
 static char __pyx_k_group_id[] = "group_id";
+static char __pyx_k_is_noxml[] = "is_noxml";
 static char __pyx_k_itemsize[] = "itemsize";
 static char __pyx_k_iterkeys[] = "iterkeys";
 static char __pyx_k_qualname[] = "__qualname__";
+static char __pyx_k_subtract[] = "subtract";
+static char __pyx_k_var_dict[] = "var: dict";
 static char __pyx_k_AdiosFile[] = "=== AdiosFile ===";
+static char __pyx_k_TypeError[] = "TypeError";
+static char __pyx_k_attr_dict[] = "attr: dict";
 static char __pyx_k_base_path[] = "base_path";
 static char __pyx_k_complex64[] = "complex64";
 static char __pyx_k_complex_2[] = "complex";
 static char __pyx_k_data_size[] = "data_size";
 static char __pyx_k_file_size[] = "file_size";
+static char __pyx_k_is_static[] = "is_static";
 static char __pyx_k_is_stream[] = "is_stream";
+static char __pyx_k_iteritems[] = "iteritems";
 static char __pyx_k_last_step[] = "last_step";
 static char __pyx_k_lock_mode[] = "lock_mode";
 static char __pyx_k_metaclass[] = "__metaclass__";
 static char __pyx_k_printself[] = "printself";
 static char __pyx_k_DATASPACES[] = "DATASPACES";
+static char __pyx_k_IndexError[] = "IndexError";
 static char __pyx_k_ValueError[] = "ValueError";
 static char __pyx_k_complex128[] = "complex128";
 static char __pyx_k_contiguous[] = "contiguous";
@@ -1598,97 +2023,177 @@ static char __pyx_k_parameters[] = "parameters";
 static char __pyx_k_pyx_vtable[] = "__pyx_vtable__";
 static char __pyx_k_time_index[] = "time_index";
 static char __pyx_k_time_steps[] = "time_steps";
+static char __pyx_k_READ_METHOD[] = "READ_METHOD";
 static char __pyx_k_buffer_size[] = "buffer_size";
+static char __pyx_k_gdim_object[] = "gdim: object";
+static char __pyx_k_ldim_object[] = "ldim: object";
 static char __pyx_k_long_double[] = "long_double";
 static char __pyx_k_method_name[] = "method_name";
 static char __pyx_k_timeout_sec[] = "timeout_sec";
 static char __pyx_k_BP_AGGREGATE[] = "BP_AGGREGATE";
 static char __pyx_k_RuntimeError[] = "RuntimeError";
 static char __pyx_k_current_step[] = "current_step";
+static char __pyx_k_string_array[] = "string_array";
+static char __pyx_k_value_object[] = "value: object";
 static char __pyx_k_var_namelist[] = "var_namelist";
 static char __pyx_k_AdiosVariable[] = "=== AdiosVariable ===";
+static char __pyx_k_Value_is_none[] = "Value is none";
 static char __pyx_k_attr_namelist[] = "attr_namelist";
 static char __pyx_k_local_offsets[] = "local_offsets";
+static char __pyx_k_method_params[] = "method_params";
+static char __pyx_k_offset_object[] = "offset: object";
 static char __pyx_k_unsigned_byte[] = "unsigned_byte";
 static char __pyx_k_unsigned_long[] = "unsigned_long";
 static char __pyx_k_double_complex[] = "double_complex";
 static char __pyx_k_unsigned_short[] = "unsigned_short";
 static char __pyx_k_Not_a_valid_var[] = "Not a valid var";
 static char __pyx_k_Not_an_open_var[] = "Not an open var";
+static char __pyx_k_Unhashable_type[] = "Unhashable type";
 static char __pyx_k_Not_an_open_file[] = "Not an open file";
 static char __pyx_k_unsigned_integer[] = "unsigned_integer";
 static char __pyx_k_BUFFER_ALLOC_WHEN[] = "BUFFER_ALLOC_WHEN";
 static char __pyx_k_No_valid_variable[] = "No valid variable";
+static char __pyx_k_The_variable_name[] = " The variable name. ";
 static char __pyx_k_global_dimensions[] = "global_dimensions";
+static char __pyx_k_var_read_line_888[] = "var.read (line 888)";
+static char __pyx_k_The_attribute_name[] = " The attribute name ";
+static char __pyx_k_NotImplementedError[] = "NotImplementedError";
+static char __pyx_k_Internal_variable_id[] = " Internal variable id. ";
 static char __pyx_k_Not_an_open_variable[] = "Not an open variable";
+static char __pyx_k_The_version_of_Adios[] = " The version of Adios. ";
+static char __pyx_k_The_attribute_s_value[] = " The attribute's value ";
+static char __pyx_k_The_filename_to_write[] = " The filename to write. ";
 static char __pyx_k_Use_default_BP_method[] = ". Use default BP method";
-static char __pyx_k_Count_dimension_mismatch[] = "Count dimension mismatch.";
-static char __pyx_k_Offset_dimension_mismatch[] = "Offset dimension mismatch";
-static char __pyx_k_Count_is_larger_than_shape[] = "Count is larger than shape.";
-static char __pyx_k_Step_index_is_out_of_range[] = "Step index is out of range";
+static char __pyx_k_The_size_of_Adios_file[] = " The size of Adios file. ";
+static char __pyx_k_The_last_timestep_index[] = " The last timestep index. ";
+static char __pyx_k_The_number_of_variables[] = " The number of variables. ";
+static char __pyx_k_The_number_of_attributes[] = " The number of attributes. ";
+static char __pyx_k_getitem___locals_genexpr[] = "__getitem__.<locals>.genexpr";
+static char __pyx_k_The_shape_of_the_variable[] = " The shape of the variable. ";
+static char __pyx_k_Too_many_indices_for_data[] = "Too many indices for data";
+static char __pyx_k_The_current_timestep_index[] = " The current timestep index. ";
 static char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous";
+static char __pyx_k_writer_define_var_line_1244[] = "writer.define_var (line 1244)";
+static char __pyx_k_Step_size_d_is_not_supported[] = "Step size (%d) is not supported.";
+static char __pyx_k_Name_index_r_is_not_supported[] = "Name index (%r) is not supported.";
 static char __pyx_k_WARN_Invalid_read_method_name[] = "[WARN] Invalid read method name:";
 static char __pyx_k_Data_type_is_not_supported_yet[] = "Data type is not supported yet";
-static char __pyx_k_ADIOS_is_freely_available_under[] = "\n ADIOS is freely available under the terms of the BSD license described\n in the COPYING file in the top level directory of this source distribution.\n\n Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.\n";
+static char __pyx_k_Define_a_group_associated_with[] = "\n        Define a group associated with the file.\n\n        Args:\n            gname (str): group name.\n            method (str, optional): Adios write method (default: 'POSIX1')\n            method_params (str, optional): parameters for the write method (default: '')\n\n        Example:\n\n        >>>  fw.declare_group('group', method='MPI_, method_params='verbose=3')\n        \n        ";
+static char __pyx_k_Perform_read_Read_data_from_an[] = " Perform read.\n\n        Read data from an ADIOS BP file. Subset reading is\n        supported. Without any options, this will read out a whole\n        data.\n\n        Args:\n            offset (tuple of int, optional): offset (default: ())\n            count (tuple of int, optional): count (default: ())\n            from_steps (int, optional): starting step index (default: None)\n            nsteps (int, optional): number of tim [...]
+static char __pyx_k_The_attribute_type_as_in_numpy[] = " The attribute type as in numpy.dtype ";
+static char __pyx_k_writer_declare_group_line_1222[] = "writer.declare_group (line 1222)";
+static char __pyx_k_AdiosVar_varid_r_dtype_r_ndim_r[] = "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)";
+static char __pyx_k_AdiosVarinfo_name_r_ldim_r_gdim[] = "AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)";
+static char __pyx_k_Boolean_to_indicate_using_No_XM[] = " Boolean to indicate using No-XML or not. ";
+static char __pyx_k_Define_a_variable_associated_wi[] = "\n        Define a variable associated with the file.\n\n        Args:\n            varname (str): variable name.\n            ldim (tuple, optional): local dimension (default: tuple())\n            gdim (tuple, optional): global dimension (default: tuple())\n            offset (tuple, optional): offset (default: tuple())\n\n        Example:\n\n        Write 'temperature' variable of size of 2x3 array.\n\n        >>>  fw.define_var [...]
+static char __pyx_k_Dictionary_of_attributes_to_wri[] = " Dictionary of attributes to write. ";
+static char __pyx_k_Dictionary_of_variables_to_writ[] = " Dictionary of variables to write. ";
+static char __pyx_k_Indicating_reader_type_file_rea[] = " Indicating reader type; file reader or stream reader ";
+static char __pyx_k_Step_index_is_out_of_range_from[] = "Step index is out of range: from_steps=%r, nsteps=%r";
+static char __pyx_k_The_endianness_of_the_stored_da[] = " The endianness of the stored data. ";
+static char __pyx_k_The_filename_or_stream_name_ass[] = " The filename (or stream name) associated with. ";
+static char __pyx_k_The_groupname_associated_with_t[] = " The groupname associated with the file. ";
+static char __pyx_k_The_number_of_dimensions_of_the[] = " The number of dimensions of the variable. ";
+static char __pyx_k_The_number_of_time_steps_of_the[] = " The number of time steps of the variable. ";
 static char __pyx_k_Users_jyc_project_adios_devel_w[] = "/Users/jyc/project/adios-devel/wrappers/numpy/adios.pyx";
+static char __pyx_k_Variable_type_as_in_numpy_dtype[] = " Variable type as in numpy.dtype. ";
+static char __pyx_k_Warning_No_support_yet_s_type_d[] = "Warning: No support yet: %s (type=%d, bytes=%d)";
 static char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)";
+static char __pyx_k_ADIOS_ADIOS_python_module_module[] = "ADIOS: ADIOS python module\n\n.. moduleauthor:: Jong Choi <choij at ornl.gov>\n";
+static char __pyx_k_AdiosAttr_name_r_dtype_r_value_r[] = "AdiosAttr (name=%r, dtype=%r, value=%r)";
+static char __pyx_k_AdiosAttrinfo_name_r_is_static_r[] = "AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)";
+static char __pyx_k_AdiosFile_path_r_nvars_r_var_r_n[] = "AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, current_step=%r, last_step=%r, file_size=%r)";
+static char __pyx_k_AdiosWriter_fname_r_gname_r_meth[] = "AdiosWriter (fname=%r, gname=%r, method=%r, method_params=%r, var=%r, attr=%r)";
+static char __pyx_k_Count_dimension_mismatch_count_d[] = "Count dimension mismatch (count dim: %r)";
 static char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd";
 static char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported";
+static char __pyx_k_Offset_dimension_mismatch_offset[] = "Offset dimension mismatch (offset dim: %r)";
 static char __pyx_k_Only_contiguous_arrays_are_suppo[] = "Only contiguous arrays are supported.";
+static char __pyx_k_Requested_is_larger_than_the_sha[] = "Requested is larger than the shape.";
 static char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous";
 static char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short.";
 static PyObject *__pyx_kp_s_15s_d;
 static PyObject *__pyx_kp_s_15s_lu;
 static PyObject *__pyx_kp_s_15s_s;
+static PyObject *__pyx_kp_s_AdiosAttr_name_r_dtype_r_value_r;
+static PyObject *__pyx_kp_s_AdiosAttrinfo_name_r_is_static_r;
 static PyObject *__pyx_kp_s_AdiosFile;
+static PyObject *__pyx_kp_s_AdiosFile_path_r_nvars_r_var_r_n;
+static PyObject *__pyx_kp_s_AdiosVar_varid_r_dtype_r_ndim_r;
 static PyObject *__pyx_kp_s_AdiosVariable;
+static PyObject *__pyx_kp_s_AdiosVarinfo_name_r_ldim_r_gdim;
+static PyObject *__pyx_kp_s_AdiosWriter_fname_r_gname_r_meth;
 static PyObject *__pyx_n_s_BP;
 static PyObject *__pyx_n_s_BP_AGGREGATE;
 static PyObject *__pyx_n_s_BUFFER_ALLOC_WHEN;
-static PyObject *__pyx_kp_s_Count_dimension_mismatch;
-static PyObject *__pyx_kp_s_Count_is_larger_than_shape;
+static PyObject *__pyx_kp_s_Count_dimension_mismatch_count_d;
 static PyObject *__pyx_n_s_DATASPACES;
 static PyObject *__pyx_n_s_DATATYPE;
 static PyObject *__pyx_n_s_DIMES;
 static PyObject *__pyx_kp_s_Data_type_is_not_supported_yet;
+static PyObject *__pyx_kp_u_Define_a_group_associated_with;
+static PyObject *__pyx_kp_u_Define_a_variable_associated_wi;
+static PyObject *__pyx_n_s_Ellipsis;
 static PyObject *__pyx_n_s_FLAG;
 static PyObject *__pyx_n_s_FLEXPATH;
 static PyObject *__pyx_kp_u_Format_string_allocated_too_shor;
 static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2;
 static PyObject *__pyx_n_s_ICEE;
+static PyObject *__pyx_n_s_IndexError;
+static PyObject *__pyx_n_s_KeyError;
 static PyObject *__pyx_n_s_LATER;
 static PyObject *__pyx_n_s_NO;
 static PyObject *__pyx_n_s_NOW;
+static PyObject *__pyx_kp_s_Name_index_r_is_not_supported;
 static PyObject *__pyx_kp_s_No_valid_variable;
 static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor;
+static PyObject *__pyx_n_s_NotImplementedError;
 static PyObject *__pyx_kp_s_Not_a_valid_var;
 static PyObject *__pyx_kp_s_Not_an_open_file;
 static PyObject *__pyx_kp_s_Not_an_open_var;
 static PyObject *__pyx_kp_s_Not_an_open_variable;
-static PyObject *__pyx_kp_s_Offset_dimension_mismatch;
+static PyObject *__pyx_kp_s_Offset_dimension_mismatch_offset;
 static PyObject *__pyx_kp_s_Only_contiguous_arrays_are_suppo;
+static PyObject *__pyx_kp_u_Perform_read_Read_data_from_an;
+static PyObject *__pyx_n_s_READ_METHOD;
 static PyObject *__pyx_kp_s_Reading;
+static PyObject *__pyx_kp_s_Requested_is_larger_than_the_sha;
 static PyObject *__pyx_n_s_RuntimeError;
-static PyObject *__pyx_kp_s_Step_index_is_out_of_range;
+static PyObject *__pyx_n_s_S;
+static PyObject *__pyx_kp_s_Step_index_is_out_of_range_from;
+static PyObject *__pyx_kp_s_Step_size_d_is_not_supported;
+static PyObject *__pyx_kp_s_Too_many_indices_for_data;
+static PyObject *__pyx_n_s_TypeError;
 static PyObject *__pyx_n_s_UNKNOWN;
+static PyObject *__pyx_kp_s_Unhashable_type;
 static PyObject *__pyx_kp_s_Use_default_BP_method;
 static PyObject *__pyx_kp_s_Users_jyc_project_adios_devel_w;
 static PyObject *__pyx_n_s_ValueError;
+static PyObject *__pyx_kp_s_Value_is_none;
 static PyObject *__pyx_kp_s_WARN_Invalid_read_method_name;
+static PyObject *__pyx_kp_s_Warning_No_support_yet_s_type_d;
 static PyObject *__pyx_n_s_YES;
-static PyObject *__pyx_kp_s__8;
+static PyObject *__pyx_kp_s__11;
+static PyObject *__pyx_kp_s__31;
+static PyObject *__pyx_kp_s__33;
+static PyObject *__pyx_kp_s__7;
 static PyObject *__pyx_n_s_adios;
 static PyObject *__pyx_n_s_advance;
-static PyObject *__pyx_n_s_all;
+static PyObject *__pyx_n_s_any;
+static PyObject *__pyx_n_s_args;
 static PyObject *__pyx_n_s_array;
 static PyObject *__pyx_n_s_attr_namelist;
+static PyObject *__pyx_n_s_attrname;
 static PyObject *__pyx_n_s_attrs;
+static PyObject *__pyx_n_s_atype;
 static PyObject *__pyx_n_s_base_path;
 static PyObject *__pyx_n_s_bool;
 static PyObject *__pyx_n_s_bpls;
 static PyObject *__pyx_n_s_buffer_size;
 static PyObject *__pyx_n_s_byte;
 static PyObject *__pyx_kp_s_bytes;
+static PyObject *__pyx_n_s_bytes_2;
+static PyObject *__pyx_n_s_char;
 static PyObject *__pyx_n_s_close;
 static PyObject *__pyx_n_s_comm;
 static PyObject *__pyx_n_s_complex;
@@ -1701,6 +2206,7 @@ static PyObject *__pyx_n_s_copy;
 static PyObject *__pyx_n_s_count;
 static PyObject *__pyx_n_s_current_step;
 static PyObject *__pyx_n_s_data_size;
+static PyObject *__pyx_n_s_define;
 static PyObject *__pyx_n_s_dimensions;
 static PyObject *__pyx_n_s_dims;
 static PyObject *__pyx_n_s_doc;
@@ -1710,6 +2216,7 @@ static PyObject *__pyx_n_s_dtype;
 static PyObject *__pyx_n_s_end;
 static PyObject *__pyx_n_s_endianness;
 static PyObject *__pyx_n_s_f;
+static PyObject *__pyx_n_s_factory;
 static PyObject *__pyx_n_s_fd_p;
 static PyObject *__pyx_n_s_fh;
 static PyObject *__pyx_n_s_file;
@@ -1724,22 +2231,35 @@ static PyObject *__pyx_n_s_float64;
 static PyObject *__pyx_n_s_fname;
 static PyObject *__pyx_n_s_fp;
 static PyObject *__pyx_n_s_from_steps;
+static PyObject *__pyx_n_s_gdim;
+static PyObject *__pyx_n_s_genexpr;
+static PyObject *__pyx_n_s_get;
+static PyObject *__pyx_n_s_getitem___locals_genexpr;
 static PyObject *__pyx_n_s_global_dimensions;
+static PyObject *__pyx_n_s_gname;
 static PyObject *__pyx_n_s_group;
 static PyObject *__pyx_n_s_group_id;
 static PyObject *__pyx_n_s_group_name;
 static PyObject *__pyx_n_s_import;
+static PyObject *__pyx_n_s_index;
+static PyObject *__pyx_n_s_indices;
+static PyObject *__pyx_n_s_init;
 static PyObject *__pyx_n_s_int16;
 static PyObject *__pyx_n_s_int32;
 static PyObject *__pyx_n_s_int64;
 static PyObject *__pyx_n_s_int8;
 static PyObject *__pyx_n_s_integer;
+static PyObject *__pyx_n_s_is_noxml;
+static PyObject *__pyx_n_s_is_static;
 static PyObject *__pyx_n_s_is_stream;
 static PyObject *__pyx_n_s_itemsize;
+static PyObject *__pyx_n_s_iteritems;
 static PyObject *__pyx_n_s_iterkeys;
 static PyObject *__pyx_n_s_k;
+static PyObject *__pyx_n_s_keys;
 static PyObject *__pyx_n_s_last;
 static PyObject *__pyx_n_s_last_step;
+static PyObject *__pyx_n_s_ldim;
 static PyObject *__pyx_n_s_local_offsets;
 static PyObject *__pyx_n_s_lock_mode;
 static PyObject *__pyx_n_s_long;
@@ -1748,6 +2268,7 @@ static PyObject *__pyx_n_s_main;
 static PyObject *__pyx_n_s_metaclass;
 static PyObject *__pyx_n_s_method;
 static PyObject *__pyx_n_s_method_name;
+static PyObject *__pyx_n_s_method_params;
 static PyObject *__pyx_n_s_mode;
 static PyObject *__pyx_n_s_module;
 static PyObject *__pyx_n_s_mype;
@@ -1772,13 +2293,25 @@ static PyObject *__pyx_n_s_range;
 static PyObject *__pyx_n_s_read;
 static PyObject *__pyx_n_s_readvar;
 static PyObject *__pyx_n_s_real;
+static PyObject *__pyx_n_s_replace;
+static PyObject *__pyx_n_s_send;
+static PyObject *__pyx_n_s_setitem;
+static PyObject *__pyx_n_s_shape;
 static PyObject *__pyx_n_s_short;
 static PyObject *__pyx_n_s_size;
 static PyObject *__pyx_n_s_split;
+static PyObject *__pyx_n_s_squeeze;
 static PyObject *__pyx_n_s_stats;
+static PyObject *__pyx_n_s_step;
 static PyObject *__pyx_n_s_str;
 static PyObject *__pyx_n_s_string;
+static PyObject *__pyx_n_s_string_array;
+static PyObject *__pyx_n_s_strip;
+static PyObject *__pyx_n_s_strlen;
+static PyObject *__pyx_n_s_subtract;
+static PyObject *__pyx_n_s_t;
 static PyObject *__pyx_n_s_test;
+static PyObject *__pyx_n_s_throw;
 static PyObject *__pyx_n_s_time_index;
 static PyObject *__pyx_n_s_time_steps;
 static PyObject *__pyx_n_s_timeout_sec;
@@ -1796,18 +2329,26 @@ static PyObject *__pyx_n_s_unsigned_short;
 static PyObject *__pyx_n_s_v;
 static PyObject *__pyx_n_s_val;
 static PyObject *__pyx_n_s_value;
+static PyObject *__pyx_n_s_values;
 static PyObject *__pyx_n_s_var;
 static PyObject *__pyx_n_s_var_namelist;
+static PyObject *__pyx_kp_u_var_read_line_888;
 static PyObject *__pyx_n_s_varid;
 static PyObject *__pyx_n_s_varname;
 static PyObject *__pyx_n_s_vars;
 static PyObject *__pyx_n_s_version;
 static PyObject *__pyx_n_s_vp;
 static PyObject *__pyx_n_s_when;
+static PyObject *__pyx_n_s_write;
+static PyObject *__pyx_kp_u_writer_declare_group_line_1222;
+static PyObject *__pyx_kp_u_writer_define_var_line_1244;
+static PyObject *__pyx_n_s_xrange;
 static PyObject *__pyx_n_s_zeros;
+static PyObject *__pyx_n_s_zip;
 static PyObject *__pyx_int_0;
 static PyObject *__pyx_int_1;
 static PyObject *__pyx_int_2;
+static PyObject *__pyx_int_3;
 static PyObject *__pyx_int_4;
 static PyObject *__pyx_int_5;
 static PyObject *__pyx_int_6;
@@ -1815,100 +2356,498 @@ static PyObject *__pyx_int_7;
 static PyObject *__pyx_int_9;
 static PyObject *__pyx_int_10;
 static PyObject *__pyx_int_11;
+static PyObject *__pyx_int_12;
 static PyObject *__pyx_int_50;
 static PyObject *__pyx_int_51;
 static PyObject *__pyx_int_52;
 static PyObject *__pyx_int_54;
 static PyObject *__pyx_int_neg_1;
-static MPI_Comm __pyx_k_;
-static MPI_Comm __pyx_k__2;
-static MPI_Comm __pyx_k__3;
+static MPI_Comm __pyx_k__4;
 static MPI_Comm __pyx_k__5;
 static MPI_Comm __pyx_k__6;
-static ADIOS_LOCKMODE __pyx_k__7;
-static PyObject *__pyx_tuple__9;
-static PyObject *__pyx_tuple__10;
-static PyObject *__pyx_tuple__11;
+static MPI_Comm __pyx_k__8;
+static MPI_Comm __pyx_k__9;
+static ADIOS_LOCKMODE __pyx_k__10;
+static MPI_Comm __pyx_k__22;
+static PyObject *__pyx_k__23;
+static PyObject *__pyx_k__24;
+static PyObject *__pyx_k__25;
+static PyObject *__pyx_k__27;
+static PyObject *__pyx_k__28;
+static PyObject *__pyx_k__29;
+static PyObject *__pyx_slice_;
+static PyObject *__pyx_slice__2;
+static PyObject *__pyx_tuple__3;
+static PyObject *__pyx_slice__16;
+static PyObject *__pyx_slice__19;
+static PyObject *__pyx_slice__20;
+static PyObject *__pyx_slice__21;
 static PyObject *__pyx_tuple__12;
 static PyObject *__pyx_tuple__13;
 static PyObject *__pyx_tuple__14;
 static PyObject *__pyx_tuple__15;
-static PyObject *__pyx_tuple__16;
 static PyObject *__pyx_tuple__17;
-static PyObject *__pyx_tuple__19;
-static PyObject *__pyx_codeobj__18;
-static PyObject *__pyx_codeobj__20;
+static PyObject *__pyx_tuple__18;
+static PyObject *__pyx_tuple__26;
+static PyObject *__pyx_tuple__30;
+static PyObject *__pyx_tuple__32;
+static PyObject *__pyx_tuple__34;
+static PyObject *__pyx_tuple__35;
+static PyObject *__pyx_tuple__36;
+static PyObject *__pyx_tuple__37;
+static PyObject *__pyx_tuple__38;
+static PyObject *__pyx_tuple__39;
+static PyObject *__pyx_tuple__40;
+static PyObject *__pyx_tuple__41;
+static PyObject *__pyx_tuple__42;
+static PyObject *__pyx_tuple__43;
+static PyObject *__pyx_tuple__44;
+static PyObject *__pyx_tuple__45;
+static PyObject *__pyx_tuple__47;
+static PyObject *__pyx_codeobj__46;
+static PyObject *__pyx_codeobj__48;
+
+/* "adios.pyx":19
+ * from cpython.string cimport PyString_AsString
+ * 
+ * cdef char ** to_cstring_array(list_str):             # <<<<<<<<<<<<<<
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+ *     for i in xrange(len(list_str)):
+ */
+
+static char **__pyx_f_5adios_to_cstring_array(PyObject *__pyx_v_list_str) {
+  char **__pyx_v_ret;
+  Py_ssize_t __pyx_v_i;
+  char **__pyx_r;
+  __Pyx_RefNannyDeclarations
+  Py_ssize_t __pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  char *__pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("to_cstring_array", 0);
+
+  /* "adios.pyx":20
+ * 
+ * cdef char ** to_cstring_array(list_str):
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))             # <<<<<<<<<<<<<<
+ *     for i in xrange(len(list_str)):
+ *         ret[i] = PyString_AsString(list_str[i])
+ */
+  __pyx_t_1 = PyObject_Length(__pyx_v_list_str); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_ret = ((char **)malloc((__pyx_t_1 * (sizeof(char *)))));
+
+  /* "adios.pyx":21
+ * cdef char ** to_cstring_array(list_str):
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+ *     for i in xrange(len(list_str)):             # <<<<<<<<<<<<<<
+ *         ret[i] = PyString_AsString(list_str[i])
+ *     return ret
+ */
+  __pyx_t_1 = PyObject_Length(__pyx_v_list_str); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
+    __pyx_v_i = __pyx_t_2;
+
+    /* "adios.pyx":22
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+ *     for i in xrange(len(list_str)):
+ *         ret[i] = PyString_AsString(list_str[i])             # <<<<<<<<<<<<<<
+ *     return ret
+ * 
+ */
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_list_str, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = PyString_AsString(__pyx_t_3); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    (__pyx_v_ret[__pyx_v_i]) = __pyx_t_4;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
 
-/* "adios.pyx":259
+  /* "adios.pyx":23
+ *     for i in xrange(len(list_str)):
+ *         ret[i] = PyString_AsString(list_str[i])
+ *     return ret             # <<<<<<<<<<<<<<
+ * 
  * ## ====================
+ */
+  __pyx_r = __pyx_v_ret;
+  goto __pyx_L0;
+
+  /* "adios.pyx":19
+ * from cpython.string cimport PyString_AsString
  * 
- * cpdef init(char * config, MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
- *     return adios_init(config, comm)
+ * cdef char ** to_cstring_array(list_str):             # <<<<<<<<<<<<<<
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+ *     for i in xrange(len(list_str)):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_WriteUnraisable("adios.to_cstring_array", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":278
  * 
+ * 
+ * cpdef __parse_index(index, ndim):             # <<<<<<<<<<<<<<
+ *     # Fix index, handling ellipsis and incomplete slices.
+ *     if not isinstance(index, tuple):
  */
 
-static PyObject *__pyx_pw_5adios_1init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_f_5adios_init(char *__pyx_v_config, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_init *__pyx_optional_args) {
-  MPI_Comm __pyx_v_comm = __pyx_k_;
+static PyObject *__pyx_pw_5adios_1__parse_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_5adios___parse_index(PyObject *__pyx_v_index, PyObject *__pyx_v_ndim, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyObject *__pyx_v_fixed = NULL;
+  PyObject *__pyx_v_length = NULL;
+  PyObject *__pyx_v_slice_ = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  PyObject *(*__pyx_t_5)(PyObject *);
+  PyObject *__pyx_t_6 = NULL;
+  Py_ssize_t __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  int __pyx_t_10;
+  int __pyx_t_11;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("init", 0);
-  if (__pyx_optional_args) {
-    if (__pyx_optional_args->__pyx_n > 0) {
-      __pyx_v_comm = __pyx_optional_args->comm;
+  __Pyx_RefNannySetupContext("__parse_index", 0);
+  __Pyx_INCREF(__pyx_v_index);
+
+  /* "adios.pyx":280
+ * cpdef __parse_index(index, ndim):
+ *     # Fix index, handling ellipsis and incomplete slices.
+ *     if not isinstance(index, tuple):             # <<<<<<<<<<<<<<
+ *         index = (index,)
+ * 
+ */
+  __pyx_t_1 = PyTuple_Check(__pyx_v_index); 
+  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
+  if (__pyx_t_2) {
+
+    /* "adios.pyx":281
+ *     # Fix index, handling ellipsis and incomplete slices.
+ *     if not isinstance(index, tuple):
+ *         index = (index,)             # <<<<<<<<<<<<<<
+ * 
+ *     fixed = []
+ */
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(__pyx_v_index);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index);
+    __Pyx_GIVEREF(__pyx_v_index);
+    __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios.pyx":283
+ *         index = (index,)
+ * 
+ *     fixed = []             # <<<<<<<<<<<<<<
+ *     length = len(index)
+ * 
+ */
+  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_fixed = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":284
+ * 
+ *     fixed = []
+ *     length = len(index)             # <<<<<<<<<<<<<<
+ * 
+ *     for slice_ in index:
+ */
+  __pyx_t_4 = PyObject_Length(__pyx_v_index); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_length = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":286
+ *     length = len(index)
+ * 
+ *     for slice_ in index:             # <<<<<<<<<<<<<<
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ */
+  if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) {
+    __pyx_t_3 = __pyx_v_index; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0;
+    __pyx_t_5 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  for (;;) {
+    if (likely(!__pyx_t_5)) {
+      if (likely(PyList_CheckExact(__pyx_t_3))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_3)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_6); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_6 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_6); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_6 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_6 = __pyx_t_5(__pyx_t_3);
+      if (unlikely(!__pyx_t_6)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_6);
+    }
+    __Pyx_XDECREF_SET(__pyx_v_slice_, __pyx_t_6);
+    __pyx_t_6 = 0;
+
+    /* "adios.pyx":287
+ * 
+ *     for slice_ in index:
+ *         if slice_ is Ellipsis:             # <<<<<<<<<<<<<<
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ *         elif isinstance(slice_, (int, long)):
+ */
+    __pyx_t_2 = (__pyx_v_slice_ == __pyx_builtin_Ellipsis);
+    __pyx_t_1 = (__pyx_t_2 != 0);
+    if (__pyx_t_1) {
+
+      /* "adios.pyx":288
+ *     for slice_ in index:
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))             # <<<<<<<<<<<<<<
+ *         elif isinstance(slice_, (int, long)):
+ *             fixed.append(slice(slice_, slice_+1, None))
+ */
+      __pyx_t_6 = PyNumber_Subtract(__pyx_v_ndim, __pyx_v_length); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_7 = PyList_GET_SIZE(__pyx_v_fixed); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_9 = PyNumber_Subtract(__pyx_t_6, __pyx_t_8); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyNumber_Add(__pyx_t_9, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_INCREF(__pyx_slice_);
+      PyList_SET_ITEM(__pyx_t_9, 0, __pyx_slice_);
+      __Pyx_GIVEREF(__pyx_slice_);
+      { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_9, __pyx_t_8); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_temp);
+        __Pyx_DECREF(__pyx_t_9);
+        __pyx_t_9 = __pyx_temp;
+      }
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_10 = __Pyx_PyList_Extend(__pyx_v_fixed, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      goto __pyx_L6;
+    }
+
+    /* "adios.pyx":289
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ *         elif isinstance(slice_, (int, long)):             # <<<<<<<<<<<<<<
+ *             fixed.append(slice(slice_, slice_+1, None))
+ *         else:
+ */
+    __pyx_t_2 = PyInt_Check(__pyx_v_slice_); 
+    __pyx_t_11 = (__pyx_t_2 != 0);
+    if (!__pyx_t_11) {
+    } else {
+      __pyx_t_1 = __pyx_t_11;
+      goto __pyx_L7_bool_binop_done;
+    }
+    __pyx_t_11 = PyLong_Check(__pyx_v_slice_); 
+    __pyx_t_2 = (__pyx_t_11 != 0);
+    __pyx_t_1 = __pyx_t_2;
+    __pyx_L7_bool_binop_done:;
+    __pyx_t_2 = (__pyx_t_1 != 0);
+    if (__pyx_t_2) {
+
+      /* "adios.pyx":290
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ *         elif isinstance(slice_, (int, long)):
+ *             fixed.append(slice(slice_, slice_+1, None))             # <<<<<<<<<<<<<<
+ *         else:
+ *             fixed.append(slice_)
+ */
+      __pyx_t_9 = PyNumber_Add(__pyx_v_slice_, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_8 = PySlice_New(__pyx_v_slice_, __pyx_t_9, Py_None); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_fixed, __pyx_t_8); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L6;
+    }
+    /*else*/ {
+
+      /* "adios.pyx":292
+ *             fixed.append(slice(slice_, slice_+1, None))
+ *         else:
+ *             fixed.append(slice_)             # <<<<<<<<<<<<<<
+ *         length -= 1
+ * 
+ */
+      __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_fixed, __pyx_v_slice_); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
+    __pyx_L6:;
+
+    /* "adios.pyx":293
+ *         else:
+ *             fixed.append(slice_)
+ *         length -= 1             # <<<<<<<<<<<<<<
+ * 
+ *     index = tuple(fixed)
+ */
+    __pyx_t_8 = PyNumber_InPlaceSubtract(__pyx_v_length, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF_SET(__pyx_v_length, __pyx_t_8);
+    __pyx_t_8 = 0;
+
+    /* "adios.pyx":286
+ *     length = len(index)
+ * 
+ *     for slice_ in index:             # <<<<<<<<<<<<<<
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ */
   }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "adios.pyx":260
+  /* "adios.pyx":295
+ *         length -= 1
  * 
- * cpdef init(char * config, MPI_Comm comm = MPI_COMM_WORLD):
- *     return adios_init(config, comm)             # <<<<<<<<<<<<<<
+ *     index = tuple(fixed)             # <<<<<<<<<<<<<<
+ *     if len(index) < ndim:
+ *         index += (slice(None),) * (ndim-len(index))
+ */
+  __pyx_t_3 = PyList_AsTuple(__pyx_v_fixed); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":296
  * 
- * cpdef int64_t open(char * group_name,
+ *     index = tuple(fixed)
+ *     if len(index) < ndim:             # <<<<<<<<<<<<<<
+ *         index += (slice(None),) * (ndim-len(index))
+ * 
+ */
+  __pyx_t_4 = PyObject_Length(__pyx_v_index); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_8 = PyObject_RichCompare(__pyx_t_3, __pyx_v_ndim, Py_LT); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  if (__pyx_t_2) {
+
+    /* "adios.pyx":297
+ *     index = tuple(fixed)
+ *     if len(index) < ndim:
+ *         index += (slice(None),) * (ndim-len(index))             # <<<<<<<<<<<<<<
+ * 
+ *     return index
+ */
+    __pyx_t_4 = PyObject_Length(__pyx_v_index); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_3 = PyNumber_Subtract(__pyx_v_ndim, __pyx_t_8); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __pyx_t_8 = PyNumber_Multiply(__pyx_tuple__3, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_index, __pyx_t_8); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L9;
+  }
+  __pyx_L9:;
+
+  /* "adios.pyx":299
+ *         index += (slice(None),) * (ndim-len(index))
+ * 
+ *     return index             # <<<<<<<<<<<<<<
+ * 
+ * ## ====================
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(adios_init(__pyx_v_config, __pyx_v_comm)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __Pyx_INCREF(__pyx_v_index);
+  __pyx_r = __pyx_v_index;
   goto __pyx_L0;
 
-  /* "adios.pyx":259
- * ## ====================
+  /* "adios.pyx":278
  * 
- * cpdef init(char * config, MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
- *     return adios_init(config, comm)
  * 
+ * cpdef __parse_index(index, ndim):             # <<<<<<<<<<<<<<
+ *     # Fix index, handling ellipsis and incomplete slices.
+ *     if not isinstance(index, tuple):
  */
 
   /* function exit code */
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("adios.__parse_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_fixed);
+  __Pyx_XDECREF(__pyx_v_length);
+  __Pyx_XDECREF(__pyx_v_slice_);
+  __Pyx_XDECREF(__pyx_v_index);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_1init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_1init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  char *__pyx_v_config;
-  MPI_Comm __pyx_v_comm;
+static PyObject *__pyx_pw_5adios_1__parse_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios___parse_index[] = "__parse_index(index, ndim)";
+static PyObject *__pyx_pw_5adios_1__parse_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_index = 0;
+  PyObject *__pyx_v_ndim = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("init (wrapper)", 0);
+  __Pyx_RefNannySetupContext("__parse_index (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_config,&__pyx_n_s_comm,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_index,&__pyx_n_s_ndim,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -1922,60 +2861,51 @@ static PyObject *__pyx_pw_5adios_1init(PyObject *__pyx_self, PyObject *__pyx_arg
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_config)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_index)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
-          if (value) { values[1] = value; kw_args--; }
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ndim)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("__parse_index", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else {
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        break;
-        default: goto __pyx_L5_argtuple_error;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__parse_index") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-    }
-    __pyx_v_config = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_config) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    if (values[1]) {
-      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[1]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
     } else {
-      __pyx_v_comm = __pyx_k_;
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
+    __pyx_v_index = values[0];
+    __pyx_v_ndim = values[1];
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("init", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__parse_index", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
-  __Pyx_AddTraceback("adios.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.__parse_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_init(__pyx_self, __pyx_v_config, __pyx_v_comm);
+  __pyx_r = __pyx_pf_5adios___parse_index(__pyx_self, __pyx_v_index, __pyx_v_ndim);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_config, MPI_Comm __pyx_v_comm) {
+static PyObject *__pyx_pf_5adios___parse_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_index, PyObject *__pyx_v_ndim) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  struct __pyx_opt_args_5adios_init __pyx_t_2;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("init", 0);
+  __Pyx_RefNannySetupContext("__parse_index", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2.__pyx_n = 1;
-  __pyx_t_2.comm = __pyx_v_comm;
-  __pyx_t_1 = __pyx_f_5adios_init(__pyx_v_config, 0, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_5adios___parse_index(__pyx_v_index, __pyx_v_ndim, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1984,7 +2914,7 @@ static PyObject *__pyx_pf_5adios_init(CYTHON_UNUSED PyObject *__pyx_self, char *
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.__parse_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -1992,48 +2922,202 @@ static PyObject *__pyx_pf_5adios_init(CYTHON_UNUSED PyObject *__pyx_self, char *
   return __pyx_r;
 }
 
-/* "adios.pyx":262
+/* "adios.pyx":305
+ * ## ====================
+ * 
+ * cpdef init(char * config, MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
  *     return adios_init(config, comm)
  * 
- * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
- *                    char * name,
- *                    char * mode,
  */
 
-static PyObject *__pyx_pw_5adios_3open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int64_t __pyx_f_5adios_open(char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_open *__pyx_optional_args) {
-  MPI_Comm __pyx_v_comm = __pyx_k__2;
-  int64_t __pyx_v_fd;
-  CYTHON_UNUSED int __pyx_v_result;
-  int64_t __pyx_r;
+static PyObject *__pyx_pw_5adios_3init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_5adios_init(char *__pyx_v_config, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_init *__pyx_optional_args) {
+  MPI_Comm __pyx_v_comm = __pyx_k__4;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("open", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("init", 0);
   if (__pyx_optional_args) {
     if (__pyx_optional_args->__pyx_n > 0) {
       __pyx_v_comm = __pyx_optional_args->comm;
     }
   }
 
-  /* "adios.pyx":268
- *     cdef int64_t fd
- *     cdef int result
- *     result = adios_open(&fd, group_name, name, mode, comm)             # <<<<<<<<<<<<<<
- *     return fd
+  /* "adios.pyx":306
  * 
- */
-  __pyx_v_result = adios_open((&__pyx_v_fd), __pyx_v_group_name, __pyx_v_name, __pyx_v_mode, __pyx_v_comm);
-
-  /* "adios.pyx":269
- *     cdef int result
- *     result = adios_open(&fd, group_name, name, mode, comm)
- *     return fd             # <<<<<<<<<<<<<<
+ * cpdef init(char * config, MPI_Comm comm = MPI_COMM_WORLD):
+ *     return adios_init(config, comm)             # <<<<<<<<<<<<<<
  * 
- * cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):
+ * cpdef int64_t open(char * group_name,
  */
-  __pyx_r = __pyx_v_fd;
-  goto __pyx_L0;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(adios_init(__pyx_v_config, __pyx_v_comm)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios.pyx":262
+  /* "adios.pyx":305
+ * ## ====================
+ * 
+ * cpdef init(char * config, MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
+ *     return adios_init(config, comm)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_3init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_2init[] = "init(char *config, MPI_Comm comm=MPI_COMM_WORLD)";
+static PyObject *__pyx_pw_5adios_3init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_config;
+  MPI_Comm __pyx_v_comm;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("init (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_config,&__pyx_n_s_comm,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_config)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
+          if (value) { values[1] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_config = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_config) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[1]) {
+      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[1]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_comm = __pyx_k__4;
+    }
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("init", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_2init(__pyx_self, __pyx_v_config, __pyx_v_comm);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_2init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_config, MPI_Comm __pyx_v_comm) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  struct __pyx_opt_args_5adios_init __pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("init", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2.__pyx_n = 1;
+  __pyx_t_2.comm = __pyx_v_comm;
+  __pyx_t_1 = __pyx_f_5adios_init(__pyx_v_config, 0, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":308
+ *     return adios_init(config, comm)
+ * 
+ * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
+ *                    char * name,
+ *                    char * mode,
+ */
+
+static PyObject *__pyx_pw_5adios_5open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int64_t __pyx_f_5adios_open(char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_open *__pyx_optional_args) {
+  MPI_Comm __pyx_v_comm = __pyx_k__5;
+  int64_t __pyx_v_fd;
+  CYTHON_UNUSED int __pyx_v_result;
+  int64_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("open", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_comm = __pyx_optional_args->comm;
+    }
+  }
+
+  /* "adios.pyx":314
+ *     cdef int64_t fd
+ *     cdef int result
+ *     result = adios_open(&fd, group_name, name, mode, comm)             # <<<<<<<<<<<<<<
+ *     return fd
+ * 
+ */
+  __pyx_v_result = adios_open((&__pyx_v_fd), __pyx_v_group_name, __pyx_v_name, __pyx_v_mode, __pyx_v_comm);
+
+  /* "adios.pyx":315
+ *     cdef int result
+ *     result = adios_open(&fd, group_name, name, mode, comm)
+ *     return fd             # <<<<<<<<<<<<<<
+ * 
+ * cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):
+ */
+  __pyx_r = __pyx_v_fd;
+  goto __pyx_L0;
+
+  /* "adios.pyx":308
  *     return adios_init(config, comm)
  * 
  * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
@@ -2048,8 +3132,9 @@ static int64_t __pyx_f_5adios_open(char *__pyx_v_group_name, char *__pyx_v_name,
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_3open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_3open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_5open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_4open[] = "open(char *group_name, char *name, char *mode, MPI_Comm comm=MPI_COMM_WORLD) -> int64_t";
+static PyObject *__pyx_pw_5adios_5open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_group_name;
   char *__pyx_v_name;
   char *__pyx_v_mode;
@@ -2082,12 +3167,12 @@ static PyObject *__pyx_pw_5adios_3open(PyObject *__pyx_self, PyObject *__pyx_arg
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_mode)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
         if (kw_args > 0) {
@@ -2096,7 +3181,7 @@ static PyObject *__pyx_pw_5adios_3open(PyObject *__pyx_self, PyObject *__pyx_arg
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "open") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "open") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -2108,31 +3193,31 @@ static PyObject *__pyx_pw_5adios_3open(PyObject *__pyx_self, PyObject *__pyx_arg
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_group_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_group_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_mode = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_mode) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_group_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_group_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_mode = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_mode) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     if (values[3]) {
-      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[3]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[3]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_comm = __pyx_k__2;
+      __pyx_v_comm = __pyx_k__5;
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.open", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_2open(__pyx_self, __pyx_v_group_name, __pyx_v_name, __pyx_v_mode, __pyx_v_comm);
+  __pyx_r = __pyx_pf_5adios_4open(__pyx_self, __pyx_v_group_name, __pyx_v_name, __pyx_v_mode, __pyx_v_comm);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_2open(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, MPI_Comm __pyx_v_comm) {
+static PyObject *__pyx_pf_5adios_4open(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, MPI_Comm __pyx_v_comm) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int64_t __pyx_t_1;
@@ -2146,7 +3231,7 @@ static PyObject *__pyx_pf_5adios_2open(CYTHON_UNUSED PyObject *__pyx_self, char
   __pyx_t_2.__pyx_n = 1;
   __pyx_t_2.comm = __pyx_v_comm;
   __pyx_t_1 = __pyx_f_5adios_open(__pyx_v_group_name, __pyx_v_name, __pyx_v_mode, 0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -2163,7 +3248,7 @@ static PyObject *__pyx_pf_5adios_2open(CYTHON_UNUSED PyObject *__pyx_self, char
   return __pyx_r;
 }
 
-/* "adios.pyx":271
+/* "adios.pyx":317
  *     return fd
  * 
  * cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):             # <<<<<<<<<<<<<<
@@ -2171,7 +3256,7 @@ static PyObject *__pyx_pf_5adios_2open(CYTHON_UNUSED PyObject *__pyx_self, char
  *     cdef int result
  */
 
-static PyObject *__pyx_pw_5adios_5set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_7set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int64_t __pyx_f_5adios_set_group_size(int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size, CYTHON_UNUSED int __pyx_skip_dispatch) {
   uint64_t __pyx_v_total_size;
   CYTHON_UNUSED int __pyx_v_result;
@@ -2179,7 +3264,7 @@ static int64_t __pyx_f_5adios_set_group_size(int64_t __pyx_v_fd_p, uint64_t __py
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("set_group_size", 0);
 
-  /* "adios.pyx":274
+  /* "adios.pyx":320
  *     cdef uint64_t total_size
  *     cdef int result
  *     result = adios_group_size(fd_p, data_size, &total_size)             # <<<<<<<<<<<<<<
@@ -2188,17 +3273,17 @@ static int64_t __pyx_f_5adios_set_group_size(int64_t __pyx_v_fd_p, uint64_t __py
  */
   __pyx_v_result = adios_group_size(__pyx_v_fd_p, __pyx_v_data_size, (&__pyx_v_total_size));
 
-  /* "adios.pyx":275
+  /* "adios.pyx":321
  *     cdef int result
  *     result = adios_group_size(fd_p, data_size, &total_size)
  *     return total_size             # <<<<<<<<<<<<<<
  * 
- * cpdef int write (int64_t fd_p, char * name, np.ndarray val):
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):
  */
   __pyx_r = __pyx_v_total_size;
   goto __pyx_L0;
 
-  /* "adios.pyx":271
+  /* "adios.pyx":317
  *     return fd
  * 
  * cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):             # <<<<<<<<<<<<<<
@@ -2213,8 +3298,9 @@ static int64_t __pyx_f_5adios_set_group_size(int64_t __pyx_v_fd_p, uint64_t __py
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_5set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_5set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_7set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_6set_group_size[] = "set_group_size(int64_t fd_p, uint64_t data_size) -> int64_t";
+static PyObject *__pyx_pw_5adios_7set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   uint64_t __pyx_v_data_size;
   int __pyx_lineno = 0;
@@ -2243,11 +3329,11 @@ static PyObject *__pyx_pw_5adios_5set_group_size(PyObject *__pyx_self, PyObject
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_data_size)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("set_group_size", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("set_group_size", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_group_size") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_group_size") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -2255,25 +3341,25 @@ static PyObject *__pyx_pw_5adios_5set_group_size(PyObject *__pyx_self, PyObject
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_data_size = __Pyx_PyInt_As_uint64_t(values[1]); if (unlikely((__pyx_v_data_size == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_data_size = __Pyx_PyInt_As_uint64_t(values[1]); if (unlikely((__pyx_v_data_size == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("set_group_size", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("set_group_size", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.set_group_size", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_4set_group_size(__pyx_self, __pyx_v_fd_p, __pyx_v_data_size);
+  __pyx_r = __pyx_pf_5adios_6set_group_size(__pyx_self, __pyx_v_fd_p, __pyx_v_data_size);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4set_group_size(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size) {
+static PyObject *__pyx_pf_5adios_6set_group_size(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2282,7 +3368,7 @@ static PyObject *__pyx_pf_5adios_4set_group_size(CYTHON_UNUSED PyObject *__pyx_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set_group_size", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int64_t(__pyx_f_5adios_set_group_size(__pyx_v_fd_p, __pyx_v_data_size, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int64_t(__pyx_f_5adios_set_group_size(__pyx_v_fd_p, __pyx_v_data_size, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2299,91 +3385,146 @@ static PyObject *__pyx_pf_5adios_4set_group_size(CYTHON_UNUSED PyObject *__pyx_s
   return __pyx_r;
 }
 
-/* "adios.pyx":277
+/* "adios.pyx":323
  *     return total_size
  * 
- * cpdef int write (int64_t fd_p, char * name, np.ndarray val):             # <<<<<<<<<<<<<<
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):             # <<<<<<<<<<<<<<
  *     cdef np.ndarray val_
- *     if val.flags.contiguous:
+ *     if isinstance(val, (np.ndarray)):
  */
 
-static PyObject *__pyx_pw_5adios_7write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_5adios_write(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
+static PyObject *__pyx_pw_5adios_9write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_5adios_write(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyObject *__pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_write *__pyx_optional_args) {
+  PyObject *__pyx_v_dtype = ((PyObject *)Py_None);
   PyArrayObject *__pyx_v_val_ = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_dtype = __pyx_optional_args->dtype;
+    }
+  }
 
-  /* "adios.pyx":279
- * cpdef int write (int64_t fd_p, char * name, np.ndarray val):
+  /* "adios.pyx":325
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):
  *     cdef np.ndarray val_
- *     if val.flags.contiguous:             # <<<<<<<<<<<<<<
- *         val_ = val
- *     else:
+ *     if isinstance(val, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *         if val.flags.contiguous:
+ *             val_ = val
  */
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__pyx_t_3) {
+  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_val, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
 
-    /* "adios.pyx":280
+    /* "adios.pyx":326
  *     cdef np.ndarray val_
- *     if val.flags.contiguous:
- *         val_ = val             # <<<<<<<<<<<<<<
+ *     if isinstance(val, (np.ndarray)):
+ *         if val.flags.contiguous:             # <<<<<<<<<<<<<<
+ *             val_ = val
+ *         else:
+ */
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_flags); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (__pyx_t_2) {
+
+      /* "adios.pyx":327
+ *     if isinstance(val, (np.ndarray)):
+ *         if val.flags.contiguous:
+ *             val_ = val             # <<<<<<<<<<<<<<
+ *         else:
+ *             val_ = np.array(val, copy=True)
+ */
+      if (!(likely(((__pyx_v_val) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_val, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __pyx_v_val;
+      __Pyx_INCREF(__pyx_t_4);
+      __pyx_v_val_ = ((PyArrayObject *)__pyx_t_4);
+      __pyx_t_4 = 0;
+      goto __pyx_L4;
+    }
+    /*else*/ {
+
+      /* "adios.pyx":329
+ *             val_ = val
+ *         else:
+ *             val_ = np.array(val, copy=True)             # <<<<<<<<<<<<<<
  *     else:
- *         val_ = np.array(val, copy=True)
+ *         val_ = np.array(val, dtype=dtype)
  */
-    __Pyx_INCREF(((PyObject *)__pyx_v_val));
-    __pyx_v_val_ = __pyx_v_val;
+      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_INCREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_val);
+      __Pyx_GIVEREF(__pyx_v_val);
+      __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_copy, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_val_ = ((PyArrayObject *)__pyx_t_6);
+      __pyx_t_6 = 0;
+    }
+    __pyx_L4:;
     goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "adios.pyx":282
- *         val_ = val
+    /* "adios.pyx":331
+ *             val_ = np.array(val, copy=True)
  *     else:
- *         val_ = np.array(val, copy=True)             # <<<<<<<<<<<<<<
+ *         val_ = np.array(val, dtype=dtype)             # <<<<<<<<<<<<<<
  * 
  *     return adios_write (fd_p, name, <void *> val_.data)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_INCREF(((PyObject *)__pyx_v_val));
-    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_val));
-    __Pyx_GIVEREF(((PyObject *)__pyx_v_val));
-    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_copy, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_INCREF(__pyx_v_val);
+    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_val);
+    __Pyx_GIVEREF(__pyx_v_val);
+    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_v_dtype) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_val_ = ((PyArrayObject *)__pyx_t_5);
-    __pyx_t_5 = 0;
+    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_val_ = ((PyArrayObject *)__pyx_t_3);
+    __pyx_t_3 = 0;
   }
   __pyx_L3:;
 
-  /* "adios.pyx":284
- *         val_ = np.array(val, copy=True)
+  /* "adios.pyx":333
+ *         val_ = np.array(val, dtype=dtype)
  * 
  *     return adios_write (fd_p, name, <void *> val_.data)             # <<<<<<<<<<<<<<
  * 
@@ -2392,20 +3533,20 @@ static int __pyx_f_5adios_write(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArra
   __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, ((void *)__pyx_v_val_->data));
   goto __pyx_L0;
 
-  /* "adios.pyx":277
+  /* "adios.pyx":323
  *     return total_size
  * 
- * cpdef int write (int64_t fd_p, char * name, np.ndarray val):             # <<<<<<<<<<<<<<
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):             # <<<<<<<<<<<<<<
  *     cdef np.ndarray val_
- *     if val.flags.contiguous:
+ *     if isinstance(val, (np.ndarray)):
  */
 
   /* function exit code */
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
   __Pyx_WriteUnraisable("adios.write", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
   __pyx_r = 0;
   __pyx_L0:;
@@ -2415,11 +3556,13 @@ static int __pyx_f_5adios_write(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArra
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_7write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_7write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_9write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_8write[] = "write(int64_t fd_p, char *name, val, dtype=None) -> int";
+static PyObject *__pyx_pw_5adios_9write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
-  PyArrayObject *__pyx_v_val = 0;
+  PyObject *__pyx_v_val = 0;
+  PyObject *__pyx_v_dtype = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -2427,12 +3570,14 @@ static PyObject *__pyx_pw_5adios_7write(PyObject *__pyx_self, PyObject *__pyx_ar
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fd_p,&__pyx_n_s_name,&__pyx_n_s_val,0};
-    PyObject* values[3] = {0,0,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fd_p,&__pyx_n_s_name,&__pyx_n_s_val,&__pyx_n_s_dtype,0};
+    PyObject* values[4] = {0,0,0,0};
+    values[3] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
       switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -2447,66 +3592,75 @@ static PyObject *__pyx_pw_5adios_7write(PyObject *__pyx_self, PyObject *__pyx_ar
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write", 0, 3, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write", 0, 3, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dtype);
+          if (value) { values[3] = value; kw_args--; }
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
-      goto __pyx_L5_argtuple_error;
     } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_val = ((PyArrayObject *)values[2]);
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = values[2];
+    __pyx_v_dtype = values[3];
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("write", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("write", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_val), __pyx_ptype_5numpy_ndarray, 1, "val", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_5adios_6write(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  __pyx_r = __pyx_pf_5adios_8write(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val, __pyx_v_dtype);
 
   /* function exit code */
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_6write(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val) {
+static PyObject *__pyx_pf_5adios_8write(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyObject *__pyx_v_val, PyObject *__pyx_v_dtype) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_1;
+  struct __pyx_opt_args_5adios_write __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_write(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __pyx_t_2.__pyx_n = 1;
+  __pyx_t_2.dtype = __pyx_v_dtype;
+  __pyx_t_1 = __pyx_f_5adios_write(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0, &__pyx_t_2); 
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
+  goto __pyx_L0;
 
   /* function exit code */
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_AddTraceback("adios.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -2515,7 +3669,7 @@ static PyObject *__pyx_pf_5adios_6write(CYTHON_UNUSED PyObject *__pyx_self, int6
   return __pyx_r;
 }
 
-/* "adios.pyx":286
+/* "adios.pyx":335
  *     return adios_write (fd_p, name, <void *> val_.data)
  * 
  * cpdef int write_int (int64_t fd_p, char * name, int val):             # <<<<<<<<<<<<<<
@@ -2523,13 +3677,13 @@ static PyObject *__pyx_pf_5adios_6write(CYTHON_UNUSED PyObject *__pyx_self, int6
  * 
  */
 
-static PyObject *__pyx_pw_5adios_9write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_11write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_5adios_write_int(int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_int", 0);
 
-  /* "adios.pyx":287
+  /* "adios.pyx":336
  * 
  * cpdef int write_int (int64_t fd_p, char * name, int val):
  *     return adios_write (fd_p, name, &val)             # <<<<<<<<<<<<<<
@@ -2539,7 +3693,7 @@ static int __pyx_f_5adios_write_int(int64_t __pyx_v_fd_p, char *__pyx_v_name, in
   __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, (&__pyx_v_val));
   goto __pyx_L0;
 
-  /* "adios.pyx":286
+  /* "adios.pyx":335
  *     return adios_write (fd_p, name, <void *> val_.data)
  * 
  * cpdef int write_int (int64_t fd_p, char * name, int val):             # <<<<<<<<<<<<<<
@@ -2554,8 +3708,9 @@ static int __pyx_f_5adios_write_int(int64_t __pyx_v_fd_p, char *__pyx_v_name, in
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_9write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_9write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_11write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_10write_int[] = "write_int(int64_t fd_p, char *name, int val) -> int";
+static PyObject *__pyx_pw_5adios_11write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
   int __pyx_v_val;
@@ -2586,16 +3741,16 @@ static PyObject *__pyx_pw_5adios_9write_int(PyObject *__pyx_self, PyObject *__py
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_int") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_int") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -2604,26 +3759,26 @@ static PyObject *__pyx_pw_5adios_9write_int(PyObject *__pyx_self, PyObject *__py
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
       values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_val = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_val == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_val == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.write_int", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_8write_int(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  __pyx_r = __pyx_pf_5adios_10write_int(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_8write_int(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val) {
+static PyObject *__pyx_pf_5adios_10write_int(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2632,7 +3787,7 @@ static PyObject *__pyx_pf_5adios_8write_int(CYTHON_UNUSED PyObject *__pyx_self,
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_int", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_write_int(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_write_int(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2649,7 +3804,7 @@ static PyObject *__pyx_pf_5adios_8write_int(CYTHON_UNUSED PyObject *__pyx_self,
   return __pyx_r;
 }
 
-/* "adios.pyx":289
+/* "adios.pyx":338
  *     return adios_write (fd_p, name, &val)
  * 
  * cpdef int write_long (int64_t fd_p, char * name, long val):             # <<<<<<<<<<<<<<
@@ -2657,13 +3812,13 @@ static PyObject *__pyx_pf_5adios_8write_int(CYTHON_UNUSED PyObject *__pyx_self,
  * 
  */
 
-static PyObject *__pyx_pw_5adios_11write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_13write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_5adios_write_long(int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_long", 0);
 
-  /* "adios.pyx":290
+  /* "adios.pyx":339
  * 
  * cpdef int write_long (int64_t fd_p, char * name, long val):
  *     return adios_write (fd_p, name, &val)             # <<<<<<<<<<<<<<
@@ -2673,7 +3828,7 @@ static int __pyx_f_5adios_write_long(int64_t __pyx_v_fd_p, char *__pyx_v_name, l
   __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, (&__pyx_v_val));
   goto __pyx_L0;
 
-  /* "adios.pyx":289
+  /* "adios.pyx":338
  *     return adios_write (fd_p, name, &val)
  * 
  * cpdef int write_long (int64_t fd_p, char * name, long val):             # <<<<<<<<<<<<<<
@@ -2688,8 +3843,9 @@ static int __pyx_f_5adios_write_long(int64_t __pyx_v_fd_p, char *__pyx_v_name, l
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_11write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_11write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_13write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_12write_long[] = "write_long(int64_t fd_p, char *name, long val) -> int";
+static PyObject *__pyx_pw_5adios_13write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
   long __pyx_v_val;
@@ -2720,16 +3876,16 @@ static PyObject *__pyx_pw_5adios_11write_long(PyObject *__pyx_self, PyObject *__
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_long") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_long") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -2738,26 +3894,26 @@ static PyObject *__pyx_pw_5adios_11write_long(PyObject *__pyx_self, PyObject *__
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
       values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_val = __Pyx_PyInt_As_long(values[2]); if (unlikely((__pyx_v_val == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __Pyx_PyInt_As_long(values[2]); if (unlikely((__pyx_v_val == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.write_long", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_10write_long(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  __pyx_r = __pyx_pf_5adios_12write_long(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_10write_long(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val) {
+static PyObject *__pyx_pf_5adios_12write_long(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2766,7 +3922,7 @@ static PyObject *__pyx_pf_5adios_10write_long(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_long", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_write_long(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_write_long(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2783,7 +3939,7 @@ static PyObject *__pyx_pf_5adios_10write_long(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-/* "adios.pyx":292
+/* "adios.pyx":341
  *     return adios_write (fd_p, name, &val)
  * 
  * cpdef int write_float (int64_t fd_p, char * name, float val):             # <<<<<<<<<<<<<<
@@ -2791,23 +3947,23 @@ static PyObject *__pyx_pf_5adios_10write_long(CYTHON_UNUSED PyObject *__pyx_self
  * 
  */
 
-static PyObject *__pyx_pw_5adios_13write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_15write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_5adios_write_float(int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_float", 0);
 
-  /* "adios.pyx":293
+  /* "adios.pyx":342
  * 
  * cpdef int write_float (int64_t fd_p, char * name, float val):
  *     return adios_write (fd_p, name, &val)             # <<<<<<<<<<<<<<
  * 
- * cpdef int read(int64_t fd_p, char * name, np.ndarray val):
+ * cpdef int write_double (int64_t fd_p, char * name, double val):
  */
   __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, (&__pyx_v_val));
   goto __pyx_L0;
 
-  /* "adios.pyx":292
+  /* "adios.pyx":341
  *     return adios_write (fd_p, name, &val)
  * 
  * cpdef int write_float (int64_t fd_p, char * name, float val):             # <<<<<<<<<<<<<<
@@ -2822,8 +3978,9 @@ static int __pyx_f_5adios_write_float(int64_t __pyx_v_fd_p, char *__pyx_v_name,
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_13write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_13write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_15write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_14write_float[] = "write_float(int64_t fd_p, char *name, float val) -> int";
+static PyObject *__pyx_pw_5adios_15write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
   float __pyx_v_val;
@@ -2854,16 +4011,16 @@ static PyObject *__pyx_pw_5adios_13write_float(PyObject *__pyx_self, PyObject *_
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_float") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_float") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -2872,26 +4029,26 @@ static PyObject *__pyx_pw_5adios_13write_float(PyObject *__pyx_self, PyObject *_
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
       values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_val = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.write_float", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_12write_float(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  __pyx_r = __pyx_pf_5adios_14write_float(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_12write_float(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val) {
+static PyObject *__pyx_pf_5adios_14write_float(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2900,7 +4057,7 @@ static PyObject *__pyx_pf_5adios_12write_float(CYTHON_UNUSED PyObject *__pyx_sel
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_float", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_write_float(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_write_float(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2917,15 +4074,150 @@ static PyObject *__pyx_pf_5adios_12write_float(CYTHON_UNUSED PyObject *__pyx_sel
   return __pyx_r;
 }
 
-/* "adios.pyx":295
+/* "adios.pyx":344
+ *     return adios_write (fd_p, name, &val)
+ * 
+ * cpdef int write_double (int64_t fd_p, char * name, double val):             # <<<<<<<<<<<<<<
+ *     return adios_write (fd_p, name, &val)
+ * 
+ */
+
+static PyObject *__pyx_pw_5adios_17write_double(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_5adios_write_double(int64_t __pyx_v_fd_p, char *__pyx_v_name, double __pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_double", 0);
+
+  /* "adios.pyx":345
+ * 
+ * cpdef int write_double (int64_t fd_p, char * name, double val):
+ *     return adios_write (fd_p, name, &val)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, (&__pyx_v_val));
+  goto __pyx_L0;
+
+  /* "adios.pyx":344
  *     return adios_write (fd_p, name, &val)
  * 
+ * cpdef int write_double (int64_t fd_p, char * name, double val):             # <<<<<<<<<<<<<<
+ *     return adios_write (fd_p, name, &val)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_17write_double(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_16write_double[] = "write_double(int64_t fd_p, char *name, double val) -> int";
+static PyObject *__pyx_pw_5adios_17write_double(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int64_t __pyx_v_fd_p;
+  char *__pyx_v_name;
+  double __pyx_v_val;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_double (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fd_p,&__pyx_n_s_name,&__pyx_n_s_val,0};
+    PyObject* values[3] = {0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fd_p)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("write_double", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  2:
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("write_double", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_double") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+    }
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_val == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("write_double", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.write_double", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_16write_double(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_16write_double(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, double __pyx_v_val) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write_double", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_write_double(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.write_double", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":348
+ * 
+ * 
  * cpdef int read(int64_t fd_p, char * name, np.ndarray val):             # <<<<<<<<<<<<<<
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
  *     print "Reading ... ", val.itemsize * val.size, "(bytes)"
  */
 
-static PyObject *__pyx_pw_5adios_15read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_19read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_5adios_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -2939,7 +4231,7 @@ static int __pyx_f_5adios_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArray
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read", 0);
 
-  /* "adios.pyx":296
+  /* "adios.pyx":349
  * 
  * cpdef int read(int64_t fd_p, char * name, np.ndarray val):
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'             # <<<<<<<<<<<<<<
@@ -2948,36 +4240,36 @@ static int __pyx_f_5adios_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArray
  */
   #ifndef CYTHON_WITHOUT_ASSERTIONS
   if (unlikely(!Py_OptimizeFlag)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (unlikely(!__pyx_t_3)) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Only_contiguous_arrays_are_suppo);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios.pyx":297
+  /* "adios.pyx":350
  * cpdef int read(int64_t fd_p, char * name, np.ndarray val):
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
  *     print "Reading ... ", val.itemsize * val.size, "(bytes)"             # <<<<<<<<<<<<<<
  *     return adios_read(fd_p, name, <void *> val.data, val.itemsize * val.size)
  * 
  */
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_kp_s_Reading);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_s_Reading);
@@ -2988,31 +4280,31 @@ static int __pyx_f_5adios_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArray
   PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_s_bytes);
   __Pyx_GIVEREF(__pyx_kp_s_bytes);
   __pyx_t_4 = 0;
-  if (__Pyx_Print(0, __pyx_t_1, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_Print(0, __pyx_t_1, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":298
+  /* "adios.pyx":351
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
  *     print "Reading ... ", val.itemsize * val.size, "(bytes)"
  *     return adios_read(fd_p, name, <void *> val.data, val.itemsize * val.size)             # <<<<<<<<<<<<<<
  * 
  * cpdef int close(int64_t fd_p):
  */
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_5 = __Pyx_PyInt_As_uint64_t(__pyx_t_2); if (unlikely((__pyx_t_5 == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyInt_As_uint64_t(__pyx_t_2); if (unlikely((__pyx_t_5 == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_r = adios_read(__pyx_v_fd_p, __pyx_v_name, ((void *)__pyx_v_val->data), __pyx_t_5);
   goto __pyx_L0;
 
-  /* "adios.pyx":295
- *     return adios_write (fd_p, name, &val)
+  /* "adios.pyx":348
+ * 
  * 
  * cpdef int read(int64_t fd_p, char * name, np.ndarray val):             # <<<<<<<<<<<<<<
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
@@ -3032,8 +4324,9 @@ static int __pyx_f_5adios_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArray
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_15read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_15read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_19read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_18read[] = "read(int64_t fd_p, char *name, ndarray val) -> int";
+static PyObject *__pyx_pw_5adios_19read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
   PyArrayObject *__pyx_v_val = 0;
@@ -3064,16 +4357,16 @@ static PyObject *__pyx_pw_5adios_15read(PyObject *__pyx_self, PyObject *__pyx_ar
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -3082,20 +4375,20 @@ static PyObject *__pyx_pw_5adios_15read(PyObject *__pyx_self, PyObject *__pyx_ar
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
       values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_val = ((PyArrayObject *)values[2]);
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.read", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_val), __pyx_ptype_5numpy_ndarray, 1, "val", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_5adios_14read(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_val), __pyx_ptype_5numpy_ndarray, 1, "val", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_5adios_18read(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
 
   /* function exit code */
   goto __pyx_L0;
@@ -3106,7 +4399,7 @@ static PyObject *__pyx_pw_5adios_15read(PyObject *__pyx_self, PyObject *__pyx_ar
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_14read(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val) {
+static PyObject *__pyx_pf_5adios_18read(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3115,7 +4408,7 @@ static PyObject *__pyx_pf_5adios_14read(CYTHON_UNUSED PyObject *__pyx_self, int6
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_read(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_read(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3132,7 +4425,7 @@ static PyObject *__pyx_pf_5adios_14read(CYTHON_UNUSED PyObject *__pyx_self, int6
   return __pyx_r;
 }
 
-/* "adios.pyx":300
+/* "adios.pyx":353
  *     return adios_read(fd_p, name, <void *> val.data, val.itemsize * val.size)
  * 
  * cpdef int close(int64_t fd_p):             # <<<<<<<<<<<<<<
@@ -3140,13 +4433,13 @@ static PyObject *__pyx_pf_5adios_14read(CYTHON_UNUSED PyObject *__pyx_self, int6
  * 
  */
 
-static PyObject *__pyx_pw_5adios_17close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p); /*proto*/
+static PyObject *__pyx_pw_5adios_21close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p); /*proto*/
 static int __pyx_f_5adios_close(int64_t __pyx_v_fd_p, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("close", 0);
 
-  /* "adios.pyx":301
+  /* "adios.pyx":354
  * 
  * cpdef int close(int64_t fd_p):
  *     return adios_close(fd_p)             # <<<<<<<<<<<<<<
@@ -3156,7 +4449,7 @@ static int __pyx_f_5adios_close(int64_t __pyx_v_fd_p, CYTHON_UNUSED int __pyx_sk
   __pyx_r = adios_close(__pyx_v_fd_p);
   goto __pyx_L0;
 
-  /* "adios.pyx":300
+  /* "adios.pyx":353
  *     return adios_read(fd_p, name, <void *> val.data, val.itemsize * val.size)
  * 
  * cpdef int close(int64_t fd_p):             # <<<<<<<<<<<<<<
@@ -3171,8 +4464,9 @@ static int __pyx_f_5adios_close(int64_t __pyx_v_fd_p, CYTHON_UNUSED int __pyx_sk
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_17close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p); /*proto*/
-static PyObject *__pyx_pw_5adios_17close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p) {
+static PyObject *__pyx_pw_5adios_21close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p); /*proto*/
+static char __pyx_doc_5adios_20close[] = "close(int64_t fd_p) -> int";
+static PyObject *__pyx_pw_5adios_21close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p) {
   int64_t __pyx_v_fd_p;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
@@ -3181,7 +4475,7 @@ static PyObject *__pyx_pw_5adios_17close(PyObject *__pyx_self, PyObject *__pyx_a
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("close (wrapper)", 0);
   assert(__pyx_arg_fd_p); {
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(__pyx_arg_fd_p); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(__pyx_arg_fd_p); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -3189,14 +4483,14 @@ static PyObject *__pyx_pw_5adios_17close(PyObject *__pyx_self, PyObject *__pyx_a
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_16close(__pyx_self, ((int64_t)__pyx_v_fd_p));
+  __pyx_r = __pyx_pf_5adios_20close(__pyx_self, ((int64_t)__pyx_v_fd_p));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_16close(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p) {
+static PyObject *__pyx_pf_5adios_20close(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3205,7 +4499,7 @@ static PyObject *__pyx_pf_5adios_16close(CYTHON_UNUSED PyObject *__pyx_self, int
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("close", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_close(__pyx_v_fd_p, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_close(__pyx_v_fd_p, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3222,7 +4516,7 @@ static PyObject *__pyx_pf_5adios_16close(CYTHON_UNUSED PyObject *__pyx_self, int
   return __pyx_r;
 }
 
-/* "adios.pyx":303
+/* "adios.pyx":356
  *     return adios_close(fd_p)
  * 
  * cpdef int finalize(int mype = 0):             # <<<<<<<<<<<<<<
@@ -3230,7 +4524,7 @@ static PyObject *__pyx_pf_5adios_16close(CYTHON_UNUSED PyObject *__pyx_self, int
  * 
  */
 
-static PyObject *__pyx_pw_5adios_19finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_23finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_5adios_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_finalize *__pyx_optional_args) {
   int __pyx_v_mype = ((int)0);
   int __pyx_r;
@@ -3242,7 +4536,7 @@ static int __pyx_f_5adios_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, struct
     }
   }
 
-  /* "adios.pyx":304
+  /* "adios.pyx":357
  * 
  * cpdef int finalize(int mype = 0):
  *     return adios_finalize(mype)             # <<<<<<<<<<<<<<
@@ -3252,7 +4546,7 @@ static int __pyx_f_5adios_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, struct
   __pyx_r = adios_finalize(__pyx_v_mype);
   goto __pyx_L0;
 
-  /* "adios.pyx":303
+  /* "adios.pyx":356
  *     return adios_close(fd_p)
  * 
  * cpdef int finalize(int mype = 0):             # <<<<<<<<<<<<<<
@@ -3267,8 +4561,9 @@ static int __pyx_f_5adios_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, struct
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_19finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_19finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_23finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_22finalize[] = "finalize(int mype=0) -> int";
+static PyObject *__pyx_pw_5adios_23finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_mype;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
@@ -3296,7 +4591,7 @@ static PyObject *__pyx_pw_5adios_19finalize(PyObject *__pyx_self, PyObject *__py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "finalize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "finalize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3306,27 +4601,27 @@ static PyObject *__pyx_pw_5adios_19finalize(PyObject *__pyx_self, PyObject *__py
       }
     }
     if (values[0]) {
-      __pyx_v_mype = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_mype == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_mype = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_mype == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_mype = ((int)0);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("finalize", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("finalize", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.finalize", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_18finalize(__pyx_self, __pyx_v_mype);
+  __pyx_r = __pyx_pf_5adios_22finalize(__pyx_self, __pyx_v_mype);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_18finalize(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_mype) {
+static PyObject *__pyx_pf_5adios_22finalize(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_mype) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3340,7 +4635,7 @@ static PyObject *__pyx_pf_5adios_18finalize(CYTHON_UNUSED PyObject *__pyx_self,
   __pyx_t_2.__pyx_n = 1;
   __pyx_t_2.mype = __pyx_v_mype;
   __pyx_t_1 = __pyx_f_5adios_finalize(0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -3357,7 +4652,7 @@ static PyObject *__pyx_pf_5adios_18finalize(CYTHON_UNUSED PyObject *__pyx_self,
   return __pyx_r;
 }
 
-/* "adios.pyx":309
+/* "adios.pyx":362
  * ## ADIOS No-XML API
  * ## ====================
  * cpdef int init_noxml(MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
@@ -3365,9 +4660,9 @@ static PyObject *__pyx_pf_5adios_18finalize(CYTHON_UNUSED PyObject *__pyx_self,
  * 
  */
 
-static PyObject *__pyx_pw_5adios_21init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_25init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_5adios_init_noxml(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_init_noxml *__pyx_optional_args) {
-  MPI_Comm __pyx_v_comm = __pyx_k__3;
+  MPI_Comm __pyx_v_comm = __pyx_k__6;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("init_noxml", 0);
@@ -3377,7 +4672,7 @@ static int __pyx_f_5adios_init_noxml(CYTHON_UNUSED int __pyx_skip_dispatch, stru
     }
   }
 
-  /* "adios.pyx":310
+  /* "adios.pyx":363
  * ## ====================
  * cpdef int init_noxml(MPI_Comm comm = MPI_COMM_WORLD):
  *     return adios_init_noxml(comm)             # <<<<<<<<<<<<<<
@@ -3387,7 +4682,7 @@ static int __pyx_f_5adios_init_noxml(CYTHON_UNUSED int __pyx_skip_dispatch, stru
   __pyx_r = adios_init_noxml(__pyx_v_comm);
   goto __pyx_L0;
 
-  /* "adios.pyx":309
+  /* "adios.pyx":362
  * ## ADIOS No-XML API
  * ## ====================
  * cpdef int init_noxml(MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
@@ -3402,8 +4697,9 @@ static int __pyx_f_5adios_init_noxml(CYTHON_UNUSED int __pyx_skip_dispatch, stru
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_21init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_21init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_25init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_24init_noxml[] = "init_noxml(MPI_Comm comm=MPI_COMM_WORLD) -> int";
+static PyObject *__pyx_pw_5adios_25init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   MPI_Comm __pyx_v_comm;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
@@ -3431,7 +4727,7 @@ static PyObject *__pyx_pw_5adios_21init_noxml(PyObject *__pyx_self, PyObject *__
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init_noxml") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init_noxml") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3441,27 +4737,27 @@ static PyObject *__pyx_pw_5adios_21init_noxml(PyObject *__pyx_self, PyObject *__
       }
     }
     if (values[0]) {
-      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[0]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[0]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_comm = __pyx_k__3;
+      __pyx_v_comm = __pyx_k__6;
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("init_noxml", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("init_noxml", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.init_noxml", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_20init_noxml(__pyx_self, __pyx_v_comm);
+  __pyx_r = __pyx_pf_5adios_24init_noxml(__pyx_self, __pyx_v_comm);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_20init_noxml(CYTHON_UNUSED PyObject *__pyx_self, MPI_Comm __pyx_v_comm) {
+static PyObject *__pyx_pf_5adios_24init_noxml(CYTHON_UNUSED PyObject *__pyx_self, MPI_Comm __pyx_v_comm) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3475,7 +4771,7 @@ static PyObject *__pyx_pf_5adios_20init_noxml(CYTHON_UNUSED PyObject *__pyx_self
   __pyx_t_2.__pyx_n = 1;
   __pyx_t_2.comm = __pyx_v_comm;
   __pyx_t_1 = __pyx_f_5adios_init_noxml(0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -3492,7 +4788,7 @@ static PyObject *__pyx_pf_5adios_20init_noxml(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-/* "adios.pyx":312
+/* "adios.pyx":365
  *     return adios_init_noxml(comm)
  * 
  * cpdef int allocate_buffer(int when,             # <<<<<<<<<<<<<<
@@ -3500,13 +4796,13 @@ static PyObject *__pyx_pf_5adios_20init_noxml(CYTHON_UNUSED PyObject *__pyx_self
  *     return adios_allocate_buffer(<ADIOS_BUFFER_ALLOC_WHEN> when,
  */
 
-static PyObject *__pyx_pw_5adios_23allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_27allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_5adios_allocate_buffer(int __pyx_v_when, uint64_t __pyx_v_buffer_size, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("allocate_buffer", 0);
 
-  /* "adios.pyx":314
+  /* "adios.pyx":367
  * cpdef int allocate_buffer(int when,
  *                           uint64_t buffer_size):
  *     return adios_allocate_buffer(<ADIOS_BUFFER_ALLOC_WHEN> when,             # <<<<<<<<<<<<<<
@@ -3516,7 +4812,7 @@ static int __pyx_f_5adios_allocate_buffer(int __pyx_v_when, uint64_t __pyx_v_buf
   __pyx_r = adios_allocate_buffer(((ADIOS_BUFFER_ALLOC_WHEN)__pyx_v_when), __pyx_v_buffer_size);
   goto __pyx_L0;
 
-  /* "adios.pyx":312
+  /* "adios.pyx":365
  *     return adios_init_noxml(comm)
  * 
  * cpdef int allocate_buffer(int when,             # <<<<<<<<<<<<<<
@@ -3531,8 +4827,9 @@ static int __pyx_f_5adios_allocate_buffer(int __pyx_v_when, uint64_t __pyx_v_buf
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_23allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_23allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_27allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_26allocate_buffer[] = "allocate_buffer(int when, uint64_t buffer_size) -> int";
+static PyObject *__pyx_pw_5adios_27allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_when;
   uint64_t __pyx_v_buffer_size;
   int __pyx_lineno = 0;
@@ -3561,11 +4858,11 @@ static PyObject *__pyx_pw_5adios_23allocate_buffer(PyObject *__pyx_self, PyObjec
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_buffer_size)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("allocate_buffer", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("allocate_buffer", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "allocate_buffer") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "allocate_buffer") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -3573,25 +4870,25 @@ static PyObject *__pyx_pw_5adios_23allocate_buffer(PyObject *__pyx_self, PyObjec
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_when = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_when == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_buffer_size = __Pyx_PyInt_As_uint64_t(values[1]); if (unlikely((__pyx_v_buffer_size == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_when = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_when == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_buffer_size = __Pyx_PyInt_As_uint64_t(values[1]); if (unlikely((__pyx_v_buffer_size == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("allocate_buffer", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("allocate_buffer", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.allocate_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_22allocate_buffer(__pyx_self, __pyx_v_when, __pyx_v_buffer_size);
+  __pyx_r = __pyx_pf_5adios_26allocate_buffer(__pyx_self, __pyx_v_when, __pyx_v_buffer_size);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_22allocate_buffer(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_when, uint64_t __pyx_v_buffer_size) {
+static PyObject *__pyx_pf_5adios_26allocate_buffer(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_when, uint64_t __pyx_v_buffer_size) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3600,7 +4897,7 @@ static PyObject *__pyx_pf_5adios_22allocate_buffer(CYTHON_UNUSED PyObject *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("allocate_buffer", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_allocate_buffer(__pyx_v_when, __pyx_v_buffer_size, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_allocate_buffer(__pyx_v_when, __pyx_v_buffer_size, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3617,7 +4914,7 @@ static PyObject *__pyx_pf_5adios_22allocate_buffer(CYTHON_UNUSED PyObject *__pyx
   return __pyx_r;
 }
 
-/* "adios.pyx":317
+/* "adios.pyx":370
  *                                  buffer_size)
  * 
  * cpdef int64_t declare_group(char * name,             # <<<<<<<<<<<<<<
@@ -3625,9 +4922,9 @@ static PyObject *__pyx_pf_5adios_22allocate_buffer(CYTHON_UNUSED PyObject *__pyx
  *                             int stats = 1):
  */
 
-static PyObject *__pyx_pw_5adios_25declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_29declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int64_t __pyx_f_5adios_declare_group(char *__pyx_v_name, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_declare_group *__pyx_optional_args) {
-  char *__pyx_v_time_index = ((char *)__pyx_k__4);
+  char *__pyx_v_time_index = ((char *)__pyx_k__7);
   int __pyx_v_stats = ((int)1);
   int64_t __pyx_v_id;
   int64_t __pyx_r;
@@ -3642,7 +4939,7 @@ static int64_t __pyx_f_5adios_declare_group(char *__pyx_v_name, CYTHON_UNUSED in
     }
   }
 
-  /* "adios.pyx":320
+  /* "adios.pyx":373
  *                             char * time_index = "",
  *                             int stats = 1):
  *     cdef int64_t id = 0             # <<<<<<<<<<<<<<
@@ -3651,7 +4948,7 @@ static int64_t __pyx_f_5adios_declare_group(char *__pyx_v_name, CYTHON_UNUSED in
  */
   __pyx_v_id = 0;
 
-  /* "adios.pyx":321
+  /* "adios.pyx":374
  *                             int stats = 1):
  *     cdef int64_t id = 0
  *     adios_declare_group (&id,             # <<<<<<<<<<<<<<
@@ -3660,7 +4957,7 @@ static int64_t __pyx_f_5adios_declare_group(char *__pyx_v_name, CYTHON_UNUSED in
  */
   adios_declare_group((&__pyx_v_id), __pyx_v_name, __pyx_v_time_index, ((ADIOS_FLAG)__pyx_v_stats));
 
-  /* "adios.pyx":325
+  /* "adios.pyx":378
  *                          time_index,
  *                          <ADIOS_FLAG> stats)
  *     return id             # <<<<<<<<<<<<<<
@@ -3670,7 +4967,7 @@ static int64_t __pyx_f_5adios_declare_group(char *__pyx_v_name, CYTHON_UNUSED in
   __pyx_r = __pyx_v_id;
   goto __pyx_L0;
 
-  /* "adios.pyx":317
+  /* "adios.pyx":370
  *                                  buffer_size)
  * 
  * cpdef int64_t declare_group(char * name,             # <<<<<<<<<<<<<<
@@ -3685,8 +4982,9 @@ static int64_t __pyx_f_5adios_declare_group(char *__pyx_v_name, CYTHON_UNUSED in
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_25declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_25declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_29declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_28declare_group[] = "declare_group(char *name, char *time_index='', int stats=1) -> int64_t";
+static PyObject *__pyx_pw_5adios_29declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_name;
   char *__pyx_v_time_index;
   int __pyx_v_stats;
@@ -3726,7 +5024,7 @@ static PyObject *__pyx_pw_5adios_25declare_group(PyObject *__pyx_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "declare_group") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "declare_group") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3737,34 +5035,34 @@ static PyObject *__pyx_pw_5adios_25declare_group(PyObject *__pyx_self, PyObject
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     if (values[1]) {
-      __pyx_v_time_index = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_time_index) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_time_index = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_time_index) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_time_index = ((char *)__pyx_k__4);
+      __pyx_v_time_index = ((char *)__pyx_k__7);
     }
     if (values[2]) {
-      __pyx_v_stats = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_stats == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_stats = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_stats == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_stats = ((int)1);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("declare_group", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("declare_group", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.declare_group", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_24declare_group(__pyx_self, __pyx_v_name, __pyx_v_time_index, __pyx_v_stats);
+  __pyx_r = __pyx_pf_5adios_28declare_group(__pyx_self, __pyx_v_name, __pyx_v_time_index, __pyx_v_stats);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_24declare_group(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_name, char *__pyx_v_time_index, int __pyx_v_stats) {
+static PyObject *__pyx_pf_5adios_28declare_group(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_name, char *__pyx_v_time_index, int __pyx_v_stats) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int64_t __pyx_t_1;
@@ -3779,7 +5077,7 @@ static PyObject *__pyx_pf_5adios_24declare_group(CYTHON_UNUSED PyObject *__pyx_s
   __pyx_t_2.time_index = __pyx_v_time_index;
   __pyx_t_2.stats = __pyx_v_stats;
   __pyx_t_1 = __pyx_f_5adios_declare_group(__pyx_v_name, 0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -3796,7 +5094,7 @@ static PyObject *__pyx_pf_5adios_24declare_group(CYTHON_UNUSED PyObject *__pyx_s
   return __pyx_r;
 }
 
-/* "adios.pyx":327
+/* "adios.pyx":380
  *     return id
  * 
  * cpdef int define_var(int64_t group_id,             # <<<<<<<<<<<<<<
@@ -3804,11 +5102,11 @@ static PyObject *__pyx_pf_5adios_24declare_group(CYTHON_UNUSED PyObject *__pyx_s
  *                      char * path,
  */
 
-static PyObject *__pyx_pw_5adios_27define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_5adios_define_var(int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_define_var *__pyx_optional_args) {
-  char *__pyx_v_dimensions = ((char *)__pyx_k__4);
-  char *__pyx_v_global_dimensions = ((char *)__pyx_k__4);
-  char *__pyx_v_local_offsets = ((char *)__pyx_k__4);
+static PyObject *__pyx_pw_5adios_31define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_5adios_define_var(int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_define_var *__pyx_optional_args) {
+  char *__pyx_v_dimensions = ((char *)__pyx_k__7);
+  char *__pyx_v_global_dimensions = ((char *)__pyx_k__7);
+  char *__pyx_v_local_offsets = ((char *)__pyx_k__7);
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("define_var", 0);
@@ -3824,17 +5122,17 @@ static int __pyx_f_5adios_define_var(int64_t __pyx_v_group_id, char *__pyx_v_nam
     }
   }
 
-  /* "adios.pyx":334
+  /* "adios.pyx":387
  *                      char * global_dimensions = "",
  *                      char * local_offsets = ""):
  *     return adios_define_var(group_id,             # <<<<<<<<<<<<<<
  *                             name, path,
- *                             <ADIOS_DATATYPES> type,
+ *                             <ADIOS_DATATYPES> atype,
  */
-  __pyx_r = adios_define_var(__pyx_v_group_id, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_v_type), __pyx_v_dimensions, __pyx_v_global_dimensions, __pyx_v_local_offsets);
+  __pyx_r = adios_define_var(__pyx_v_group_id, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_v_atype), __pyx_v_dimensions, __pyx_v_global_dimensions, __pyx_v_local_offsets);
   goto __pyx_L0;
 
-  /* "adios.pyx":327
+  /* "adios.pyx":380
  *     return id
  * 
  * cpdef int define_var(int64_t group_id,             # <<<<<<<<<<<<<<
@@ -3849,12 +5147,13 @@ static int __pyx_f_5adios_define_var(int64_t __pyx_v_group_id, char *__pyx_v_nam
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_27define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_27define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_31define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_30define_var[] = "define_var(int64_t group_id, char *name, char *path, int atype, char *dimensions='', char *global_dimensions='', char *local_offsets='') -> int";
+static PyObject *__pyx_pw_5adios_31define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_group_id;
   char *__pyx_v_name;
   char *__pyx_v_path;
-  int __pyx_v_type;
+  int __pyx_v_atype;
   char *__pyx_v_dimensions;
   char *__pyx_v_global_dimensions;
   char *__pyx_v_local_offsets;
@@ -3865,7 +5164,7 @@ static PyObject *__pyx_pw_5adios_27define_var(PyObject *__pyx_self, PyObject *__
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("define_var (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group_id,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_type,&__pyx_n_s_dimensions,&__pyx_n_s_global_dimensions,&__pyx_n_s_local_offsets,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group_id,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_atype,&__pyx_n_s_dimensions,&__pyx_n_s_global_dimensions,&__pyx_n_s_local_offsets,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -3889,17 +5188,17 @@ static PyObject *__pyx_pw_5adios_27define_var(PyObject *__pyx_self, PyObject *__
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_type)) != 0)) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_atype)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
         if (kw_args > 0) {
@@ -3918,7 +5217,7 @@ static PyObject *__pyx_pw_5adios_27define_var(PyObject *__pyx_self, PyObject *__
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_var") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_var") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3933,42 +5232,42 @@ static PyObject *__pyx_pw_5adios_27define_var(PyObject *__pyx_self, PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_group_id = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group_id == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_type = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_group_id = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group_id == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_atype = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_atype == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     if (values[4]) {
-      __pyx_v_dimensions = __Pyx_PyObject_AsString(values[4]); if (unlikely((!__pyx_v_dimensions) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_dimensions = __Pyx_PyObject_AsString(values[4]); if (unlikely((!__pyx_v_dimensions) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_dimensions = ((char *)__pyx_k__4);
+      __pyx_v_dimensions = ((char *)__pyx_k__7);
     }
     if (values[5]) {
-      __pyx_v_global_dimensions = __Pyx_PyObject_AsString(values[5]); if (unlikely((!__pyx_v_global_dimensions) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_global_dimensions = __Pyx_PyObject_AsString(values[5]); if (unlikely((!__pyx_v_global_dimensions) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_global_dimensions = ((char *)__pyx_k__4);
+      __pyx_v_global_dimensions = ((char *)__pyx_k__7);
     }
     if (values[6]) {
-      __pyx_v_local_offsets = __Pyx_PyObject_AsString(values[6]); if (unlikely((!__pyx_v_local_offsets) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_local_offsets = __Pyx_PyObject_AsString(values[6]); if (unlikely((!__pyx_v_local_offsets) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_local_offsets = ((char *)__pyx_k__4);
+      __pyx_v_local_offsets = ((char *)__pyx_k__7);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.define_var", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_26define_var(__pyx_self, __pyx_v_group_id, __pyx_v_name, __pyx_v_path, __pyx_v_type, __pyx_v_dimensions, __pyx_v_global_dimensions, __pyx_v_local_offsets);
+  __pyx_r = __pyx_pf_5adios_30define_var(__pyx_self, __pyx_v_group_id, __pyx_v_name, __pyx_v_path, __pyx_v_atype, __pyx_v_dimensions, __pyx_v_global_dimensions, __pyx_v_local_offsets);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_26define_var(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_dimensions, char *__pyx_v_global_dimensions, char *__pyx_v_local_offsets) {
+static PyObject *__pyx_pf_5adios_30define_var(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_dimensions, char *__pyx_v_global_dimensions, char *__pyx_v_local_offsets) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3983,8 +5282,8 @@ static PyObject *__pyx_pf_5adios_26define_var(CYTHON_UNUSED PyObject *__pyx_self
   __pyx_t_2.dimensions = __pyx_v_dimensions;
   __pyx_t_2.global_dimensions = __pyx_v_global_dimensions;
   __pyx_t_2.local_offsets = __pyx_v_local_offsets;
-  __pyx_t_1 = __pyx_f_5adios_define_var(__pyx_v_group_id, __pyx_v_name, __pyx_v_path, __pyx_v_type, 0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_5adios_define_var(__pyx_v_group_id, __pyx_v_name, __pyx_v_path, __pyx_v_atype, 0, &__pyx_t_2); 
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -4001,7 +5300,7 @@ static PyObject *__pyx_pf_5adios_26define_var(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-/* "adios.pyx":341
+/* "adios.pyx":394
  *                             local_offsets)
  * 
  * cpdef int define_attribute (int64_t group,             # <<<<<<<<<<<<<<
@@ -4009,23 +5308,23 @@ static PyObject *__pyx_pf_5adios_26define_var(CYTHON_UNUSED PyObject *__pyx_self
  *                             char * path,
  */
 
-static PyObject *__pyx_pw_5adios_29define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_5adios_define_attribute(int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_value, char *__pyx_v_var, CYTHON_UNUSED int __pyx_skip_dispatch) {
+static PyObject *__pyx_pw_5adios_33define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_5adios_define_attribute(int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_value, char *__pyx_v_var, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("define_attribute", 0);
 
-  /* "adios.pyx":347
+  /* "adios.pyx":400
  *                             char * value,
  *                             char * var):
  *     return adios_define_attribute (group,             # <<<<<<<<<<<<<<
  *                                    name,
  *                                    path,
  */
-  __pyx_r = adios_define_attribute(__pyx_v_group, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_v_type), __pyx_v_value, __pyx_v_var);
+  __pyx_r = adios_define_attribute(__pyx_v_group, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_v_atype), __pyx_v_value, __pyx_v_var);
   goto __pyx_L0;
 
-  /* "adios.pyx":341
+  /* "adios.pyx":394
  *                             local_offsets)
  * 
  * cpdef int define_attribute (int64_t group,             # <<<<<<<<<<<<<<
@@ -4040,12 +5339,13 @@ static int __pyx_f_5adios_define_attribute(int64_t __pyx_v_group, char *__pyx_v_
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_29define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_29define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_33define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_32define_attribute[] = "define_attribute(int64_t group, char *name, char *path, int atype, char *value, char *var) -> int";
+static PyObject *__pyx_pw_5adios_33define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_group;
   char *__pyx_v_name;
   char *__pyx_v_path;
-  int __pyx_v_type;
+  int __pyx_v_atype;
   char *__pyx_v_value;
   char *__pyx_v_var;
   int __pyx_lineno = 0;
@@ -4055,7 +5355,7 @@ static PyObject *__pyx_pw_5adios_29define_attribute(PyObject *__pyx_self, PyObje
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("define_attribute (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_type,&__pyx_n_s_value,&__pyx_n_s_var,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_atype,&__pyx_n_s_value,&__pyx_n_s_var,0};
     PyObject* values[6] = {0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -4078,31 +5378,31 @@ static PyObject *__pyx_pw_5adios_29define_attribute(PyObject *__pyx_self, PyObje
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_type)) != 0)) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_atype)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
         if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
         if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_var)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_attribute") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_attribute") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 6) {
       goto __pyx_L5_argtuple_error;
@@ -4114,29 +5414,29 @@ static PyObject *__pyx_pw_5adios_29define_attribute(PyObject *__pyx_self, PyObje
       values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
       values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
     }
-    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_type = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_value = __Pyx_PyObject_AsString(values[4]); if (unlikely((!__pyx_v_value) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_var = __Pyx_PyObject_AsString(values[5]); if (unlikely((!__pyx_v_var) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_atype = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_atype == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_value = __Pyx_PyObject_AsString(values[4]); if (unlikely((!__pyx_v_value) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_var = __Pyx_PyObject_AsString(values[5]); if (unlikely((!__pyx_v_var) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.define_attribute", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_28define_attribute(__pyx_self, __pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_type, __pyx_v_value, __pyx_v_var);
+  __pyx_r = __pyx_pf_5adios_32define_attribute(__pyx_self, __pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_atype, __pyx_v_value, __pyx_v_var);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_28define_attribute(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_value, char *__pyx_v_var) {
+static PyObject *__pyx_pf_5adios_32define_attribute(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_value, char *__pyx_v_var) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -4145,7 +5445,7 @@ static PyObject *__pyx_pf_5adios_28define_attribute(CYTHON_UNUSED PyObject *__py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("define_attribute", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_define_attribute(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_type, __pyx_v_value, __pyx_v_var, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_define_attribute(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_atype, __pyx_v_value, __pyx_v_var, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -4162,71 +5462,526 @@ static PyObject *__pyx_pf_5adios_28define_attribute(CYTHON_UNUSED PyObject *__py
   return __pyx_r;
 }
 
-/* "adios.pyx":354
+/* "adios.pyx":407
  *                                    var)
  * 
- * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
- *                          char * method,
- *                          char * parameters = "",
+ * cpdef int define_attribute_byvalue (int64_t group,             # <<<<<<<<<<<<<<
+ *                                     char * name,
+ *                                     char * path,
  */
 
-static PyObject *__pyx_pw_5adios_31select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_5adios_select_method(int64_t __pyx_v_group, char *__pyx_v_method, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_select_method *__pyx_optional_args) {
-  char *__pyx_v_parameters = ((char *)__pyx_k__4);
-  char *__pyx_v_base_path = ((char *)__pyx_k__4);
+static PyObject *__pyx_pw_5adios_35define_attribute_byvalue(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_5adios_define_attribute_byvalue(int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, PyObject *__pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyArrayObject *__pyx_v_val_ = 0;
+  PyObject *__pyx_v_atype = NULL;
+  char *__pyx_v_pt1;
+  char **__pyx_v_pt2;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("select_method", 0);
-  if (__pyx_optional_args) {
-    if (__pyx_optional_args->__pyx_n > 0) {
-      __pyx_v_parameters = __pyx_optional_args->parameters;
-      if (__pyx_optional_args->__pyx_n > 1) {
-        __pyx_v_base_path = __pyx_optional_args->base_path;
-      }
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  char *__pyx_t_7;
+  ADIOS_DATATYPES __pyx_t_8;
+  Py_ssize_t __pyx_t_9;
+  int __pyx_t_10;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define_attribute_byvalue", 0);
+
+  /* "adios.pyx":412
+ *                                     val):
+ *     cdef np.ndarray val_
+ *     if isinstance(val, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *         if val.flags.contiguous:
+ *             val_ = val
+ */
+  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_val, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
+
+    /* "adios.pyx":413
+ *     cdef np.ndarray val_
+ *     if isinstance(val, (np.ndarray)):
+ *         if val.flags.contiguous:             # <<<<<<<<<<<<<<
+ *             val_ = val
+ *         else:
+ */
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_flags); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (__pyx_t_2) {
+
+      /* "adios.pyx":414
+ *     if isinstance(val, (np.ndarray)):
+ *         if val.flags.contiguous:
+ *             val_ = val             # <<<<<<<<<<<<<<
+ *         else:
+ *             val_ = np.array(val, copy=True)
+ */
+      if (!(likely(((__pyx_v_val) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_val, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __pyx_v_val;
+      __Pyx_INCREF(__pyx_t_4);
+      __pyx_v_val_ = ((PyArrayObject *)__pyx_t_4);
+      __pyx_t_4 = 0;
+      goto __pyx_L4;
+    }
+    /*else*/ {
+
+      /* "adios.pyx":416
+ *             val_ = val
+ *         else:
+ *             val_ = np.array(val, copy=True)             # <<<<<<<<<<<<<<
+ *     else:
+ *         val_ = np.array(val)
+ */
+      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_INCREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_val);
+      __Pyx_GIVEREF(__pyx_v_val);
+      __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_copy, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_val_ = ((PyArrayObject *)__pyx_t_6);
+      __pyx_t_6 = 0;
     }
+    __pyx_L4:;
+    goto __pyx_L3;
   }
+  /*else*/ {
 
-  /* "adios.pyx":358
- *                          char * parameters = "",
- *                          char * base_path = ""):
- *     return adios_select_method (group,             # <<<<<<<<<<<<<<
- *                                 method,
- *                                 parameters,
+    /* "adios.pyx":418
+ *             val_ = np.array(val, copy=True)
+ *     else:
+ *         val_ = np.array(val)             # <<<<<<<<<<<<<<
+ * 
+ *     atype = np2adiostype(val_.dtype)
  */
-  __pyx_r = adios_select_method(__pyx_v_group, __pyx_v_method, __pyx_v_parameters, __pyx_v_base_path);
-  goto __pyx_L0;
+    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_5)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_5);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+      }
+    }
+    if (!__pyx_t_5) {
+      __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_val); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+    } else {
+      __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
+      __Pyx_INCREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_v_val);
+      __Pyx_GIVEREF(__pyx_v_val);
+      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_val_ = ((PyArrayObject *)__pyx_t_6);
+    __pyx_t_6 = 0;
+  }
+  __pyx_L3:;
 
-  /* "adios.pyx":354
- *                                    var)
+  /* "adios.pyx":420
+ *         val_ = np.array(val)
  * 
- * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
- *                          char * method,
- *                          char * parameters = "",
+ *     atype = np2adiostype(val_.dtype)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef char * pt1
  */
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val_), __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __pyx_f_5adios_np2adiostype(((PyArray_Descr *)__pyx_t_6), 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_v_atype = __pyx_t_4;
+  __pyx_t_4 = 0;
 
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":424
+ *     cdef char * pt1
+ *     cdef char ** pt2
+ *     if (val_.dtype.char == 'S'):             # <<<<<<<<<<<<<<
+ *         if (val_.size == 1):
+ *             pt1 = PyString_AsString(val)
+ */
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val_), __pyx_n_s_dtype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_char); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_t_6, __pyx_n_s_S, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  if (__pyx_t_2) {
 
-/* Python wrapper */
-static PyObject *__pyx_pw_5adios_31select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_31select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int64_t __pyx_v_group;
-  char *__pyx_v_method;
-  char *__pyx_v_parameters;
-  char *__pyx_v_base_path;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("select_method (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_method,&__pyx_n_s_parameters,&__pyx_n_s_base_path,0};
-    PyObject* values[4] = {0,0,0,0};
-    if (unlikely(__pyx_kwds)) {
+    /* "adios.pyx":425
+ *     cdef char ** pt2
+ *     if (val_.dtype.char == 'S'):
+ *         if (val_.size == 1):             # <<<<<<<<<<<<<<
+ *             pt1 = PyString_AsString(val)
+ *             adios_define_attribute_byvalue (group,
+ */
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val_), __pyx_n_s_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_6, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (__pyx_t_2) {
+
+      /* "adios.pyx":426
+ *     if (val_.dtype.char == 'S'):
+ *         if (val_.size == 1):
+ *             pt1 = PyString_AsString(val)             # <<<<<<<<<<<<<<
+ *             adios_define_attribute_byvalue (group,
+ *                                             name,
+ */
+      __pyx_t_7 = PyString_AsString(__pyx_v_val); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_pt1 = __pyx_t_7;
+
+      /* "adios.pyx":430
+ *                                             name,
+ *                                             path,
+ *                                             DATATYPE.string,             # <<<<<<<<<<<<<<
+ *                                             1,
+ *                                             <void *> pt1)
+ */
+      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_string); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = ((ADIOS_DATATYPES)PyInt_AsLong(__pyx_t_6)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+      /* "adios.pyx":427
+ *         if (val_.size == 1):
+ *             pt1 = PyString_AsString(val)
+ *             adios_define_attribute_byvalue (group,             # <<<<<<<<<<<<<<
+ *                                             name,
+ *                                             path,
+ */
+      adios_define_attribute_byvalue(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_t_8, 1, ((void *)__pyx_v_pt1));
+      goto __pyx_L6;
+    }
+    /*else*/ {
+
+      /* "adios.pyx":434
+ *                                             <void *> pt1)
+ *         else:
+ *             pt2 = to_cstring_array(val)             # <<<<<<<<<<<<<<
+ *             adios_define_attribute_byvalue (group,
+ *                                             name,
+ */
+      __pyx_v_pt2 = __pyx_f_5adios_to_cstring_array(__pyx_v_val);
+
+      /* "adios.pyx":438
+ *                                             name,
+ *                                             path,
+ *                                             DATATYPE.string_array,             # <<<<<<<<<<<<<<
+ *                                             len(val),
+ *                                             <void *> pt2)
+ */
+      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_string_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_8 = ((ADIOS_DATATYPES)PyInt_AsLong(__pyx_t_4)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+      /* "adios.pyx":439
+ *                                             path,
+ *                                             DATATYPE.string_array,
+ *                                             len(val),             # <<<<<<<<<<<<<<
+ *                                             <void *> pt2)
+ *             free(pt2)
+ */
+      __pyx_t_9 = PyObject_Length(__pyx_v_val); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+      /* "adios.pyx":435
+ *         else:
+ *             pt2 = to_cstring_array(val)
+ *             adios_define_attribute_byvalue (group,             # <<<<<<<<<<<<<<
+ *                                             name,
+ *                                             path,
+ */
+      adios_define_attribute_byvalue(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_t_8, __pyx_t_9, ((void *)__pyx_v_pt2));
+
+      /* "adios.pyx":441
+ *                                             len(val),
+ *                                             <void *> pt2)
+ *             free(pt2)             # <<<<<<<<<<<<<<
+ *     else:
+ *         adios_define_attribute_byvalue (group,
+ */
+      free(__pyx_v_pt2);
+    }
+    __pyx_L6:;
+    goto __pyx_L5;
+  }
+  /*else*/ {
+
+    /* "adios.pyx":446
+ *                                         name,
+ *                                         path,
+ *                                         <ADIOS_DATATYPES> atype,             # <<<<<<<<<<<<<<
+ *                                         val_.size,
+ *                                         <void *> val_.data)
+ */
+    __pyx_t_8 = ((ADIOS_DATATYPES)PyInt_AsLong(__pyx_v_atype)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "adios.pyx":447
+ *                                         path,
+ *                                         <ADIOS_DATATYPES> atype,
+ *                                         val_.size,             # <<<<<<<<<<<<<<
+ *                                         <void *> val_.data)
+ * 
+ */
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val_), __pyx_n_s_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "adios.pyx":443
+ *             free(pt2)
+ *     else:
+ *         adios_define_attribute_byvalue (group,             # <<<<<<<<<<<<<<
+ *                                         name,
+ *                                         path,
+ */
+    adios_define_attribute_byvalue(__pyx_v_group, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_t_8), __pyx_t_10, ((void *)__pyx_v_val_->data));
+  }
+  __pyx_L5:;
+
+  /* "adios.pyx":407
+ *                                    var)
+ * 
+ * cpdef int define_attribute_byvalue (int64_t group,             # <<<<<<<<<<<<<<
+ *                                     char * name,
+ *                                     char * path,
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_WriteUnraisable("adios.define_attribute_byvalue", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_val_);
+  __Pyx_XDECREF(__pyx_v_atype);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_35define_attribute_byvalue(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_34define_attribute_byvalue[] = "define_attribute_byvalue(int64_t group, char *name, char *path, val) -> int";
+static PyObject *__pyx_pw_5adios_35define_attribute_byvalue(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int64_t __pyx_v_group;
+  char *__pyx_v_name;
+  char *__pyx_v_path;
+  PyObject *__pyx_v_val = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define_attribute_byvalue (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_val,0};
+    PyObject* values[4] = {0,0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_group)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_attribute_byvalue", 1, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  2:
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_attribute_byvalue", 1, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  3:
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_attribute_byvalue", 1, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_attribute_byvalue") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+    }
+    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = values[3];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("define_attribute_byvalue", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.define_attribute_byvalue", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_34define_attribute_byvalue(__pyx_self, __pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_val);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_34define_attribute_byvalue(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, PyObject *__pyx_v_val) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define_attribute_byvalue", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_5adios_define_attribute_byvalue(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.define_attribute_byvalue", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":450
+ *                                         <void *> val_.data)
+ * 
+ * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
+ *                          char * method,
+ *                          char * parameters = "",
+ */
+
+static PyObject *__pyx_pw_5adios_37select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_5adios_select_method(int64_t __pyx_v_group, char *__pyx_v_method, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_select_method *__pyx_optional_args) {
+  char *__pyx_v_parameters = ((char *)__pyx_k__7);
+  char *__pyx_v_base_path = ((char *)__pyx_k__7);
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("select_method", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_parameters = __pyx_optional_args->parameters;
+      if (__pyx_optional_args->__pyx_n > 1) {
+        __pyx_v_base_path = __pyx_optional_args->base_path;
+      }
+    }
+  }
+
+  /* "adios.pyx":454
+ *                          char * parameters = "",
+ *                          char * base_path = ""):
+ *     return adios_select_method (group,             # <<<<<<<<<<<<<<
+ *                                 method,
+ *                                 parameters,
+ */
+  __pyx_r = adios_select_method(__pyx_v_group, __pyx_v_method, __pyx_v_parameters, __pyx_v_base_path);
+  goto __pyx_L0;
+
+  /* "adios.pyx":450
+ *                                         <void *> val_.data)
+ * 
+ * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
+ *                          char * method,
+ *                          char * parameters = "",
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_37select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_36select_method[] = "select_method(int64_t group, char *method, char *parameters='', char *base_path='') -> int";
+static PyObject *__pyx_pw_5adios_37select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int64_t __pyx_v_group;
+  char *__pyx_v_method;
+  char *__pyx_v_parameters;
+  char *__pyx_v_base_path;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("select_method (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_method,&__pyx_n_s_parameters,&__pyx_n_s_base_path,0};
+    PyObject* values[4] = {0,0,0,0};
+    if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
       switch (pos_args) {
@@ -4245,7 +6000,7 @@ static PyObject *__pyx_pw_5adios_31select_method(PyObject *__pyx_self, PyObject
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("select_method", 0, 2, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("select_method", 0, 2, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (kw_args > 0) {
@@ -4259,7 +6014,7 @@ static PyObject *__pyx_pw_5adios_31select_method(PyObject *__pyx_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "select_method") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "select_method") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -4271,35 +6026,35 @@ static PyObject *__pyx_pw_5adios_31select_method(PyObject *__pyx_self, PyObject
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_method = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 355; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_method = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     if (values[2]) {
-      __pyx_v_parameters = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_parameters) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_parameters = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_parameters) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_parameters = ((char *)__pyx_k__4);
+      __pyx_v_parameters = ((char *)__pyx_k__7);
     }
     if (values[3]) {
-      __pyx_v_base_path = __Pyx_PyObject_AsString(values[3]); if (unlikely((!__pyx_v_base_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_base_path = __Pyx_PyObject_AsString(values[3]); if (unlikely((!__pyx_v_base_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_base_path = ((char *)__pyx_k__4);
+      __pyx_v_base_path = ((char *)__pyx_k__7);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("select_method", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("select_method", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.select_method", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_30select_method(__pyx_self, __pyx_v_group, __pyx_v_method, __pyx_v_parameters, __pyx_v_base_path);
+  __pyx_r = __pyx_pf_5adios_36select_method(__pyx_self, __pyx_v_group, __pyx_v_method, __pyx_v_parameters, __pyx_v_base_path);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_30select_method(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_method, char *__pyx_v_parameters, char *__pyx_v_base_path) {
+static PyObject *__pyx_pf_5adios_36select_method(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_method, char *__pyx_v_parameters, char *__pyx_v_base_path) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -4314,7 +6069,7 @@ static PyObject *__pyx_pf_5adios_30select_method(CYTHON_UNUSED PyObject *__pyx_s
   __pyx_t_2.parameters = __pyx_v_parameters;
   __pyx_t_2.base_path = __pyx_v_base_path;
   __pyx_t_1 = __pyx_f_5adios_select_method(__pyx_v_group, __pyx_v_method, 0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -4331,396 +6086,538 @@ static PyObject *__pyx_pf_5adios_30select_method(CYTHON_UNUSED PyObject *__pyx_s
   return __pyx_r;
 }
 
-/* "adios.pyx":368
+/* "adios.pyx":464
  * ## ====================
  * 
- * cdef type adios2nptype(ADIOS_DATATYPES t):             # <<<<<<<<<<<<<<
- *     cdef type ntype = None
- *     if t == adios_byte:
+ * cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):             # <<<<<<<<<<<<<<
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None
  */
 
-static PyObject *__pyx_f_5adios_adios2nptype(ADIOS_DATATYPES __pyx_v_t) {
-  PyObject *__pyx_v_ntype = 0;
-  PyObject *__pyx_r = NULL;
+static PyObject *__pyx_pw_5adios_39adios2npdtype(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyArray_Descr *__pyx_f_5adios_adios2npdtype(ADIOS_DATATYPES __pyx_v_t, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_adios2npdtype *__pyx_optional_args) {
+  int __pyx_v_strlen = ((int)1);
+  PyArray_Descr *__pyx_v_ntype = 0;
+  PyArray_Descr *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("adios2nptype", 0);
+  __Pyx_RefNannySetupContext("adios2npdtype", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_strlen = __pyx_optional_args->strlen;
+    }
+  }
 
-  /* "adios.pyx":369
- * 
- * cdef type adios2nptype(ADIOS_DATATYPES t):
- *     cdef type ntype = None             # <<<<<<<<<<<<<<
+  /* "adios.pyx":466
+ * cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None             # <<<<<<<<<<<<<<
  *     if t == adios_byte:
- *         ntype = np.int8
+ *         ntype = np.dtype(np.int8)
  */
   __Pyx_INCREF(Py_None);
-  __pyx_v_ntype = ((PyObject*)Py_None);
+  __pyx_v_ntype = ((PyArray_Descr *)Py_None);
 
-  /* "adios.pyx":394
- *     elif t == adios_complex:
- *         ntype = np.complex64
- *     elif t == adios_double_complex:             # <<<<<<<<<<<<<<
- *         ntype = np.complex128
+  /* "adios.pyx":493
+ *     elif t == adios_double_complex:
+ *         ntype = np.dtype(np.complex128)
+ *     elif t == adios_string:             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype((np.str_, strlen))
  *     else:
  */
   switch (__pyx_v_t) {
 
-    /* "adios.pyx":370
- * cdef type adios2nptype(ADIOS_DATATYPES t):
- *     cdef type ntype = None
+    /* "adios.pyx":467
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None
  *     if t == adios_byte:             # <<<<<<<<<<<<<<
- *         ntype = np.int8
+ *         ntype = np.dtype(np.int8)
  *     elif t == adios_short:
  */
     case adios_byte:
 
-    /* "adios.pyx":371
- *     cdef type ntype = None
+    /* "adios.pyx":468
+ *     cdef np.dtype ntype = None
  *     if t == adios_byte:
- *         ntype = np.int8             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.int8)             # <<<<<<<<<<<<<<
  *     elif t == adios_short:
- *         ntype = np.int16
+ *         ntype = np.dtype(np.int16)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios.pyx":372
+    /* "adios.pyx":469
  *     if t == adios_byte:
- *         ntype = np.int8
+ *         ntype = np.dtype(np.int8)
  *     elif t == adios_short:             # <<<<<<<<<<<<<<
- *         ntype = np.int16
+ *         ntype = np.dtype(np.int16)
  *     elif t == adios_integer:
  */
     case adios_short:
 
-    /* "adios.pyx":373
- *         ntype = np.int8
+    /* "adios.pyx":470
+ *         ntype = np.dtype(np.int8)
  *     elif t == adios_short:
- *         ntype = np.int16             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.int16)             # <<<<<<<<<<<<<<
  *     elif t == adios_integer:
- *         ntype = np.int32
+ *         ntype = np.dtype(np.int32)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios.pyx":374
+    /* "adios.pyx":471
  *     elif t == adios_short:
- *         ntype = np.int16
+ *         ntype = np.dtype(np.int16)
  *     elif t == adios_integer:             # <<<<<<<<<<<<<<
- *         ntype = np.int32
+ *         ntype = np.dtype(np.int32)
  *     elif t == adios_long:
  */
     case adios_integer:
 
-    /* "adios.pyx":375
- *         ntype = np.int16
+    /* "adios.pyx":472
+ *         ntype = np.dtype(np.int16)
  *     elif t == adios_integer:
- *         ntype = np.int32             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.int32)             # <<<<<<<<<<<<<<
  *     elif t == adios_long:
- *         ntype = np.int64
+ *         ntype = np.dtype(np.int64)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios.pyx":376
+    /* "adios.pyx":473
  *     elif t == adios_integer:
- *         ntype = np.int32
+ *         ntype = np.dtype(np.int32)
  *     elif t == adios_long:             # <<<<<<<<<<<<<<
- *         ntype = np.int64
+ *         ntype = np.dtype(np.int64)
  *     elif t == adios_unsigned_byte:
  */
     case adios_long:
 
-    /* "adios.pyx":377
- *         ntype = np.int32
+    /* "adios.pyx":474
+ *         ntype = np.dtype(np.int32)
  *     elif t == adios_long:
- *         ntype = np.int64             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.int64)             # <<<<<<<<<<<<<<
  *     elif t == adios_unsigned_byte:
- *         ntype = np.uint8
+ *         ntype = np.dtype(np.uint8)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios.pyx":378
+    /* "adios.pyx":475
  *     elif t == adios_long:
- *         ntype = np.int64
+ *         ntype = np.dtype(np.int64)
  *     elif t == adios_unsigned_byte:             # <<<<<<<<<<<<<<
- *         ntype = np.uint8
+ *         ntype = np.dtype(np.uint8)
  *     elif t == adios_unsigned_short:
  */
     case adios_unsigned_byte:
 
-    /* "adios.pyx":379
- *         ntype = np.int64
+    /* "adios.pyx":476
+ *         ntype = np.dtype(np.int64)
  *     elif t == adios_unsigned_byte:
- *         ntype = np.uint8             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.uint8)             # <<<<<<<<<<<<<<
  *     elif t == adios_unsigned_short:
- *         ntype = np.uint16
+ *         ntype = np.dtype(np.uint16)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios.pyx":380
+    /* "adios.pyx":477
  *     elif t == adios_unsigned_byte:
- *         ntype = np.uint8
+ *         ntype = np.dtype(np.uint8)
  *     elif t == adios_unsigned_short:             # <<<<<<<<<<<<<<
- *         ntype = np.uint16
+ *         ntype = np.dtype(np.uint16)
  *     elif t == adios_unsigned_integer:
  */
     case adios_unsigned_short:
 
-    /* "adios.pyx":381
- *         ntype = np.uint8
+    /* "adios.pyx":478
+ *         ntype = np.dtype(np.uint8)
  *     elif t == adios_unsigned_short:
- *         ntype = np.uint16             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.uint16)             # <<<<<<<<<<<<<<
  *     elif t == adios_unsigned_integer:
- *         ntype = np.uint32
+ *         ntype = np.dtype(np.uint32)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios.pyx":382
+    /* "adios.pyx":479
  *     elif t == adios_unsigned_short:
- *         ntype = np.uint16
+ *         ntype = np.dtype(np.uint16)
  *     elif t == adios_unsigned_integer:             # <<<<<<<<<<<<<<
- *         ntype = np.uint32
+ *         ntype = np.dtype(np.uint32)
  *     elif t == adios_unsigned_long:
  */
     case adios_unsigned_integer:
 
-    /* "adios.pyx":383
- *         ntype = np.uint16
+    /* "adios.pyx":480
+ *         ntype = np.dtype(np.uint16)
  *     elif t == adios_unsigned_integer:
- *         ntype = np.uint32             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.uint32)             # <<<<<<<<<<<<<<
  *     elif t == adios_unsigned_long:
- *         ntype = np.uint64
+ *         ntype = np.dtype(np.uint64)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios.pyx":384
+    /* "adios.pyx":481
  *     elif t == adios_unsigned_integer:
- *         ntype = np.uint32
+ *         ntype = np.dtype(np.uint32)
  *     elif t == adios_unsigned_long:             # <<<<<<<<<<<<<<
- *         ntype = np.uint64
+ *         ntype = np.dtype(np.uint64)
  *     elif t == adios_real:
  */
     case adios_unsigned_long:
 
-    /* "adios.pyx":385
- *         ntype = np.uint32
+    /* "adios.pyx":482
+ *         ntype = np.dtype(np.uint32)
  *     elif t == adios_unsigned_long:
- *         ntype = np.uint64             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.uint64)             # <<<<<<<<<<<<<<
  *     elif t == adios_real:
- *         ntype = np.float32
+ *         ntype = np.dtype(np.float32)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios.pyx":386
+    /* "adios.pyx":483
  *     elif t == adios_unsigned_long:
- *         ntype = np.uint64
+ *         ntype = np.dtype(np.uint64)
  *     elif t == adios_real:             # <<<<<<<<<<<<<<
- *         ntype = np.float32
+ *         ntype = np.dtype(np.float32)
  *     elif t == adios_double:
  */
     case adios_real:
 
-    /* "adios.pyx":387
- *         ntype = np.uint64
+    /* "adios.pyx":484
+ *         ntype = np.dtype(np.uint64)
  *     elif t == adios_real:
- *         ntype = np.float32             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.float32)             # <<<<<<<<<<<<<<
  *     elif t == adios_double:
- *         ntype = np.float64
+ *         ntype = np.dtype(np.float64)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios.pyx":388
+    /* "adios.pyx":485
  *     elif t == adios_real:
- *         ntype = np.float32
+ *         ntype = np.dtype(np.float32)
  *     elif t == adios_double:             # <<<<<<<<<<<<<<
- *         ntype = np.float64
+ *         ntype = np.dtype(np.float64)
  *     elif t == adios_long_double:
  */
     case adios_double:
 
-    /* "adios.pyx":389
- *         ntype = np.float32
+    /* "adios.pyx":486
+ *         ntype = np.dtype(np.float32)
  *     elif t == adios_double:
- *         ntype = np.float64             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.float64)             # <<<<<<<<<<<<<<
  *     elif t == adios_long_double:
- *         ntype = np.float128
+ *         ntype = np.dtype(np.float128)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios.pyx":390
+    /* "adios.pyx":487
  *     elif t == adios_double:
- *         ntype = np.float64
+ *         ntype = np.dtype(np.float64)
  *     elif t == adios_long_double:             # <<<<<<<<<<<<<<
- *         ntype = np.float128
+ *         ntype = np.dtype(np.float128)
  *     elif t == adios_complex:
  */
     case adios_long_double:
 
-    /* "adios.pyx":391
- *         ntype = np.float64
+    /* "adios.pyx":488
+ *         ntype = np.dtype(np.float64)
  *     elif t == adios_long_double:
- *         ntype = np.float128             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.float128)             # <<<<<<<<<<<<<<
  *     elif t == adios_complex:
- *         ntype = np.complex64
+ *         ntype = np.dtype(np.complex64)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios.pyx":392
+    /* "adios.pyx":489
  *     elif t == adios_long_double:
- *         ntype = np.float128
+ *         ntype = np.dtype(np.float128)
  *     elif t == adios_complex:             # <<<<<<<<<<<<<<
- *         ntype = np.complex64
+ *         ntype = np.dtype(np.complex64)
  *     elif t == adios_double_complex:
  */
     case adios_complex:
 
-    /* "adios.pyx":393
- *         ntype = np.float128
+    /* "adios.pyx":490
+ *         ntype = np.dtype(np.float128)
  *     elif t == adios_complex:
- *         ntype = np.complex64             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.complex64)             # <<<<<<<<<<<<<<
  *     elif t == adios_double_complex:
- *         ntype = np.complex128
+ *         ntype = np.dtype(np.complex128)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios.pyx":394
+    /* "adios.pyx":491
  *     elif t == adios_complex:
- *         ntype = np.complex64
+ *         ntype = np.dtype(np.complex64)
  *     elif t == adios_double_complex:             # <<<<<<<<<<<<<<
- *         ntype = np.complex128
- *     else:
+ *         ntype = np.dtype(np.complex128)
+ *     elif t == adios_string:
  */
     case adios_double_complex:
 
-    /* "adios.pyx":395
- *         ntype = np.complex64
+    /* "adios.pyx":492
+ *         ntype = np.dtype(np.complex64)
+ *     elif t == adios_double_complex:
+ *         ntype = np.dtype(np.complex128)             # <<<<<<<<<<<<<<
+ *     elif t == adios_string:
+ *         ntype = np.dtype((np.str_, strlen))
+ */
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
+    __pyx_t_2 = 0;
+    break;
+
+    /* "adios.pyx":493
  *     elif t == adios_double_complex:
- *         ntype = np.complex128             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.complex128)
+ *     elif t == adios_string:             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype((np.str_, strlen))
+ *     else:
+ */
+    case adios_string:
+
+    /* "adios.pyx":494
+ *         ntype = np.dtype(np.complex128)
+ *     elif t == adios_string:
+ *         ntype = np.dtype((np.str_, strlen))             # <<<<<<<<<<<<<<
  *     else:
  *         ntype = None
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_str); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_strlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_1 = 0;
     __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_3);
+    __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_3));
+    __pyx_t_3 = 0;
     break;
     default:
 
-    /* "adios.pyx":397
- *         ntype = np.complex128
+    /* "adios.pyx":496
+ *         ntype = np.dtype((np.str_, strlen))
  *     else:
  *         ntype = None             # <<<<<<<<<<<<<<
  * 
  *     return ntype
  */
     __Pyx_INCREF(Py_None);
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)Py_None));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)Py_None));
     break;
   }
 
-  /* "adios.pyx":399
+  /* "adios.pyx":498
  *         ntype = None
  * 
  *     return ntype             # <<<<<<<<<<<<<<
@@ -4732,28 +6629,126 @@ static PyObject *__pyx_f_5adios_adios2nptype(ADIOS_DATATYPES __pyx_v_t) {
   __pyx_r = __pyx_v_ntype;
   goto __pyx_L0;
 
-  /* "adios.pyx":368
+  /* "adios.pyx":464
  * ## ====================
  * 
- * cdef type adios2nptype(ADIOS_DATATYPES t):             # <<<<<<<<<<<<<<
- *     cdef type ntype = None
- *     if t == adios_byte:
+ * cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):             # <<<<<<<<<<<<<<
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None
  */
 
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_AddTraceback("adios.adios2nptype", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios.adios2npdtype", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_ntype);
+  __Pyx_XDECREF((PyObject *)__pyx_v_ntype);
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_39adios2npdtype(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_38adios2npdtype[] = "adios2npdtype(ADIOS_DATATYPES t, int strlen=1) -> dtype\n strlen apply only to string type ";
+static PyObject *__pyx_pw_5adios_39adios2npdtype(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  ADIOS_DATATYPES __pyx_v_t;
+  int __pyx_v_strlen;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("adios2npdtype (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_t,&__pyx_n_s_strlen,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_t)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_strlen);
+          if (value) { values[1] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "adios2npdtype") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_t = ((ADIOS_DATATYPES)PyInt_AsLong(values[0])); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[1]) {
+      __pyx_v_strlen = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_strlen == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_strlen = ((int)1);
+    }
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("adios2npdtype", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.adios2npdtype", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_38adios2npdtype(__pyx_self, __pyx_v_t, __pyx_v_strlen);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_38adios2npdtype(CYTHON_UNUSED PyObject *__pyx_self, ADIOS_DATATYPES __pyx_v_t, int __pyx_v_strlen) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  struct __pyx_opt_args_5adios_adios2npdtype __pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("adios2npdtype", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2.__pyx_n = 1;
+  __pyx_t_2.strlen = __pyx_v_strlen;
+  __pyx_t_1 = ((PyObject *)__pyx_f_5adios_adios2npdtype(__pyx_v_t, 0, &__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.adios2npdtype", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":401
+/* "adios.pyx":500
  *     return ntype
  * 
  * cdef printfile(ADIOS_FILE * f):             # <<<<<<<<<<<<<<
@@ -4774,16 +6769,16 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("printfile", 0);
 
-  /* "adios.pyx":402
+  /* "adios.pyx":501
  * 
  * cdef printfile(ADIOS_FILE * f):
  *     print '%15s : %lu' % ('fh', f.fh)             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('nvars', f.nvars)
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])
  */
-  __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_f->fh); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_f->fh); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_fh);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_fh);
@@ -4791,22 +6786,22 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":403
+  /* "adios.pyx":502
  * cdef printfile(ADIOS_FILE * f):
  *     print '%15s : %lu' % ('fh', f.fh)
  *     print '%15s : %d' % ('nvars', f.nvars)             # <<<<<<<<<<<<<<
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])
  *     print '%15s : %d' % ('nattrs', f.nattrs)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->nvars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->nvars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_nvars);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_nvars);
@@ -4814,30 +6809,30 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":404
+  /* "adios.pyx":503
  *     print '%15s : %lu' % ('fh', f.fh)
  *     print '%15s : %d' % ('nvars', f.nvars)
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('nattrs', f.nattrs)
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = __pyx_v_f->nvars;
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
-    __pyx_t_2 = __Pyx_PyBytes_FromString((__pyx_v_f->var_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyBytes_FromString((__pyx_v_f->var_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_var_namelist);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_var_namelist);
@@ -4845,22 +6840,22 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":405
+  /* "adios.pyx":504
  *     print '%15s : %d' % ('nvars', f.nvars)
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])
  *     print '%15s : %d' % ('nattrs', f.nattrs)             # <<<<<<<<<<<<<<
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])
  *     print '%15s : %d' % ('current_step', f.current_step)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->nattrs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->nattrs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_nattrs);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_nattrs);
@@ -4868,30 +6863,30 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":406
+  /* "adios.pyx":505
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])
  *     print '%15s : %d' % ('nattrs', f.nattrs)
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('current_step', f.current_step)
  *     print '%15s : %d' % ('last_step', f.last_step)
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = __pyx_v_f->nattrs;
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
-    __pyx_t_2 = __Pyx_PyBytes_FromString((__pyx_v_f->attr_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyBytes_FromString((__pyx_v_f->attr_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_attr_namelist);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_attr_namelist);
@@ -4899,22 +6894,22 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":407
+  /* "adios.pyx":506
  *     print '%15s : %d' % ('nattrs', f.nattrs)
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])
  *     print '%15s : %d' % ('current_step', f.current_step)             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('last_step', f.last_step)
  *     print '%15s : %s' % ('path', f.path)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->current_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->current_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_current_step);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_current_step);
@@ -4922,22 +6917,22 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":408
+  /* "adios.pyx":507
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])
  *     print '%15s : %d' % ('current_step', f.current_step)
  *     print '%15s : %d' % ('last_step', f.last_step)             # <<<<<<<<<<<<<<
  *     print '%15s : %s' % ('path', f.path)
  *     print '%15s : %d' % ('endianness', f.endianness)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_last_step);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_last_step);
@@ -4945,22 +6940,22 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":409
+  /* "adios.pyx":508
  *     print '%15s : %d' % ('current_step', f.current_step)
  *     print '%15s : %d' % ('last_step', f.last_step)
  *     print '%15s : %s' % ('path', f.path)             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('endianness', f.endianness)
  *     print '%15s : %d' % ('version', f.version)
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_f->path); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_f->path); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_path);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_path);
@@ -4968,22 +6963,22 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":410
+  /* "adios.pyx":509
  *     print '%15s : %d' % ('last_step', f.last_step)
  *     print '%15s : %s' % ('path', f.path)
  *     print '%15s : %d' % ('endianness', f.endianness)             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('version', f.version)
  *     print '%15s : %lu' % ('file_size', f.file_size)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->endianness); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->endianness); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_endianness);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_endianness);
@@ -4991,22 +6986,22 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":411
+  /* "adios.pyx":510
  *     print '%15s : %s' % ('path', f.path)
  *     print '%15s : %d' % ('endianness', f.endianness)
  *     print '%15s : %d' % ('version', f.version)             # <<<<<<<<<<<<<<
  *     print '%15s : %lu' % ('file_size', f.file_size)
  * 
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_version);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_version);
@@ -5014,22 +7009,22 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":412
+  /* "adios.pyx":511
  *     print '%15s : %d' % ('endianness', f.endianness)
  *     print '%15s : %d' % ('version', f.version)
  *     print '%15s : %lu' % ('file_size', f.file_size)             # <<<<<<<<<<<<<<
  * 
  * cdef printvar(ADIOS_VARINFO * v):
  */
-  __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_f->file_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_f->file_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_file_size);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_file_size);
@@ -5037,13 +7032,13 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":401
+  /* "adios.pyx":500
  *     return ntype
  * 
  * cdef printfile(ADIOS_FILE * f):             # <<<<<<<<<<<<<<
@@ -5065,12 +7060,12 @@ static PyObject *__pyx_f_5adios_printfile(ADIOS_FILE *__pyx_v_f) {
   return __pyx_r;
 }
 
-/* "adios.pyx":414
+/* "adios.pyx":513
  *     print '%15s : %lu' % ('file_size', f.file_size)
  * 
  * cdef printvar(ADIOS_VARINFO * v):             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('varid', v.varid)
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  */
 
 static PyObject *__pyx_f_5adios_printvar(ADIOS_VARINFO *__pyx_v_v) {
@@ -5086,16 +7081,16 @@ static PyObject *__pyx_f_5adios_printvar(ADIOS_VARINFO *__pyx_v_v) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("printvar", 0);
 
-  /* "adios.pyx":415
+  /* "adios.pyx":514
  * 
  * cdef printvar(ADIOS_VARINFO * v):
  *     print '%15s : %d' % ('varid', v.varid)             # <<<<<<<<<<<<<<
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  *     print '%15s : %d' % ('ndim', v.ndim)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_varid);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_varid);
@@ -5103,22 +7098,22 @@ static PyObject *__pyx_f_5adios_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":416
+  /* "adios.pyx":515
  * cdef printvar(ADIOS_VARINFO * v):
  *     print '%15s : %d' % ('varid', v.varid)
- *     print '%15s : %s' % ('type', adios2nptype(v.type))             # <<<<<<<<<<<<<<
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('ndim', v.ndim)
  *     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])
  */
-  __pyx_t_1 = ((PyObject *)__pyx_f_5adios_adios2nptype(__pyx_v_v->type)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)__pyx_f_5adios_adios2npdtype(__pyx_v_v->type, 0, NULL)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_type);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_type);
@@ -5126,22 +7121,22 @@ static PyObject *__pyx_f_5adios_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":417
+  /* "adios.pyx":516
  *     print '%15s : %d' % ('varid', v.varid)
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  *     print '%15s : %d' % ('ndim', v.ndim)             # <<<<<<<<<<<<<<
  *     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])
  *     print '%15s : %d' % ('nsteps', v.nsteps)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_ndim);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_ndim);
@@ -5149,30 +7144,30 @@ static PyObject *__pyx_f_5adios_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":418
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+  /* "adios.pyx":517
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  *     print '%15s : %d' % ('ndim', v.ndim)
  *     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('nsteps', v.nsteps)
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = __pyx_v_v->ndim;
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
-    __pyx_t_2 = __Pyx_PyInt_From_uint64_t((__pyx_v_v->dims[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyInt_From_uint64_t((__pyx_v_v->dims[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_dims);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_dims);
@@ -5180,22 +7175,22 @@ static PyObject *__pyx_f_5adios_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":419
+  /* "adios.pyx":518
  *     print '%15s : %d' % ('ndim', v.ndim)
  *     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])
  *     print '%15s : %d' % ('nsteps', v.nsteps)             # <<<<<<<<<<<<<<
  * 
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_nsteps);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_nsteps);
@@ -5203,18 +7198,18 @@ static PyObject *__pyx_f_5adios_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":414
+  /* "adios.pyx":513
  *     print '%15s : %lu' % ('file_size', f.file_size)
  * 
  * cdef printvar(ADIOS_VARINFO * v):             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('varid', v.varid)
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  */
 
   /* function exit code */
@@ -5231,167 +7226,205 @@ static PyObject *__pyx_f_5adios_printvar(ADIOS_VARINFO *__pyx_v_v) {
   return __pyx_r;
 }
 
-/* "adios.pyx":421
+/* "adios.pyx":520
  *     print '%15s : %d' % ('nsteps', v.nsteps)
  * 
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):             # <<<<<<<<<<<<<<
  *     if (name == "BP"):
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  */
 
 static ADIOS_READ_METHOD __pyx_f_5adios_str2adiosreadmethod(PyObject *__pyx_v_name) {
-  ADIOS_READ_METHOD __pyx_v_method;
+  PyObject *__pyx_v_method = NULL;
   ADIOS_READ_METHOD __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  ADIOS_READ_METHOD __pyx_t_5;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("str2adiosreadmethod", 0);
 
-  /* "adios.pyx":422
+  /* "adios.pyx":521
  * 
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):
  *     if (name == "BP"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  *     elif (name == "BP_AGGREGATE"):
  */
-  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_BP, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_BP, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (__pyx_t_1 != 0);
   if (__pyx_t_2) {
 
-    /* "adios.pyx":423
+    /* "adios.pyx":522
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):
  *     if (name == "BP"):
- *         method = ADIOS_READ_METHOD_BP             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.BP             # <<<<<<<<<<<<<<
  *     elif (name == "BP_AGGREGATE"):
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE
+ *         method = READ_METHOD.BP_AGGREGATE
  */
-    __pyx_v_method = ADIOS_READ_METHOD_BP;
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_BP); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_v_method = __pyx_t_4;
+    __pyx_t_4 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":424
+  /* "adios.pyx":523
  *     if (name == "BP"):
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  *     elif (name == "BP_AGGREGATE"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE
+ *         method = READ_METHOD.BP_AGGREGATE
  *     elif (name == "DATASPACES"):
  */
-  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_BP_AGGREGATE, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_BP_AGGREGATE, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = (__pyx_t_2 != 0);
   if (__pyx_t_1) {
 
-    /* "adios.pyx":425
- *         method = ADIOS_READ_METHOD_BP
+    /* "adios.pyx":524
+ *         method = READ_METHOD.BP
  *     elif (name == "BP_AGGREGATE"):
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.BP_AGGREGATE             # <<<<<<<<<<<<<<
  *     elif (name == "DATASPACES"):
- *         method = ADIOS_READ_METHOD_DATASPACES
+ *         method = READ_METHOD.DATASPACES
  */
-    __pyx_v_method = ADIOS_READ_METHOD_BP_AGGREGATE;
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_BP_AGGREGATE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_v_method = __pyx_t_3;
+    __pyx_t_3 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":426
+  /* "adios.pyx":525
  *     elif (name == "BP_AGGREGATE"):
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE
+ *         method = READ_METHOD.BP_AGGREGATE
  *     elif (name == "DATASPACES"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_DATASPACES
+ *         method = READ_METHOD.DATASPACES
  *     elif (name == "DIMES"):
  */
-  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_DATASPACES, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_DATASPACES, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (__pyx_t_1 != 0);
   if (__pyx_t_2) {
 
-    /* "adios.pyx":427
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE
+    /* "adios.pyx":526
+ *         method = READ_METHOD.BP_AGGREGATE
  *     elif (name == "DATASPACES"):
- *         method = ADIOS_READ_METHOD_DATASPACES             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.DATASPACES             # <<<<<<<<<<<<<<
  *     elif (name == "DIMES"):
- *         method = ADIOS_READ_METHOD_DIMES
+ *         method = READ_METHOD.DIMES
  */
-    __pyx_v_method = ADIOS_READ_METHOD_DATASPACES;
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_DATASPACES); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_v_method = __pyx_t_4;
+    __pyx_t_4 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":428
+  /* "adios.pyx":527
  *     elif (name == "DATASPACES"):
- *         method = ADIOS_READ_METHOD_DATASPACES
+ *         method = READ_METHOD.DATASPACES
  *     elif (name == "DIMES"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_DIMES
+ *         method = READ_METHOD.DIMES
  *     elif (name == "FLEXPATH"):
  */
-  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_DIMES, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_DIMES, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = (__pyx_t_2 != 0);
   if (__pyx_t_1) {
 
-    /* "adios.pyx":429
- *         method = ADIOS_READ_METHOD_DATASPACES
+    /* "adios.pyx":528
+ *         method = READ_METHOD.DATASPACES
  *     elif (name == "DIMES"):
- *         method = ADIOS_READ_METHOD_DIMES             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.DIMES             # <<<<<<<<<<<<<<
  *     elif (name == "FLEXPATH"):
- *         method = ADIOS_READ_METHOD_FLEXPATH
+ *         method = READ_METHOD.FLEXPATH
  */
-    __pyx_v_method = ADIOS_READ_METHOD_DIMES;
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_DIMES); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_v_method = __pyx_t_3;
+    __pyx_t_3 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":430
+  /* "adios.pyx":529
  *     elif (name == "DIMES"):
- *         method = ADIOS_READ_METHOD_DIMES
+ *         method = READ_METHOD.DIMES
  *     elif (name == "FLEXPATH"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_FLEXPATH
+ *         method = READ_METHOD.FLEXPATH
  *     elif (name == "ICEE"):
  */
-  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_FLEXPATH, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_FLEXPATH, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (__pyx_t_1 != 0);
   if (__pyx_t_2) {
 
-    /* "adios.pyx":431
- *         method = ADIOS_READ_METHOD_DIMES
+    /* "adios.pyx":530
+ *         method = READ_METHOD.DIMES
  *     elif (name == "FLEXPATH"):
- *         method = ADIOS_READ_METHOD_FLEXPATH             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.FLEXPATH             # <<<<<<<<<<<<<<
  *     elif (name == "ICEE"):
- *         method = ADIOS_READ_METHOD_ICEE
+ *         method = READ_METHOD.ICEE
  */
-    __pyx_v_method = ADIOS_READ_METHOD_FLEXPATH;
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_FLEXPATH); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_v_method = __pyx_t_4;
+    __pyx_t_4 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":432
+  /* "adios.pyx":531
  *     elif (name == "FLEXPATH"):
- *         method = ADIOS_READ_METHOD_FLEXPATH
+ *         method = READ_METHOD.FLEXPATH
  *     elif (name == "ICEE"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_ICEE
+ *         method = READ_METHOD.ICEE
  *     else:
  */
-  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_ICEE, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_ICEE, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = (__pyx_t_2 != 0);
   if (__pyx_t_1) {
 
-    /* "adios.pyx":433
- *         method = ADIOS_READ_METHOD_FLEXPATH
+    /* "adios.pyx":532
+ *         method = READ_METHOD.FLEXPATH
  *     elif (name == "ICEE"):
- *         method = ADIOS_READ_METHOD_ICEE             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.ICEE             # <<<<<<<<<<<<<<
  *     else:
  *         print '[WARN] Invalid read method name:', name, '. Use default BP method'
  */
-    __pyx_v_method = ADIOS_READ_METHOD_ICEE;
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_ICEE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_v_method = __pyx_t_3;
+    __pyx_t_3 = 0;
     goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "adios.pyx":435
- *         method = ADIOS_READ_METHOD_ICEE
+    /* "adios.pyx":534
+ *         method = READ_METHOD.ICEE
  *     else:
  *         print '[WARN] Invalid read method name:', name, '. Use default BP method'             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  * 
  */
-    __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_kp_s_WARN_Invalid_read_method_name);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_s_WARN_Invalid_read_method_name);
@@ -5402,57 +7435,66 @@ static ADIOS_READ_METHOD __pyx_f_5adios_str2adiosreadmethod(PyObject *__pyx_v_na
     __Pyx_INCREF(__pyx_kp_s_Use_default_BP_method);
     PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_s_Use_default_BP_method);
     __Pyx_GIVEREF(__pyx_kp_s_Use_default_BP_method);
-    if (__Pyx_Print(0, __pyx_t_3, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_Print(0, __pyx_t_3, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "adios.pyx":436
+    /* "adios.pyx":535
  *     else:
  *         print '[WARN] Invalid read method name:', name, '. Use default BP method'
- *         method = ADIOS_READ_METHOD_BP             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.BP             # <<<<<<<<<<<<<<
  * 
  *     return method
  */
-    __pyx_v_method = ADIOS_READ_METHOD_BP;
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_BP); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_v_method = __pyx_t_4;
+    __pyx_t_4 = 0;
   }
   __pyx_L3:;
 
-  /* "adios.pyx":438
- *         method = ADIOS_READ_METHOD_BP
+  /* "adios.pyx":537
+ *         method = READ_METHOD.BP
  * 
  *     return method             # <<<<<<<<<<<<<<
  * 
- * cpdef np2adiostype(type nptype):
+ * cpdef np2adiostype(np.dtype nptype):
  */
-  __pyx_r = __pyx_v_method;
+  __pyx_t_5 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_t_5;
   goto __pyx_L0;
 
-  /* "adios.pyx":421
+  /* "adios.pyx":520
  *     print '%15s : %d' % ('nsteps', v.nsteps)
  * 
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):             # <<<<<<<<<<<<<<
  *     if (name == "BP"):
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  */
 
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("adios.str2adiosreadmethod", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_method);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":440
+/* "adios.pyx":539
  *     return method
  * 
- * cpdef np2adiostype(type nptype):             # <<<<<<<<<<<<<<
- *     """ Ignored: int_, intc, intp """
- * 
+ * cpdef np2adiostype(np.dtype nptype):             # <<<<<<<<<<<<<<
+ *     """ Convert Numpy.dtype to Adios Datatype
+ *     """
  */
 
-static PyObject *__pyx_pw_5adios_33np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype); /*proto*/
-static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UNUSED int __pyx_skip_dispatch) {
+static PyObject *__pyx_pw_5adios_41np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype); /*proto*/
+static PyObject *__pyx_f_5adios_np2adiostype(PyArray_Descr *__pyx_v_nptype, CYTHON_UNUSED int __pyx_skip_dispatch) {
   PyObject *__pyx_v_atype = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -5464,49 +7506,49 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("np2adiostype", 0);
 
-  /* "adios.pyx":443
- *     """ Ignored: int_, intc, intp """
+  /* "adios.pyx":543
+ *     """
  * 
  *     cdef atype = DATATYPE.unknown             # <<<<<<<<<<<<<<
  * 
  *     if (nptype == np.bool_):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 443; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unknown); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 443; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unknown); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_atype = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "adios.pyx":445
+  /* "adios.pyx":545
  *     cdef atype = DATATYPE.unknown
  * 
  *     if (nptype == np.bool_):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int8):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_bool); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_bool); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":446
+    /* "adios.pyx":546
  * 
  *     if (nptype == np.bool_):
  *         atype = DATATYPE.integer             # <<<<<<<<<<<<<<
  *     elif (nptype == np.int8):
  *         atype = DATATYPE.byte
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_integer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_integer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5514,34 +7556,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":447
+  /* "adios.pyx":547
  *     if (nptype == np.bool_):
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int8):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.byte
  *     elif (nptype == np.int16):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":448
+    /* "adios.pyx":548
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int8):
  *         atype = DATATYPE.byte             # <<<<<<<<<<<<<<
  *     elif (nptype == np.int16):
  *         atype = DATATYPE.short
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_byte); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_byte); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -5549,34 +7591,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":449
+  /* "adios.pyx":549
  *     elif (nptype == np.int8):
  *         atype = DATATYPE.byte
  *     elif (nptype == np.int16):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.short
  *     elif (nptype == np.int32):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":450
+    /* "adios.pyx":550
  *         atype = DATATYPE.byte
  *     elif (nptype == np.int16):
  *         atype = DATATYPE.short             # <<<<<<<<<<<<<<
  *     elif (nptype == np.int32):
  *         atype = DATATYPE.integer
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_short); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_short); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5584,34 +7626,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":451
+  /* "adios.pyx":551
  *     elif (nptype == np.int16):
  *         atype = DATATYPE.short
  *     elif (nptype == np.int32):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int64):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":452
+    /* "adios.pyx":552
  *         atype = DATATYPE.short
  *     elif (nptype == np.int32):
  *         atype = DATATYPE.integer             # <<<<<<<<<<<<<<
  *     elif (nptype == np.int64):
  *         atype = DATATYPE.long
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_integer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_integer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -5619,34 +7661,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":453
+  /* "adios.pyx":553
  *     elif (nptype == np.int32):
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int64):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.long
  *     elif (nptype == np.uint8):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":454
+    /* "adios.pyx":554
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int64):
  *         atype = DATATYPE.long             # <<<<<<<<<<<<<<
  *     elif (nptype == np.uint8):
  *         atype = DATATYPE.unsigned_byte
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_long); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_long); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5654,34 +7696,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":455
+  /* "adios.pyx":555
  *     elif (nptype == np.int64):
  *         atype = DATATYPE.long
  *     elif (nptype == np.uint8):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.unsigned_byte
  *     elif (nptype == np.uint16):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":456
+    /* "adios.pyx":556
  *         atype = DATATYPE.long
  *     elif (nptype == np.uint8):
  *         atype = DATATYPE.unsigned_byte             # <<<<<<<<<<<<<<
  *     elif (nptype == np.uint16):
  *         atype = DATATYPE.unsigned_short
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unsigned_byte); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unsigned_byte); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -5689,34 +7731,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":457
+  /* "adios.pyx":557
  *     elif (nptype == np.uint8):
  *         atype = DATATYPE.unsigned_byte
  *     elif (nptype == np.uint16):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.unsigned_short
  *     elif (nptype == np.uint32):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":458
+    /* "adios.pyx":558
  *         atype = DATATYPE.unsigned_byte
  *     elif (nptype == np.uint16):
  *         atype = DATATYPE.unsigned_short             # <<<<<<<<<<<<<<
  *     elif (nptype == np.uint32):
  *         atype = DATATYPE.unsigned_integer
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_unsigned_short); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_unsigned_short); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5724,34 +7766,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":459
+  /* "adios.pyx":559
  *     elif (nptype == np.uint16):
  *         atype = DATATYPE.unsigned_short
  *     elif (nptype == np.uint32):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.unsigned_integer
  *     elif (nptype == np.uint64):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":460
+    /* "adios.pyx":560
  *         atype = DATATYPE.unsigned_short
  *     elif (nptype == np.uint32):
  *         atype = DATATYPE.unsigned_integer             # <<<<<<<<<<<<<<
  *     elif (nptype == np.uint64):
  *         atype = DATATYPE.unsigned_long
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unsigned_integer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unsigned_integer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -5759,34 +7801,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":461
+  /* "adios.pyx":561
  *     elif (nptype == np.uint32):
  *         atype = DATATYPE.unsigned_integer
  *     elif (nptype == np.uint64):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.unsigned_long
  *     elif (nptype == np.float_):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":462
+    /* "adios.pyx":562
  *         atype = DATATYPE.unsigned_integer
  *     elif (nptype == np.uint64):
  *         atype = DATATYPE.unsigned_long             # <<<<<<<<<<<<<<
  *     elif (nptype == np.float_):
  *         atype = DATATYPE.double
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_unsigned_long); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_unsigned_long); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5794,34 +7836,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":463
+  /* "adios.pyx":563
  *     elif (nptype == np.uint64):
  *         atype = DATATYPE.unsigned_long
  *     elif (nptype == np.float_):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.double
  *     elif (nptype == np.float16):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":464
+    /* "adios.pyx":564
  *         atype = DATATYPE.unsigned_long
  *     elif (nptype == np.float_):
  *         atype = DATATYPE.double             # <<<<<<<<<<<<<<
  *     elif (nptype == np.float16):
  *         atype = DATATYPE.real
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -5829,34 +7871,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":465
+  /* "adios.pyx":565
  *     elif (nptype == np.float_):
  *         atype = DATATYPE.double
  *     elif (nptype == np.float16):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.real
  *     elif (nptype == np.float32):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":466
+    /* "adios.pyx":566
  *         atype = DATATYPE.double
  *     elif (nptype == np.float16):
  *         atype = DATATYPE.real             # <<<<<<<<<<<<<<
  *     elif (nptype == np.float32):
  *         atype = DATATYPE.real
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_real); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_real); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5864,34 +7906,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":467
+  /* "adios.pyx":567
  *     elif (nptype == np.float16):
  *         atype = DATATYPE.real
  *     elif (nptype == np.float32):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.real
  *     elif (nptype == np.float64):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":468
+    /* "adios.pyx":568
  *         atype = DATATYPE.real
  *     elif (nptype == np.float32):
  *         atype = DATATYPE.real             # <<<<<<<<<<<<<<
  *     elif (nptype == np.float64):
  *         atype = DATATYPE.double
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_real); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_real); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -5899,34 +7941,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":469
+  /* "adios.pyx":569
  *     elif (nptype == np.float32):
  *         atype = DATATYPE.real
  *     elif (nptype == np.float64):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.double
  *     elif (nptype == np.complex_):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":470
+    /* "adios.pyx":570
  *         atype = DATATYPE.real
  *     elif (nptype == np.float64):
  *         atype = DATATYPE.double             # <<<<<<<<<<<<<<
  *     elif (nptype == np.complex_):
  *         atype = DATATYPE.double_complex
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5934,34 +7976,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":471
+  /* "adios.pyx":571
  *     elif (nptype == np.float64):
  *         atype = DATATYPE.double
  *     elif (nptype == np.complex_):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.double_complex
  *     elif (nptype == np.complex64):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":472
+    /* "adios.pyx":572
  *         atype = DATATYPE.double
  *     elif (nptype == np.complex_):
  *         atype = DATATYPE.double_complex             # <<<<<<<<<<<<<<
  *     elif (nptype == np.complex64):
  *         atype = DATATYPE.complex
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -5969,34 +8011,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":473
+  /* "adios.pyx":573
  *     elif (nptype == np.complex_):
  *         atype = DATATYPE.double_complex
  *     elif (nptype == np.complex64):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.complex
  *     elif (nptype == np.complex128):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":474
+    /* "adios.pyx":574
  *         atype = DATATYPE.double_complex
  *     elif (nptype == np.complex64):
  *         atype = DATATYPE.complex             # <<<<<<<<<<<<<<
  *     elif (nptype == np.complex128):
  *         atype = DATATYPE.double_complex
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -6004,34 +8046,34 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":475
+  /* "adios.pyx":575
  *     elif (nptype == np.complex64):
  *         atype = DATATYPE.complex
  *     elif (nptype == np.complex128):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.double_complex
- *     elif (nptype == np.str_):
+ *     elif (nptype.char == 'S'):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":476
+    /* "adios.pyx":576
  *         atype = DATATYPE.complex
  *     elif (nptype == np.complex128):
  *         atype = DATATYPE.double_complex             # <<<<<<<<<<<<<<
- *     elif (nptype == np.str_):
- *         atype = DATATYPE.byte
+ *     elif (nptype.char == 'S'):
+ *         atype = DATATYPE.string
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -6039,60 +8081,72 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
     goto __pyx_L3;
   }
 
-  /* "adios.pyx":477
+  /* "adios.pyx":577
  *     elif (nptype == np.complex128):
  *         atype = DATATYPE.double_complex
- *     elif (nptype == np.str_):             # <<<<<<<<<<<<<<
- *         atype = DATATYPE.byte
- * 
+ *     elif (nptype.char == 'S'):             # <<<<<<<<<<<<<<
+ *         atype = DATATYPE.string
+ *     else:
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_nptype), __pyx_n_s_char); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_str); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_t_2, __pyx_n_s_S, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios.pyx":478
+    /* "adios.pyx":578
  *         atype = DATATYPE.double_complex
- *     elif (nptype == np.str_):
- *         atype = DATATYPE.byte             # <<<<<<<<<<<<<<
- * 
- *     return atype
+ *     elif (nptype.char == 'S'):
+ *         atype = DATATYPE.string             # <<<<<<<<<<<<<<
+ *     else:
+ *         atype = DATATYPE.unknown
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_byte); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_string); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
     __pyx_t_1 = 0;
     goto __pyx_L3;
   }
+  /*else*/ {
+
+    /* "adios.pyx":580
+ *         atype = DATATYPE.string
+ *     else:
+ *         atype = DATATYPE.unknown             # <<<<<<<<<<<<<<
+ * 
+ *     return atype
+ */
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unknown); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
+    __pyx_t_2 = 0;
+  }
   __pyx_L3:;
 
-  /* "adios.pyx":480
- *         atype = DATATYPE.byte
+  /* "adios.pyx":582
+ *         atype = DATATYPE.unknown
  * 
  *     return atype             # <<<<<<<<<<<<<<
  * 
- * ## ====================
+ * cpdef str adiostype2string (ADIOS_DATATYPES type):
  */
   __Pyx_XDECREF(__pyx_r);
   __Pyx_INCREF(__pyx_v_atype);
   __pyx_r = __pyx_v_atype;
   goto __pyx_L0;
 
-  /* "adios.pyx":440
+  /* "adios.pyx":539
  *     return method
  * 
- * cpdef np2adiostype(type nptype):             # <<<<<<<<<<<<<<
- *     """ Ignored: int_, intc, intp """
- * 
+ * cpdef np2adiostype(np.dtype nptype):             # <<<<<<<<<<<<<<
+ *     """ Convert Numpy.dtype to Adios Datatype
+ *     """
  */
 
   /* function exit code */
@@ -6109,17 +8163,17 @@ static PyObject *__pyx_f_5adios_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UN
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_33np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype); /*proto*/
-static char __pyx_doc_5adios_32np2adiostype[] = " Ignored: int_, intc, intp ";
-static PyObject *__pyx_pw_5adios_33np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype) {
+static PyObject *__pyx_pw_5adios_41np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype); /*proto*/
+static char __pyx_doc_5adios_40np2adiostype[] = "np2adiostype(dtype nptype)\n Convert Numpy.dtype to Adios Datatype\n    ";
+static PyObject *__pyx_pw_5adios_41np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype) {
   CYTHON_UNUSED int __pyx_lineno = 0;
   CYTHON_UNUSED const char *__pyx_filename = NULL;
   CYTHON_UNUSED int __pyx_clineno = 0;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("np2adiostype (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_nptype), (&PyType_Type), 1, "nptype", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_5adios_32np2adiostype(__pyx_self, ((PyObject*)__pyx_v_nptype));
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_nptype), __pyx_ptype_5numpy_dtype, 1, "nptype", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_5adios_40np2adiostype(__pyx_self, ((PyArray_Descr *)__pyx_v_nptype));
 
   /* function exit code */
   goto __pyx_L0;
@@ -6130,7 +8184,7 @@ static PyObject *__pyx_pw_5adios_33np2adiostype(PyObject *__pyx_self, PyObject *
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_32np2adiostype(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_nptype) {
+static PyObject *__pyx_pf_5adios_40np2adiostype(CYTHON_UNUSED PyObject *__pyx_self, PyArray_Descr *__pyx_v_nptype) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -6139,7 +8193,7 @@ static PyObject *__pyx_pf_5adios_32np2adiostype(CYTHON_UNUSED PyObject *__pyx_se
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("np2adiostype", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_5adios_np2adiostype(__pyx_v_nptype, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_5adios_np2adiostype(__pyx_v_nptype, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -6156,69 +8210,184 @@ static PyObject *__pyx_pf_5adios_32np2adiostype(CYTHON_UNUSED PyObject *__pyx_se
   return __pyx_r;
 }
 
-/* "adios.pyx":487
+/* "adios.pyx":584
+ *     return atype
+ * 
+ * cpdef str adiostype2string (ADIOS_DATATYPES type):             # <<<<<<<<<<<<<<
+ *     return str(adios_type_to_string(<ADIOS_DATATYPES> type))
  * 
- * """ Call adios_read_init_method """
- * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
- *                     MPI_Comm comm = MPI_COMM_WORLD,
- *                     char * parameters = ""):
  */
 
-static PyObject *__pyx_pw_5adios_35read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_5adios_read_init(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_read_init *__pyx_optional_args) {
-  char *__pyx_v_method_name = ((char *)__pyx_k_BP);
-  MPI_Comm __pyx_v_comm = __pyx_k__5;
-  char *__pyx_v_parameters = ((char *)__pyx_k__4);
-  PyObject *__pyx_v_method = 0;
-  int __pyx_r;
+static PyObject *__pyx_pw_5adios_43adiostype2string(PyObject *__pyx_self, PyObject *__pyx_arg_type); /*proto*/
+static PyObject *__pyx_f_5adios_adiostype2string(ADIOS_DATATYPES __pyx_v_type, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
-  ADIOS_READ_METHOD __pyx_t_3;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_init", 0);
-  if (__pyx_optional_args) {
-    if (__pyx_optional_args->__pyx_n > 0) {
-      __pyx_v_method_name = __pyx_optional_args->method_name;
-      if (__pyx_optional_args->__pyx_n > 1) {
-        __pyx_v_comm = __pyx_optional_args->comm;
-        if (__pyx_optional_args->__pyx_n > 2) {
-          __pyx_v_parameters = __pyx_optional_args->parameters;
-        }
-      }
-    }
-  }
+  __Pyx_RefNannySetupContext("adiostype2string", 0);
 
-  /* "adios.pyx":490
- *                     MPI_Comm comm = MPI_COMM_WORLD,
- *                     char * parameters = ""):
- *     cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
- *     return adios_read_init_method (method, comm, parameters)
+  /* "adios.pyx":585
+ * 
+ * cpdef str adiostype2string (ADIOS_DATATYPES type):
+ *     return str(adios_type_to_string(<ADIOS_DATATYPES> type))             # <<<<<<<<<<<<<<
  * 
+ * ## ====================
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBytes_FromString(adios_type_to_string(((ADIOS_DATATYPES)__pyx_v_type))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_5adios_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_method = __pyx_t_2;
-  __pyx_t_2 = 0;
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios.pyx":491
- *                     char * parameters = ""):
- *     cdef method = str2adiosreadmethod(method_name)
- *     return adios_read_init_method (method, comm, parameters)             # <<<<<<<<<<<<<<
+  /* "adios.pyx":584
+ *     return atype
  * 
+ * cpdef str adiostype2string (ADIOS_DATATYPES type):             # <<<<<<<<<<<<<<
+ *     return str(adios_type_to_string(<ADIOS_DATATYPES> type))
  * 
  */
-  __pyx_t_3 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = adios_read_init_method(__pyx_t_3, __pyx_v_comm, __pyx_v_parameters);
-  goto __pyx_L0;
 
-  /* "adios.pyx":487
- * 
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("adios.adiostype2string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_43adiostype2string(PyObject *__pyx_self, PyObject *__pyx_arg_type); /*proto*/
+static char __pyx_doc_5adios_42adiostype2string[] = "adiostype2string(ADIOS_DATATYPES type) -> str";
+static PyObject *__pyx_pw_5adios_43adiostype2string(PyObject *__pyx_self, PyObject *__pyx_arg_type) {
+  ADIOS_DATATYPES __pyx_v_type;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("adiostype2string (wrapper)", 0);
+  assert(__pyx_arg_type); {
+    __pyx_v_type = ((ADIOS_DATATYPES)PyInt_AsLong(__pyx_arg_type)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.adiostype2string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_42adiostype2string(__pyx_self, ((ADIOS_DATATYPES)__pyx_v_type));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_42adiostype2string(CYTHON_UNUSED PyObject *__pyx_self, ADIOS_DATATYPES __pyx_v_type) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("adiostype2string", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_5adios_adiostype2string(__pyx_v_type, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.adiostype2string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":592
+ * 
+ * """ Call adios_read_init_method """
+ * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
+ *                     MPI_Comm comm = MPI_COMM_WORLD,
+ *                     char * parameters = ""):
+ */
+
+static PyObject *__pyx_pw_5adios_45read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_5adios_read_init(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_read_init *__pyx_optional_args) {
+  char *__pyx_v_method_name = ((char *)__pyx_k_BP);
+  MPI_Comm __pyx_v_comm = __pyx_k__8;
+  char *__pyx_v_parameters = ((char *)__pyx_k__7);
+  PyObject *__pyx_v_method = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  ADIOS_READ_METHOD __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_init", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_method_name = __pyx_optional_args->method_name;
+      if (__pyx_optional_args->__pyx_n > 1) {
+        __pyx_v_comm = __pyx_optional_args->comm;
+        if (__pyx_optional_args->__pyx_n > 2) {
+          __pyx_v_parameters = __pyx_optional_args->parameters;
+        }
+      }
+    }
+  }
+
+  /* "adios.pyx":595
+ *                     MPI_Comm comm = MPI_COMM_WORLD,
+ *                     char * parameters = ""):
+ *     cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
+ *     return adios_read_init_method (method, comm, parameters)
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_5adios_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_method = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "adios.pyx":596
+ *                     char * parameters = ""):
+ *     cdef method = str2adiosreadmethod(method_name)
+ *     return adios_read_init_method (method, comm, parameters)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_3 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = adios_read_init_method(__pyx_t_3, __pyx_v_comm, __pyx_v_parameters);
+  goto __pyx_L0;
+
+  /* "adios.pyx":592
+ * 
  * """ Call adios_read_init_method """
  * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
  *                     MPI_Comm comm = MPI_COMM_WORLD,
@@ -6238,8 +8407,9 @@ static int __pyx_f_5adios_read_init(CYTHON_UNUSED int __pyx_skip_dispatch, struc
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_35read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_35read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_45read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_44read_init[] = "read_init(char *method_name='BP', MPI_Comm comm=MPI_COMM_WORLD, char *parameters='') -> int";
+static PyObject *__pyx_pw_5adios_45read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_method_name;
   MPI_Comm __pyx_v_comm;
   char *__pyx_v_parameters;
@@ -6281,7 +8451,7 @@ static PyObject *__pyx_pw_5adios_35read_init(PyObject *__pyx_self, PyObject *__p
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_init") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_init") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -6293,37 +8463,37 @@ static PyObject *__pyx_pw_5adios_35read_init(PyObject *__pyx_self, PyObject *__p
       }
     }
     if (values[0]) {
-      __pyx_v_method_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_method_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_method_name = ((char *)__pyx_k_BP);
     }
     if (values[1]) {
-      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[1]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[1]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_comm = __pyx_k__5;
+      __pyx_v_comm = __pyx_k__8;
     }
     if (values[2]) {
-      __pyx_v_parameters = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_parameters) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_parameters = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_parameters) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_parameters = ((char *)__pyx_k__4);
+      __pyx_v_parameters = ((char *)__pyx_k__7);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_init", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read_init", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.read_init", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_34read_init(__pyx_self, __pyx_v_method_name, __pyx_v_comm, __pyx_v_parameters);
+  __pyx_r = __pyx_pf_5adios_44read_init(__pyx_self, __pyx_v_method_name, __pyx_v_comm, __pyx_v_parameters);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_34read_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name, MPI_Comm __pyx_v_comm, char *__pyx_v_parameters) {
+static PyObject *__pyx_pf_5adios_44read_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name, MPI_Comm __pyx_v_comm, char *__pyx_v_parameters) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -6339,7 +8509,7 @@ static PyObject *__pyx_pf_5adios_34read_init(CYTHON_UNUSED PyObject *__pyx_self,
   __pyx_t_2.comm = __pyx_v_comm;
   __pyx_t_2.parameters = __pyx_v_parameters;
   __pyx_t_1 = __pyx_f_5adios_read_init(0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -6356,7 +8526,7 @@ static PyObject *__pyx_pf_5adios_34read_init(CYTHON_UNUSED PyObject *__pyx_self,
   return __pyx_r;
 }
 
-/* "adios.pyx":495
+/* "adios.pyx":600
  * 
  * """ Call adios_read_finalize_method """
  * cpdef int read_finalize(char * method_name = "BP"):             # <<<<<<<<<<<<<<
@@ -6364,7 +8534,7 @@ static PyObject *__pyx_pf_5adios_34read_init(CYTHON_UNUSED PyObject *__pyx_self,
  *     return adios_read_finalize_method (method)
  */
 
-static PyObject *__pyx_pw_5adios_37read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_47read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_5adios_read_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_read_finalize *__pyx_optional_args) {
   char *__pyx_v_method_name = ((char *)__pyx_k_BP);
   PyObject *__pyx_v_method = 0;
@@ -6383,33 +8553,33 @@ static int __pyx_f_5adios_read_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, s
     }
   }
 
-  /* "adios.pyx":496
+  /* "adios.pyx":601
  * """ Call adios_read_finalize_method """
  * cpdef int read_finalize(char * method_name = "BP"):
  *     cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
  *     return adios_read_finalize_method (method)
  * 
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_5adios_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_5adios_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_method = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "adios.pyx":497
+  /* "adios.pyx":602
  * cpdef int read_finalize(char * method_name = "BP"):
  *     cdef method = str2adiosreadmethod(method_name)
  *     return adios_read_finalize_method (method)             # <<<<<<<<<<<<<<
  * 
- * """ Python class for ADIOS_FILE structure """
+ * ## Python class for ADIOS_FILE structure
  */
-  __pyx_t_3 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = adios_read_finalize_method(__pyx_t_3);
   goto __pyx_L0;
 
-  /* "adios.pyx":495
+  /* "adios.pyx":600
  * 
  * """ Call adios_read_finalize_method """
  * cpdef int read_finalize(char * method_name = "BP"):             # <<<<<<<<<<<<<<
@@ -6430,8 +8600,9 @@ static int __pyx_f_5adios_read_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, s
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_37read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_37read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_47read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_46read_finalize[] = "read_finalize(char *method_name='BP') -> int";
+static PyObject *__pyx_pw_5adios_47read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_method_name;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
@@ -6459,7 +8630,7 @@ static PyObject *__pyx_pw_5adios_37read_finalize(PyObject *__pyx_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_finalize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_finalize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -6469,27 +8640,27 @@ static PyObject *__pyx_pw_5adios_37read_finalize(PyObject *__pyx_self, PyObject
       }
     }
     if (values[0]) {
-      __pyx_v_method_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_method_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_method_name = ((char *)__pyx_k_BP);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_finalize", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read_finalize", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.read_finalize", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_36read_finalize(__pyx_self, __pyx_v_method_name);
+  __pyx_r = __pyx_pf_5adios_46read_finalize(__pyx_self, __pyx_v_method_name);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_36read_finalize(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name) {
+static PyObject *__pyx_pf_5adios_46read_finalize(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -6503,7 +8674,7 @@ static PyObject *__pyx_pf_5adios_36read_finalize(CYTHON_UNUSED PyObject *__pyx_s
   __pyx_t_2.__pyx_n = 1;
   __pyx_t_2.method_name = __pyx_v_method_name;
   __pyx_t_1 = __pyx_f_5adios_read_finalize(0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -6520,527 +8691,367 @@ static PyObject *__pyx_pf_5adios_36read_finalize(CYTHON_UNUSED PyObject *__pyx_s
   return __pyx_r;
 }
 
-/* "adios.pyx":520
+/* "adios.pyx":641
+ *     property name:
+ *         """ The filename (or stream name) associated with. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
- *     """ Initialization. Call adios_read_open and populate public members """
- *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
- *                  char * method_name = "BP",
- *                  MPI_Comm comm = MPI_COMM_WORLD,
  */
 
 /* Python wrapper */
-static int __pyx_pw_5adios_4file_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_5adios_4file_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  char *__pyx_v_fname;
-  char *__pyx_v_method_name;
-  MPI_Comm __pyx_v_comm;
-  PyObject *__pyx_v_is_stream = 0;
-  ADIOS_LOCKMODE __pyx_v_lock_mode;
-  float __pyx_v_timeout_sec;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  int __pyx_r;
+static PyObject *__pyx_pw_5adios_4file_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4file_4name_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_method_name,&__pyx_n_s_comm,&__pyx_n_s_is_stream,&__pyx_n_s_lock_mode,&__pyx_n_s_timeout_sec,0};
-    PyObject* values[6] = {0,0,0,0,0,0};
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_4name___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
 
-    /* "adios.pyx":523
- *                  char * method_name = "BP",
- *                  MPI_Comm comm = MPI_COMM_WORLD,
- *                  is_stream = False,             # <<<<<<<<<<<<<<
- *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
- *                  float timeout_sec = 0.0):
- */
-    values[3] = ((PyObject *)Py_False);
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
-        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
-        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
-        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method_name);
-          if (value) { values[1] = value; kw_args--; }
-        }
-        case  2:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
-          if (value) { values[2] = value; kw_args--; }
-        }
-        case  3:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_is_stream);
-          if (value) { values[3] = value; kw_args--; }
-        }
-        case  4:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lock_mode);
-          if (value) { values[4] = value; kw_args--; }
-        }
-        case  5:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_timeout_sec);
-          if (value) { values[5] = value; kw_args--; }
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else {
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
-        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
-        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
-        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-    }
-    __pyx_v_fname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_fname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    if (values[1]) {
-      __pyx_v_method_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else {
-      __pyx_v_method_name = ((char *)__pyx_k_BP);
-    }
-    if (values[2]) {
-      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[2]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else {
-      __pyx_v_comm = __pyx_k__6;
-    }
-    __pyx_v_is_stream = values[3];
-    if (values[4]) {
-      __pyx_v_lock_mode = ((ADIOS_LOCKMODE)PyInt_AsLong(values[4])); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else {
-      __pyx_v_lock_mode = __pyx_k__7;
-    }
-    if (values[5]) {
-      __pyx_v_timeout_sec = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_timeout_sec == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else {
-      __pyx_v_timeout_sec = ((float)0.0);
-    }
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("adios.file.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
-  return -1;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_4file___init__(((struct __pyx_obj_5adios_file *)__pyx_v_self), __pyx_v_fname, __pyx_v_method_name, __pyx_v_comm, __pyx_v_is_stream, __pyx_v_lock_mode, __pyx_v_timeout_sec);
+  return __pyx_r;
+}
 
-  /* "adios.pyx":520
+static PyObject *__pyx_pf_5adios_4file_4name___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":642
+ *         """ The filename (or stream name) associated with. """
+ *         def __get__(self):
+ *             return self.name             # <<<<<<<<<<<<<<
+ * 
+ *     property nvars:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->name);
+  __pyx_r = __pyx_v_self->name;
+  goto __pyx_L0;
+
+  /* "adios.pyx":641
+ *     property name:
+ *         """ The filename (or stream name) associated with. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
- *     """ Initialization. Call adios_read_open and populate public members """
- *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
- *                  char * method_name = "BP",
- *                  MPI_Comm comm = MPI_COMM_WORLD,
  */
 
   /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_5adios_4file___init__(struct __pyx_obj_5adios_file *__pyx_v_self, char *__pyx_v_fname, char *__pyx_v_method_name, MPI_Comm __pyx_v_comm, PyObject *__pyx_v_is_stream, ADIOS_LOCKMODE __pyx_v_lock_mode, float __pyx_v_timeout_sec) {
-  PyObject *__pyx_v_method = 0;
-  PyObject *__pyx_v_varname = NULL;
-  int __pyx_v_i;
-  int __pyx_r;
+/* "adios.pyx":646
+ *     property nvars:
+ *         """ The number of variables. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nvars
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_4file_5nvars_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4file_5nvars_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  ADIOS_READ_METHOD __pyx_t_4;
-  int __pyx_t_5;
-  uint64_t __pyx_t_6;
-  int __pyx_t_7;
-  Py_ssize_t __pyx_t_8;
-  PyObject *__pyx_t_9 = NULL;
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_5nvars___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_4file_5nvars___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__init__", 0);
-
-  /* "adios.pyx":526
- *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
- *                  float timeout_sec = 0.0):
- *         self.fp = NULL             # <<<<<<<<<<<<<<
- *         self.var = {}
- *         self.attr = {}
- */
-  __pyx_v_self->fp = NULL;
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "adios.pyx":527
- *                  float timeout_sec = 0.0):
- *         self.fp = NULL
- *         self.var = {}             # <<<<<<<<<<<<<<
- *         self.attr = {}
- *         self.is_stream = is_stream
+  /* "adios.pyx":647
+ *         """ The number of variables. """
+ *         def __get__(self):
+ *             return self.nvars             # <<<<<<<<<<<<<<
+ * 
+ *     property nattrs:
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nvars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 647; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->var);
-  __Pyx_DECREF(__pyx_v_self->var);
-  __pyx_v_self->var = ((PyObject*)__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios.pyx":528
- *         self.fp = NULL
- *         self.var = {}
- *         self.attr = {}             # <<<<<<<<<<<<<<
- *         self.is_stream = is_stream
- *         cdef method = str2adiosreadmethod(method_name)
+  /* "adios.pyx":646
+ *     property nvars:
+ *         """ The number of variables. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nvars
+ * 
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->attr);
-  __Pyx_DECREF(__pyx_v_self->attr);
-  __pyx_v_self->attr = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
 
-  /* "adios.pyx":529
- *         self.var = {}
- *         self.attr = {}
- *         self.is_stream = is_stream             # <<<<<<<<<<<<<<
- *         cdef method = str2adiosreadmethod(method_name)
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.file.nvars.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":651
+ *     property nattrs:
+ *         """ The number of attributes. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nattrs
  * 
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_is_stream); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->is_stream = __pyx_t_2;
 
-  /* "adios.pyx":530
- *         self.attr = {}
- *         self.is_stream = is_stream
- *         cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_4file_6nattrs_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4file_6nattrs_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_6nattrs___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_4file_6nattrs___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":652
+ *         """ The number of attributes. """
+ *         def __get__(self):
+ *             return self.nattrs             # <<<<<<<<<<<<<<
  * 
- *         if (is_stream):
+ *     property current_step:
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nattrs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyInt_FromLong(__pyx_f_5adios_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_method = __pyx_t_3;
-  __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios.pyx":532
- *         cdef method = str2adiosreadmethod(method_name)
+  /* "adios.pyx":651
+ *     property nattrs:
+ *         """ The number of attributes. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nattrs
  * 
- *         if (is_stream):             # <<<<<<<<<<<<<<
- *             self.fp = adios_read_open(fname, method, comm,
- *                                       lock_mode, timeout_sec)
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_is_stream); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__pyx_t_2) {
 
-    /* "adios.pyx":533
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.file.nattrs.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":656
+ *     property current_step:
+ *         """ The current timestep index. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.current_step
  * 
- *         if (is_stream):
- *             self.fp = adios_read_open(fname, method, comm,             # <<<<<<<<<<<<<<
- *                                       lock_mode, timeout_sec)
- *         else:
  */
-    __pyx_t_4 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "adios.pyx":534
- *         if (is_stream):
- *             self.fp = adios_read_open(fname, method, comm,
- *                                       lock_mode, timeout_sec)             # <<<<<<<<<<<<<<
- *         else:
- *             self.fp = adios_read_open_file(fname, method, comm)
- */
-    __pyx_v_self->fp = adios_read_open(__pyx_v_fname, __pyx_t_4, __pyx_v_comm, __pyx_v_lock_mode, __pyx_v_timeout_sec);
-    goto __pyx_L3;
-  }
-  /*else*/ {
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_4file_12current_step_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4file_12current_step_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_12current_step___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
 
-    /* "adios.pyx":536
- *                                       lock_mode, timeout_sec)
- *         else:
- *             self.fp = adios_read_open_file(fname, method, comm)             # <<<<<<<<<<<<<<
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_4file_12current_step___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":657
+ *         """ The current timestep index. """
+ *         def __get__(self):
+ *             return self.current_step             # <<<<<<<<<<<<<<
  * 
- *         assert self.fp != NULL, 'Not an open file'
+ *     property last_step:
  */
-    __pyx_t_4 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_self->fp = adios_read_open_file(__pyx_v_fname, __pyx_t_4, __pyx_v_comm);
-  }
-  __pyx_L3:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->current_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 657; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios.pyx":538
- *             self.fp = adios_read_open_file(fname, method, comm)
+  /* "adios.pyx":656
+ *     property current_step:
+ *         """ The current timestep index. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.current_step
  * 
- *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.file.current_step.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":661
+ *     property last_step:
+ *         """ The last timestep index. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.last_step
  * 
- *         self.name = fname.split('/')[-1]  ## basename
  */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-  }
-  #endif
 
-  /* "adios.pyx":540
- *         assert self.fp != NULL, 'Not an open file'
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_4file_9last_step_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4file_9last_step_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_9last_step___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_4file_9last_step___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":662
+ *         """ The last timestep index. """
+ *         def __get__(self):
+ *             return self.last_step             # <<<<<<<<<<<<<<
  * 
- *         self.name = fname.split('/')[-1]  ## basename             # <<<<<<<<<<<<<<
- *         self.nvars = self.fp.nvars
- *         self.nattrs = self.fp.nattrs
+ *     property endianness:
  */
-  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_fname); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, -1, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->name);
-  __Pyx_DECREF(__pyx_v_self->name);
-  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios.pyx":541
+  /* "adios.pyx":661
+ *     property last_step:
+ *         """ The last timestep index. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.last_step
  * 
- *         self.name = fname.split('/')[-1]  ## basename
- *         self.nvars = self.fp.nvars             # <<<<<<<<<<<<<<
- *         self.nattrs = self.fp.nattrs
- *         self.current_step = self.fp.current_step
- */
-  __pyx_t_5 = __pyx_v_self->fp->nvars;
-  __pyx_v_self->nvars = __pyx_t_5;
-
-  /* "adios.pyx":542
- *         self.name = fname.split('/')[-1]  ## basename
- *         self.nvars = self.fp.nvars
- *         self.nattrs = self.fp.nattrs             # <<<<<<<<<<<<<<
- *         self.current_step = self.fp.current_step
- *         self.last_step = self.fp.last_step
- */
-  __pyx_t_5 = __pyx_v_self->fp->nattrs;
-  __pyx_v_self->nattrs = __pyx_t_5;
-
-  /* "adios.pyx":543
- *         self.nvars = self.fp.nvars
- *         self.nattrs = self.fp.nattrs
- *         self.current_step = self.fp.current_step             # <<<<<<<<<<<<<<
- *         self.last_step = self.fp.last_step
- *         self.endianness = self.fp.endianness
- */
-  __pyx_t_5 = __pyx_v_self->fp->current_step;
-  __pyx_v_self->current_step = __pyx_t_5;
-
-  /* "adios.pyx":544
- *         self.nattrs = self.fp.nattrs
- *         self.current_step = self.fp.current_step
- *         self.last_step = self.fp.last_step             # <<<<<<<<<<<<<<
- *         self.endianness = self.fp.endianness
- *         self.version = self.fp.version
- */
-  __pyx_t_5 = __pyx_v_self->fp->last_step;
-  __pyx_v_self->last_step = __pyx_t_5;
-
-  /* "adios.pyx":545
- *         self.current_step = self.fp.current_step
- *         self.last_step = self.fp.last_step
- *         self.endianness = self.fp.endianness             # <<<<<<<<<<<<<<
- *         self.version = self.fp.version
- *         self.file_size = self.fp.file_size
- */
-  __pyx_t_5 = __pyx_v_self->fp->endianness;
-  __pyx_v_self->endianness = __pyx_t_5;
-
-  /* "adios.pyx":546
- *         self.last_step = self.fp.last_step
- *         self.endianness = self.fp.endianness
- *         self.version = self.fp.version             # <<<<<<<<<<<<<<
- *         self.file_size = self.fp.file_size
- * 
- */
-  __pyx_t_5 = __pyx_v_self->fp->version;
-  __pyx_v_self->version = __pyx_t_5;
-
-  /* "adios.pyx":547
- *         self.endianness = self.fp.endianness
- *         self.version = self.fp.version
- *         self.file_size = self.fp.file_size             # <<<<<<<<<<<<<<
- * 
- *         for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:
- */
-  __pyx_t_6 = __pyx_v_self->fp->file_size;
-  __pyx_v_self->file_size = __pyx_t_6;
-
-  /* "adios.pyx":549
- *         self.file_size = self.fp.file_size
- * 
- *         for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:             # <<<<<<<<<<<<<<
- *             self.var[varname] = var(self, varname)
- * 
- */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = __pyx_v_self->nvars;
-  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_5; __pyx_t_7+=1) {
-    __pyx_v_i = __pyx_t_7;
-    __pyx_t_3 = __Pyx_PyBytes_FromString((__pyx_v_self->fp->var_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  }
-  __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_8 = 0;
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  for (;;) {
-    if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_3)) break;
-    #if CYTHON_COMPILING_IN_CPYTHON
-    __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #else
-    __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #endif
-    __Pyx_XDECREF_SET(__pyx_v_varname, __pyx_t_1);
-    __pyx_t_1 = 0;
-
-    /* "adios.pyx":550
- * 
- *         for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:
- *             self.var[varname] = var(self, varname)             # <<<<<<<<<<<<<<
- * 
- *     def __del__(self):
- */
-    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_INCREF(((PyObject *)__pyx_v_self));
-    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
-    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
-    __Pyx_INCREF(__pyx_v_varname);
-    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_varname);
-    __Pyx_GIVEREF(__pyx_v_varname);
-    __pyx_t_9 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_var)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_9);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (unlikely(__pyx_v_self->var == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-    if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_v_varname, __pyx_t_9) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-
-    /* "adios.pyx":549
- *         self.file_size = self.fp.file_size
- * 
- *         for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:             # <<<<<<<<<<<<<<
- *             self.var[varname] = var(self, varname)
- * 
- */
-  }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-
-  /* "adios.pyx":520
- * 
- *     """ Initialization. Call adios_read_open and populate public members """
- *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
- *                  char * method_name = "BP",
- *                  MPI_Comm comm = MPI_COMM_WORLD,
  */
 
   /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_9);
-  __Pyx_AddTraceback("adios.file.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_AddTraceback("adios.file.last_step.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_method);
-  __Pyx_XDECREF(__pyx_v_varname);
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":552
- *             self.var[varname] = var(self, varname)
- * 
- *     def __del__(self):             # <<<<<<<<<<<<<<
- *             self.close()
+/* "adios.pyx":666
+ *     property endianness:
+ *         """ The endianness of the stored data. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.endianness
  * 
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_5adios_4file_10endianness_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4file_10endianness_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_2__del__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_10endianness___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4file_2__del__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_4file_10endianness___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "adios.pyx":553
- * 
- *     def __del__(self):
- *             self.close()             # <<<<<<<<<<<<<<
+  /* "adios.pyx":667
+ *         """ The endianness of the stored data. """
+ *         def __get__(self):
+ *             return self.endianness             # <<<<<<<<<<<<<<
  * 
- *     """ Call adios_read_close """
+ *     property version:
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_5adios_file *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->endianness); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios.pyx":552
- *             self.var[varname] = var(self, varname)
- * 
- *     def __del__(self):             # <<<<<<<<<<<<<<
- *             self.close()
+  /* "adios.pyx":666
+ *     property endianness:
+ *         """ The endianness of the stored data. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.endianness
  * 
  */
 
   /* function exit code */
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.__del__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.file.endianness.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -7048,151 +9059,125 @@ static PyObject *__pyx_pf_5adios_4file_2__del__(struct __pyx_obj_5adios_file *__
   return __pyx_r;
 }
 
-/* "adios.pyx":556
+/* "adios.pyx":671
+ *     property version:
+ *         """ The version of Adios. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.version
  * 
- *     """ Call adios_read_close """
- *     cpdef close(self):             # <<<<<<<<<<<<<<
- *         assert self.fp != NULL, 'Not an open file'
- *         adios_read_close(self.fp)
  */
 
-static PyObject *__pyx_pw_5adios_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_f_5adios_4file_close(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_skip_dispatch) {
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_4file_7version_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4file_7version_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_7version___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_4file_7version___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("close", 0);
-  /* Check if called by wrapper */
-  if (unlikely(__pyx_skip_dispatch)) ;
-  /* Check if overridden in Python */
-  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_4file_5close)) {
-      __Pyx_XDECREF(__pyx_r);
-      __Pyx_INCREF(__pyx_t_1);
-      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
-      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
-        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
-        if (likely(__pyx_t_4)) {
-          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(function);
-          __Pyx_DECREF_SET(__pyx_t_3, function);
-        }
-      }
-      if (__pyx_t_4) {
-        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      } else {
-        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_2;
-      __pyx_t_2 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L0;
-    }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  }
-
-  /* "adios.pyx":557
- *     """ Call adios_read_close """
- *     cpdef close(self):
- *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
- *         adios_read_close(self.fp)
- *         self.fp = NULL
- */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-  }
-  #endif
-
-  /* "adios.pyx":558
- *     cpdef close(self):
- *         assert self.fp != NULL, 'Not an open file'
- *         adios_read_close(self.fp)             # <<<<<<<<<<<<<<
- *         self.fp = NULL
- * 
- */
-  adios_read_close(__pyx_v_self->fp);
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "adios.pyx":559
- *         assert self.fp != NULL, 'Not an open file'
- *         adios_read_close(self.fp)
- *         self.fp = NULL             # <<<<<<<<<<<<<<
+  /* "adios.pyx":672
+ *         """ The version of Adios. """
+ *         def __get__(self):
+ *             return self.version             # <<<<<<<<<<<<<<
  * 
- *     """ Print self """
+ *     property file_sizec:
  */
-  __pyx_v_self->fp = NULL;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios.pyx":556
+  /* "adios.pyx":671
+ *     property version:
+ *         """ The version of Adios. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.version
  * 
- *     """ Call adios_read_close """
- *     cpdef close(self):             # <<<<<<<<<<<<<<
- *         assert self.fp != NULL, 'Not an open file'
- *         adios_read_close(self.fp)
  */
 
   /* function exit code */
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("adios.file.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
+  __Pyx_AddTraceback("adios.file.version.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "adios.pyx":676
+ *     property file_sizec:
+ *         """ The size of Adios file. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.file_size
+ * 
+ */
+
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_5adios_4file_10file_sizec_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4file_10file_sizec_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("close (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_4close(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_10file_sizec___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4file_4close(struct __pyx_obj_5adios_file *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_4file_10file_sizec___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("close", 0);
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":677
+ *         """ The size of Adios file. """
+ *         def __get__(self):
+ *             return self.file_size             # <<<<<<<<<<<<<<
+ * 
+ *     property is_stream:
+ */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_5adios_4file_close(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->file_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 677; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
+  /* "adios.pyx":676
+ *     property file_sizec:
+ *         """ The size of Adios file. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.file_size
+ * 
+ */
+
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.file.file_sizec.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -7200,322 +9185,112 @@ static PyObject *__pyx_pf_5adios_4file_4close(struct __pyx_obj_5adios_file *__py
   return __pyx_r;
 }
 
-/* "adios.pyx":562
- * 
- *     """ Print self """
- *     cpdef printself(self):             # <<<<<<<<<<<<<<
- *         assert self.fp != NULL, 'Not an open file'
- *         print '=== AdiosFile ==='
- */
-
-static PyObject *__pyx_pw_5adios_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_f_5adios_4file_printself(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_skip_dispatch) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("printself", 0);
-  /* Check if called by wrapper */
-  if (unlikely(__pyx_skip_dispatch)) ;
-  /* Check if overridden in Python */
-  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_printself); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_4file_7printself)) {
-      __Pyx_XDECREF(__pyx_r);
-      __Pyx_INCREF(__pyx_t_1);
-      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
-      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
-        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
-        if (likely(__pyx_t_4)) {
-          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(function);
-          __Pyx_DECREF_SET(__pyx_t_3, function);
-        }
-      }
-      if (__pyx_t_4) {
-        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      } else {
-        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_2;
-      __pyx_t_2 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L0;
-    }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  }
-
-  /* "adios.pyx":563
- *     """ Print self """
- *     cpdef printself(self):
- *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
- *         print '=== AdiosFile ==='
- *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
- */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-  }
-  #endif
-
-  /* "adios.pyx":564
- *     cpdef printself(self):
- *         assert self.fp != NULL, 'Not an open file'
- *         print '=== AdiosFile ==='             # <<<<<<<<<<<<<<
- *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
- *         printfile(self.fp)
- */
-  if (__Pyx_PrintOne(0, __pyx_kp_s_AdiosFile) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  /* "adios.pyx":565
- *         assert self.fp != NULL, 'Not an open file'
- *         print '=== AdiosFile ==='
- *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)             # <<<<<<<<<<<<<<
- *         printfile(self.fp)
- * 
- */
-  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->fp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(__pyx_n_s_fp);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_fp);
-  __Pyx_GIVEREF(__pyx_n_s_fp);
-  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
-  /* "adios.pyx":566
- *         print '=== AdiosFile ==='
- *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
- *         printfile(self.fp)             # <<<<<<<<<<<<<<
- * 
- *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):
- */
-  __pyx_t_1 = __pyx_f_5adios_printfile(__pyx_v_self->fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
-  /* "adios.pyx":562
+/* "adios.pyx":681
+ *     property is_stream:
+ *         """ Indicating reader type; file reader or stream reader """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_stream
  * 
- *     """ Print self """
- *     cpdef printself(self):             # <<<<<<<<<<<<<<
- *         assert self.fp != NULL, 'Not an open file'
- *         print '=== AdiosFile ==='
  */
 
-  /* function exit code */
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("adios.file.printself", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_5adios_4file_9is_stream_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4file_9is_stream_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("printself (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_6printself(((struct __pyx_obj_5adios_file *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_5adios_4file_6printself(struct __pyx_obj_5adios_file *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("printself", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_5adios_4file_printself(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_9is_stream___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
 
   /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.printself", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":568
- *         printfile(self.fp)
- * 
- *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
- *         return adios_advance_step(self.fp, last, timeout_sec)
- * 
- */
-
-static PyObject *__pyx_pw_5adios_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_f_5adios_4file_advance(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_4file_advance *__pyx_optional_args) {
-  int __pyx_v_last = ((int)0);
-  float __pyx_v_timeout_sec = ((float)0.0);
+static PyObject *__pyx_pf_5adios_4file_9is_stream___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *__pyx_t_8 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("advance", 0);
-  if (__pyx_optional_args) {
-    if (__pyx_optional_args->__pyx_n > 0) {
-      __pyx_v_last = __pyx_optional_args->last;
-      if (__pyx_optional_args->__pyx_n > 1) {
-        __pyx_v_timeout_sec = __pyx_optional_args->timeout_sec;
-      }
-    }
-  }
-  /* Check if called by wrapper */
-  if (unlikely(__pyx_skip_dispatch)) ;
-  /* Check if overridden in Python */
-  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_4file_9advance)) {
-      __Pyx_XDECREF(__pyx_r);
-      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_last); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_timeout_sec); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_INCREF(__pyx_t_1);
-      __pyx_t_5 = __pyx_t_1; __pyx_t_6 = NULL;
-      __pyx_t_7 = 0;
-      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
-        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
-        if (likely(__pyx_t_6)) {
-          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
-          __Pyx_INCREF(__pyx_t_6);
-          __Pyx_INCREF(function);
-          __Pyx_DECREF_SET(__pyx_t_5, function);
-          __pyx_t_7 = 1;
-        }
-      }
-      __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      if (__pyx_t_6) {
-        PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
-      }
-      PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_4);
-      __Pyx_GIVEREF(__pyx_t_4);
-      __pyx_t_3 = 0;
-      __pyx_t_4 = 0;
-      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_r = __pyx_t_2;
-      __pyx_t_2 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L0;
-    }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  }
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "adios.pyx":569
- * 
- *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):
- *         return adios_advance_step(self.fp, last, timeout_sec)             # <<<<<<<<<<<<<<
+  /* "adios.pyx":682
+ *         """ Indicating reader type; file reader or stream reader """
+ *         def __get__(self):
+ *             return self.is_stream             # <<<<<<<<<<<<<<
  * 
- * """ Python class for ADIOS_VARINFO structure """
+ *     def __init__(self, char * fname,
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(adios_advance_step(__pyx_v_self->fp, __pyx_v_last, __pyx_v_timeout_sec)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_stream); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 682; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "adios.pyx":568
- *         printfile(self.fp)
- * 
- *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
- *         return adios_advance_step(self.fp, last, timeout_sec)
+  /* "adios.pyx":681
+ *     property is_stream:
+ *         """ Indicating reader type; file reader or stream reader """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_stream
  * 
  */
 
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_XDECREF(__pyx_t_8);
-  __Pyx_AddTraceback("adios.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
+  __Pyx_AddTraceback("adios.file.is_stream.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "adios.pyx":684
+ *             return self.is_stream
+ * 
+ *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
+ *                  char * method_name = 'BP',
+ *                  MPI_Comm comm = MPI_COMM_WORLD,
+ */
+
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_v_last;
+static int __pyx_pw_5adios_4file_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_5adios_4file_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_fname;
+  char *__pyx_v_method_name;
+  MPI_Comm __pyx_v_comm;
+  PyObject *__pyx_v_is_stream = 0;
+  ADIOS_LOCKMODE __pyx_v_lock_mode;
   float __pyx_v_timeout_sec;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_last,&__pyx_n_s_timeout_sec,0};
-    PyObject* values[2] = {0,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_method_name,&__pyx_n_s_comm,&__pyx_n_s_is_stream,&__pyx_n_s_lock_mode,&__pyx_n_s_timeout_sec,0};
+    PyObject* values[6] = {0,0,0,0,0,0};
+
+    /* "adios.pyx":687
+ *                  char * method_name = 'BP',
+ *                  MPI_Comm comm = MPI_COMM_WORLD,
+ *                  is_stream = False,             # <<<<<<<<<<<<<<
+ *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
+ *                  float timeout_sec = 0.0):
+ */
+    values[3] = ((PyObject *)Py_False);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
       switch (pos_args) {
+        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
@@ -7524,313 +9299,541 @@ static PyObject *__pyx_pw_5adios_4file_9advance(PyObject *__pyx_v_self, PyObject
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_last);
-          if (value) { values[0] = value; kw_args--; }
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method_name);
+          if (value) { values[1] = value; kw_args--; }
         }
-        case  1:
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
+          if (value) { values[2] = value; kw_args--; }
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_is_stream);
+          if (value) { values[3] = value; kw_args--; }
+        }
+        case  4:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lock_mode);
+          if (value) { values[4] = value; kw_args--; }
+        }
+        case  5:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_timeout_sec);
-          if (value) { values[1] = value; kw_args--; }
+          if (value) { values[5] = value; kw_args--; }
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
+        break;
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    if (values[0]) {
-      __pyx_v_last = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_last == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_fname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[1]) {
+      __pyx_v_method_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_last = ((int)0);
+      __pyx_v_method_name = ((char *)__pyx_k_BP);
     }
-    if (values[1]) {
-      __pyx_v_timeout_sec = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_timeout_sec == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[2]) {
+      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[2]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 686; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_comm = __pyx_k__9;
+    }
+    __pyx_v_is_stream = values[3];
+    if (values[4]) {
+      __pyx_v_lock_mode = ((ADIOS_LOCKMODE)PyInt_AsLong(values[4])); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 688; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_lock_mode = __pyx_k__10;
+    }
+    if (values[5]) {
+      __pyx_v_timeout_sec = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_timeout_sec == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 689; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_timeout_sec = ((float)0.0);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("advance", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
-  __Pyx_AddTraceback("adios.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.file.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
-  return NULL;
+  return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_4file_8advance(((struct __pyx_obj_5adios_file *)__pyx_v_self), __pyx_v_last, __pyx_v_timeout_sec);
+  __pyx_r = __pyx_pf_5adios_4file___init__(((struct __pyx_obj_5adios_file *)__pyx_v_self), __pyx_v_fname, __pyx_v_method_name, __pyx_v_comm, __pyx_v_is_stream, __pyx_v_lock_mode, __pyx_v_timeout_sec);
+
+  /* "adios.pyx":684
+ *             return self.is_stream
+ * 
+ *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
+ *                  char * method_name = 'BP',
+ *                  MPI_Comm comm = MPI_COMM_WORLD,
+ */
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4file_8advance(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_v_last, float __pyx_v_timeout_sec) {
-  PyObject *__pyx_r = NULL;
+static int __pyx_pf_5adios_4file___init__(struct __pyx_obj_5adios_file *__pyx_v_self, char *__pyx_v_fname, char *__pyx_v_method_name, MPI_Comm __pyx_v_comm, PyObject *__pyx_v_is_stream, ADIOS_LOCKMODE __pyx_v_lock_mode, float __pyx_v_timeout_sec) {
+  PyObject *__pyx_v_method = 0;
+  PyObject *__pyx_v_name = NULL;
+  int __pyx_v_i;
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  struct __pyx_opt_args_5adios_4file_advance __pyx_t_2;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  ADIOS_READ_METHOD __pyx_t_4;
+  int __pyx_t_5;
+  uint64_t __pyx_t_6;
+  int __pyx_t_7;
+  Py_ssize_t __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("advance", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2.__pyx_n = 2;
-  __pyx_t_2.last = __pyx_v_last;
-  __pyx_t_2.timeout_sec = __pyx_v_timeout_sec;
-  __pyx_t_1 = __pyx_vtabptr_5adios_file->advance(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("__init__", 0);
+
+  /* "adios.pyx":690
+ *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
+ *                  float timeout_sec = 0.0):
+ *         self.fp = NULL             # <<<<<<<<<<<<<<
+ *         self.var = {}
+ *         self.attr = {}
+ */
+  __pyx_v_self->fp = NULL;
+
+  /* "adios.pyx":691
+ *                  float timeout_sec = 0.0):
+ *         self.fp = NULL
+ *         self.var = {}             # <<<<<<<<<<<<<<
+ *         self.attr = {}
+ *         self.is_stream = is_stream
+ */
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->var);
+  __Pyx_DECREF(__pyx_v_self->var);
+  __pyx_v_self->var = ((PyObject*)__pyx_t_1);
   __pyx_t_1 = 0;
-  goto __pyx_L0;
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":692
+ *         self.fp = NULL
+ *         self.var = {}
+ *         self.attr = {}             # <<<<<<<<<<<<<<
+ *         self.is_stream = is_stream
+ *         cdef method = str2adiosreadmethod(method_name)
+ */
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->attr);
+  __Pyx_DECREF(__pyx_v_self->attr);
+  __pyx_v_self->attr = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-/* "adios.pyx":505
+  /* "adios.pyx":693
+ *         self.var = {}
+ *         self.attr = {}
+ *         self.is_stream = is_stream             # <<<<<<<<<<<<<<
+ *         cdef method = str2adiosreadmethod(method_name)
  * 
- *     """ Public Memeber """
- *     cpdef public bytes name             # <<<<<<<<<<<<<<
- *     cpdef public int nvars
- *     cpdef public int nattrs
  */
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_is_stream); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 693; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_self->is_stream = __pyx_t_2;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_4name_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_4name___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  /* "adios.pyx":694
+ *         self.attr = {}
+ *         self.is_stream = is_stream
+ *         cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
+ * 
+ *         if (is_stream):
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 694; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyInt_FromLong(__pyx_f_5adios_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 694; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_method = __pyx_t_3;
+  __pyx_t_3 = 0;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":696
+ *         cdef method = str2adiosreadmethod(method_name)
+ * 
+ *         if (is_stream):             # <<<<<<<<<<<<<<
+ *             self.fp = adios_read_open(fname, method, comm,
+ *                                       lock_mode, timeout_sec)
+ */
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_is_stream); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 696; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__pyx_t_2) {
 
-static PyObject *__pyx_pf_5adios_4file_4name___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->name);
-  __pyx_r = __pyx_v_self->name;
-  goto __pyx_L0;
+    /* "adios.pyx":697
+ * 
+ *         if (is_stream):
+ *             self.fp = adios_read_open(fname, method, comm,             # <<<<<<<<<<<<<<
+ *                                       lock_mode, timeout_sec)
+ *         else:
+ */
+    __pyx_t_4 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "adios.pyx":698
+ *         if (is_stream):
+ *             self.fp = adios_read_open(fname, method, comm,
+ *                                       lock_mode, timeout_sec)             # <<<<<<<<<<<<<<
+ *         else:
+ *             self.fp = adios_read_open_file(fname, method, comm)
+ */
+    __pyx_v_self->fp = adios_read_open(__pyx_v_fname, __pyx_t_4, __pyx_v_comm, __pyx_v_lock_mode, __pyx_v_timeout_sec);
+    goto __pyx_L3;
+  }
+  /*else*/ {
 
-/* Python wrapper */
-static int __pyx_pw_5adios_4file_4name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_4file_4name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_4name_2__set__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+    /* "adios.pyx":700
+ *                                       lock_mode, timeout_sec)
+ *         else:
+ *             self.fp = adios_read_open_file(fname, method, comm)             # <<<<<<<<<<<<<<
+ * 
+ *         assert self.fp != NULL, 'Not an open file'
+ */
+    __pyx_t_4 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_self->fp = adios_read_open_file(__pyx_v_fname, __pyx_t_4, __pyx_v_comm);
+  }
+  __pyx_L3:;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":702
+ *             self.fp = adios_read_open_file(fname, method, comm)
+ * 
+ *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
+ * 
+ *         self.name = fname.split('/')[-1]  ## basename
+ */
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(!Py_OptimizeFlag)) {
+    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
+      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 702; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+  }
+  #endif
 
-static int __pyx_pf_5adios_4file_4name_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyBytes_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
+  /* "adios.pyx":704
+ *         assert self.fp != NULL, 'Not an open file'
+ * 
+ *         self.name = fname.split('/')[-1]  ## basename             # <<<<<<<<<<<<<<
+ *         self.nvars = self.fp.nvars
+ *         self.nattrs = self.fp.nattrs
+ */
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_fname); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 704; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 704; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 704; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, -1, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 704; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 704; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_1);
   __Pyx_GOTREF(__pyx_v_self->name);
   __Pyx_DECREF(__pyx_v_self->name);
   __pyx_v_self->name = ((PyObject*)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.name.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_5adios_4file_4name_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_5adios_4file_4name_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_4name_4__del__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  /* "adios.pyx":705
+ * 
+ *         self.name = fname.split('/')[-1]  ## basename
+ *         self.nvars = self.fp.nvars             # <<<<<<<<<<<<<<
+ *         self.nattrs = self.fp.nattrs
+ *         self.current_step = self.fp.current_step
+ */
+  __pyx_t_5 = __pyx_v_self->fp->nvars;
+  __pyx_v_self->nvars = __pyx_t_5;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":706
+ *         self.name = fname.split('/')[-1]  ## basename
+ *         self.nvars = self.fp.nvars
+ *         self.nattrs = self.fp.nattrs             # <<<<<<<<<<<<<<
+ *         self.current_step = self.fp.current_step
+ *         self.last_step = self.fp.last_step
+ */
+  __pyx_t_5 = __pyx_v_self->fp->nattrs;
+  __pyx_v_self->nattrs = __pyx_t_5;
 
-static int __pyx_pf_5adios_4file_4name_4__del__(struct __pyx_obj_5adios_file *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->name);
-  __Pyx_DECREF(__pyx_v_self->name);
-  __pyx_v_self->name = ((PyObject*)Py_None);
+  /* "adios.pyx":707
+ *         self.nvars = self.fp.nvars
+ *         self.nattrs = self.fp.nattrs
+ *         self.current_step = self.fp.current_step             # <<<<<<<<<<<<<<
+ *         self.last_step = self.fp.last_step
+ *         self.endianness = self.fp.endianness
+ */
+  __pyx_t_5 = __pyx_v_self->fp->current_step;
+  __pyx_v_self->current_step = __pyx_t_5;
 
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":708
+ *         self.nattrs = self.fp.nattrs
+ *         self.current_step = self.fp.current_step
+ *         self.last_step = self.fp.last_step             # <<<<<<<<<<<<<<
+ *         self.endianness = self.fp.endianness
+ *         self.version = self.fp.version
+ */
+  __pyx_t_5 = __pyx_v_self->fp->last_step;
+  __pyx_v_self->last_step = __pyx_t_5;
 
-/* "adios.pyx":506
- *     """ Public Memeber """
- *     cpdef public bytes name
- *     cpdef public int nvars             # <<<<<<<<<<<<<<
- *     cpdef public int nattrs
- *     cpdef public int current_step
+  /* "adios.pyx":709
+ *         self.current_step = self.fp.current_step
+ *         self.last_step = self.fp.last_step
+ *         self.endianness = self.fp.endianness             # <<<<<<<<<<<<<<
+ *         self.version = self.fp.version
+ *         self.file_size = self.fp.file_size
  */
+  __pyx_t_5 = __pyx_v_self->fp->endianness;
+  __pyx_v_self->endianness = __pyx_t_5;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_5nvars_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_5nvars_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_5nvars___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  /* "adios.pyx":710
+ *         self.last_step = self.fp.last_step
+ *         self.endianness = self.fp.endianness
+ *         self.version = self.fp.version             # <<<<<<<<<<<<<<
+ *         self.file_size = self.fp.file_size
+ * 
+ */
+  __pyx_t_5 = __pyx_v_self->fp->version;
+  __pyx_v_self->version = __pyx_t_5;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":711
+ *         self.endianness = self.fp.endianness
+ *         self.version = self.fp.version
+ *         self.file_size = self.fp.file_size             # <<<<<<<<<<<<<<
+ * 
+ *         for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:
+ */
+  __pyx_t_6 = __pyx_v_self->fp->file_size;
+  __pyx_v_self->file_size = __pyx_t_6;
 
-static PyObject *__pyx_pf_5adios_4file_5nvars___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nvars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  /* "adios.pyx":713
+ *         self.file_size = self.fp.file_size
+ * 
+ *         for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:             # <<<<<<<<<<<<<<
+ *             self.var[name] = var(self, name)
+ * 
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __pyx_t_5 = __pyx_v_self->nvars;
+  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_5; __pyx_t_7+=1) {
+    __pyx_v_i = __pyx_t_7;
+    __pyx_t_3 = __Pyx_PyBytes_FromString((__pyx_v_self->fp->var_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  for (;;) {
+    if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_3)) break;
+    #if CYTHON_COMPILING_IN_CPYTHON
+    __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #else
+    __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_name, __pyx_t_1);
+    __pyx_t_1 = 0;
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.nvars.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+    /* "adios.pyx":714
+ * 
+ *         for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:
+ *             self.var[name] = var(self, name)             # <<<<<<<<<<<<<<
+ * 
+ *         for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:
+ */
+    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __Pyx_INCREF(__pyx_v_name);
+    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_name);
+    __Pyx_GIVEREF(__pyx_v_name);
+    __pyx_t_9 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_var)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_v_name, __pyx_t_9) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-/* Python wrapper */
-static int __pyx_pw_5adios_4file_5nvars_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_4file_5nvars_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_5nvars_2__set__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+    /* "adios.pyx":713
+ *         self.file_size = self.fp.file_size
+ * 
+ *         for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:             # <<<<<<<<<<<<<<
+ *             self.var[name] = var(self, name)
+ * 
+ */
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":716
+ *             self.var[name] = var(self, name)
+ * 
+ *         for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:             # <<<<<<<<<<<<<<
+ *             self.attr[name] = attr(self, name)
+ * 
+ */
+  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_5 = __pyx_v_self->nattrs;
+  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_5; __pyx_t_7+=1) {
+    __pyx_v_i = __pyx_t_7;
+    __pyx_t_9 = __Pyx_PyBytes_FromString((__pyx_v_self->fp->attr_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_9))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  }
+  __pyx_t_9 = __pyx_t_3; __Pyx_INCREF(__pyx_t_9); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_9)) break;
+    #if CYTHON_COMPILING_IN_CPYTHON
+    __pyx_t_3 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #else
+    __pyx_t_3 = PySequence_ITEM(__pyx_t_9, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_name, __pyx_t_3);
+    __pyx_t_3 = 0;
 
-static int __pyx_pf_5adios_4file_5nvars_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->nvars = __pyx_t_1;
+    /* "adios.pyx":717
+ * 
+ *         for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:
+ *             self.attr[name] = attr(self, name)             # <<<<<<<<<<<<<<
+ * 
+ *     def __del__(self):
+ */
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __Pyx_INCREF(__pyx_v_name);
+    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_name);
+    __Pyx_GIVEREF(__pyx_v_name);
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_attr)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(__pyx_v_self->attr == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    if (unlikely(PyDict_SetItem(__pyx_v_self->attr, __pyx_v_name, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "adios.pyx":716
+ *             self.var[name] = var(self, name)
+ * 
+ *         for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:             # <<<<<<<<<<<<<<
+ *             self.attr[name] = attr(self, name)
+ * 
+ */
+  }
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "adios.pyx":684
+ *             return self.is_stream
+ * 
+ *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
+ *                  char * method_name = 'BP',
+ *                  MPI_Comm comm = MPI_COMM_WORLD,
+ */
 
   /* function exit code */
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.file.nvars.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("adios.file.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_method);
+  __Pyx_XDECREF(__pyx_v_name);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":507
- *     cpdef public bytes name
- *     cpdef public int nvars
- *     cpdef public int nattrs             # <<<<<<<<<<<<<<
- *     cpdef public int current_step
- *     cpdef public int last_step
+/* "adios.pyx":719
+ *             self.attr[name] = attr(self, name)
+ * 
+ *     def __del__(self):             # <<<<<<<<<<<<<<
+ *         """ Close file on destruction. """
+ *         self.close()
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_6nattrs_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_6nattrs_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_5adios_4file_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_5adios_4file_2__del__[] = "file.__del__(self)\n Close file on destruction. ";
+static PyObject *__pyx_pw_5adios_4file_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_6nattrs___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_2__del__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4file_6nattrs___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_4file_2__del__(struct __pyx_obj_5adios_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nattrs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("__del__", 0);
+
+  /* "adios.pyx":721
+ *     def __del__(self):
+ *         """ Close file on destruction. """
+ *         self.close()             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef close(self):
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_5adios_file *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 721; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "adios.pyx":719
+ *             self.attr[name] = attr(self, name)
+ * 
+ *     def __del__(self):             # <<<<<<<<<<<<<<
+ *         """ Close file on destruction. """
+ *         self.close()
+ */
 
   /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.nattrs.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.file.__del__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -7838,72 +9841,143 @@ static PyObject *__pyx_pf_5adios_4file_6nattrs___get__(struct __pyx_obj_5adios_f
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_5adios_4file_6nattrs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_4file_6nattrs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_6nattrs_2__set__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+/* "adios.pyx":723
+ *         self.close()
+ * 
+ *     cpdef close(self):             # <<<<<<<<<<<<<<
+ *         """ Close the open file. """
+ *         assert self.fp != NULL, 'Not an open file'
+ */
 
-static int __pyx_pf_5adios_4file_6nattrs_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_5adios_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_f_5adios_4file_close(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_skip_dispatch) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->nattrs = __pyx_t_1;
+  __Pyx_RefNannySetupContext("close", 0);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_4file_5close)) {
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_3, function);
+        }
+      }
+      if (__pyx_t_4) {
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      } else {
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_2;
+      __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "adios.pyx":725
+ *     cpdef close(self):
+ *         """ Close the open file. """
+ *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
+ *         adios_read_close(self.fp)
+ *         self.fp = NULL
+ */
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(!Py_OptimizeFlag)) {
+    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
+      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 725; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+  }
+  #endif
+
+  /* "adios.pyx":726
+ *         """ Close the open file. """
+ *         assert self.fp != NULL, 'Not an open file'
+ *         adios_read_close(self.fp)             # <<<<<<<<<<<<<<
+ *         self.fp = NULL
+ * 
+ */
+  adios_read_close(__pyx_v_self->fp);
+
+  /* "adios.pyx":727
+ *         assert self.fp != NULL, 'Not an open file'
+ *         adios_read_close(self.fp)
+ *         self.fp = NULL             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef printself(self):
+ */
+  __pyx_v_self->fp = NULL;
+
+  /* "adios.pyx":723
+ *         self.close()
+ * 
+ *     cpdef close(self):             # <<<<<<<<<<<<<<
+ *         """ Close the open file. """
+ *         assert self.fp != NULL, 'Not an open file'
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.file.nattrs.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios.file.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":508
- *     cpdef public int nvars
- *     cpdef public int nattrs
- *     cpdef public int current_step             # <<<<<<<<<<<<<<
- *     cpdef public int last_step
- *     cpdef public int endianness
- */
-
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_12current_step_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_12current_step_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_5adios_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_5adios_4file_4close[] = "file.close(self)\n Close the open file. ";
+static PyObject *__pyx_pw_5adios_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_12current_step___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("close (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_4close(((struct __pyx_obj_5adios_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4file_12current_step___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_4file_4close(struct __pyx_obj_5adios_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("close", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->current_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_5adios_4file_close(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7912,7 +9986,7 @@ static PyObject *__pyx_pf_5adios_4file_12current_step___get__(struct __pyx_obj_5
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.current_step.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.file.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -7920,72 +9994,168 @@ static PyObject *__pyx_pf_5adios_4file_12current_step___get__(struct __pyx_obj_5
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_5adios_4file_12current_step_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_4file_12current_step_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_12current_step_2__set__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+/* "adios.pyx":729
+ *         self.fp = NULL
+ * 
+ *     cpdef printself(self):             # <<<<<<<<<<<<<<
+ *         """ Print native ADIOS_FILE structure. """
+ *         assert self.fp != NULL, 'Not an open file'
+ */
 
-static int __pyx_pf_5adios_4file_12current_step_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_5adios_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_f_5adios_4file_printself(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_skip_dispatch) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->current_step = __pyx_t_1;
+  __Pyx_RefNannySetupContext("printself", 0);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_printself); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 729; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_4file_7printself)) {
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_3, function);
+        }
+      }
+      if (__pyx_t_4) {
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 729; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      } else {
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 729; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_2;
+      __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "adios.pyx":731
+ *     cpdef printself(self):
+ *         """ Print native ADIOS_FILE structure. """
+ *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
+ *         print '=== AdiosFile ==='
+ *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
+ */
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(!Py_OptimizeFlag)) {
+    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
+      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+  }
+  #endif
+
+  /* "adios.pyx":732
+ *         """ Print native ADIOS_FILE structure. """
+ *         assert self.fp != NULL, 'Not an open file'
+ *         print '=== AdiosFile ==='             # <<<<<<<<<<<<<<
+ *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
+ *         printfile(self.fp)
+ */
+  if (__Pyx_PrintOne(0, __pyx_kp_s_AdiosFile) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":733
+ *         assert self.fp != NULL, 'Not an open file'
+ *         print '=== AdiosFile ==='
+ *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)             # <<<<<<<<<<<<<<
+ *         printfile(self.fp)
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->fp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_n_s_fp);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_fp);
+  __Pyx_GIVEREF(__pyx_n_s_fp);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "adios.pyx":734
+ *         print '=== AdiosFile ==='
+ *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
+ *         printfile(self.fp)             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):
+ */
+  __pyx_t_1 = __pyx_f_5adios_printfile(__pyx_v_self->fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 734; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "adios.pyx":729
+ *         self.fp = NULL
+ * 
+ *     cpdef printself(self):             # <<<<<<<<<<<<<<
+ *         """ Print native ADIOS_FILE structure. """
+ *         assert self.fp != NULL, 'Not an open file'
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.file.current_step.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios.file.printself", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":509
- *     cpdef public int nattrs
- *     cpdef public int current_step
- *     cpdef public int last_step             # <<<<<<<<<<<<<<
- *     cpdef public int endianness
- *     cpdef public int version
- */
-
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_9last_step_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_9last_step_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_5adios_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_5adios_4file_6printself[] = "file.printself(self)\n Print native ADIOS_FILE structure. ";
+static PyObject *__pyx_pw_5adios_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_9last_step___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("printself (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_6printself(((struct __pyx_obj_5adios_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4file_9last_step___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_4file_6printself(struct __pyx_obj_5adios_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("printself", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_5adios_4file_printself(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 729; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7994,7 +10164,7 @@ static PyObject *__pyx_pf_5adios_4file_9last_step___get__(struct __pyx_obj_5adio
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.last_step.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.file.printself", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -8002,72 +10172,356 @@ static PyObject *__pyx_pf_5adios_4file_9last_step___get__(struct __pyx_obj_5adio
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_5adios_4file_9last_step_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_4file_9last_step_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_9last_step_2__set__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+/* "adios.pyx":736
+ *         printfile(self.fp)
+ * 
+ *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
+ *         """
+ *         Advance a timestep for stream reader.
+ */
 
-static int __pyx_pf_5adios_4file_9last_step_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_5adios_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_5adios_4file_advance(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_4file_advance *__pyx_optional_args) {
+  int __pyx_v_last = ((int)0);
+  float __pyx_v_timeout_sec = ((float)0.0);
+  int __pyx_v_val;
+  PyObject *__pyx_v_v = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  Py_ssize_t __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  int __pyx_t_10;
+  PyObject *(*__pyx_t_11)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->last_step = __pyx_t_1;
+  __Pyx_RefNannySetupContext("advance", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_last = __pyx_optional_args->last;
+      if (__pyx_optional_args->__pyx_n > 1) {
+        __pyx_v_timeout_sec = __pyx_optional_args->timeout_sec;
+      }
+    }
+  }
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_4file_9advance)) {
+      __Pyx_XDECREF(__pyx_r);
+      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_last); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_timeout_sec); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_5 = __pyx_t_1; __pyx_t_6 = NULL;
+      __pyx_t_7 = 0;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
+        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
+        if (likely(__pyx_t_6)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+          __Pyx_INCREF(__pyx_t_6);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_5, function);
+          __pyx_t_7 = 1;
+        }
+      }
+      __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      if (__pyx_t_6) {
+        PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
+      }
+      PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_4);
+      __Pyx_GIVEREF(__pyx_t_4);
+      __pyx_t_3 = 0;
+      __pyx_t_4 = 0;
+      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_r = __pyx_t_2;
+      __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
 
-  /* function exit code */
-  __pyx_r = 0;
+  /* "adios.pyx":747
+ *             int: 0 if successful, non-zero otherwise.
+ *         """
+ *         val = adios_advance_step(self.fp, last, timeout_sec)             # <<<<<<<<<<<<<<
+ *         if (val >= 0):
+ *             self.current_step = self.fp.current_step
+ */
+  __pyx_v_val = adios_advance_step(__pyx_v_self->fp, __pyx_v_last, __pyx_v_timeout_sec);
+
+  /* "adios.pyx":748
+ *         """
+ *         val = adios_advance_step(self.fp, last, timeout_sec)
+ *         if (val >= 0):             # <<<<<<<<<<<<<<
+ *             self.current_step = self.fp.current_step
+ *             self.last_step = self.fp.last_step
+ */
+  __pyx_t_9 = ((__pyx_v_val >= 0) != 0);
+  if (__pyx_t_9) {
+
+    /* "adios.pyx":749
+ *         val = adios_advance_step(self.fp, last, timeout_sec)
+ *         if (val >= 0):
+ *             self.current_step = self.fp.current_step             # <<<<<<<<<<<<<<
+ *             self.last_step = self.fp.last_step
+ * 
+ */
+    __pyx_t_10 = __pyx_v_self->fp->current_step;
+    __pyx_v_self->current_step = __pyx_t_10;
+
+    /* "adios.pyx":750
+ *         if (val >= 0):
+ *             self.current_step = self.fp.current_step
+ *             self.last_step = self.fp.last_step             # <<<<<<<<<<<<<<
+ * 
+ *             for v in self.var.values():
+ */
+    __pyx_t_10 = __pyx_v_self->fp->last_step;
+    __pyx_v_self->last_step = __pyx_t_10;
+
+    /* "adios.pyx":752
+ *             self.last_step = self.fp.last_step
+ * 
+ *             for v in self.var.values():             # <<<<<<<<<<<<<<
+ *                 v.advance()
+ * 
+ */
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "values");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_1 = __Pyx_PyDict_Values(__pyx_v_self->var); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
+      __pyx_t_11 = NULL;
+    } else {
+      __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_11 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    for (;;) {
+      if (likely(!__pyx_t_11)) {
+        if (likely(PyList_CheckExact(__pyx_t_2))) {
+          if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else {
+          if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        }
+      } else {
+        __pyx_t_1 = __pyx_t_11(__pyx_t_2);
+        if (unlikely(!__pyx_t_1)) {
+          PyObject* exc_type = PyErr_Occurred();
+          if (exc_type) {
+            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+            else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
+          break;
+        }
+        __Pyx_GOTREF(__pyx_t_1);
+      }
+      __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_1);
+      __pyx_t_1 = 0;
+
+      /* "adios.pyx":753
+ * 
+ *             for v in self.var.values():
+ *                 v.advance()             # <<<<<<<<<<<<<<
+ * 
+ *         return val
+ */
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_advance); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 753; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_8 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
+        __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_5);
+        if (likely(__pyx_t_8)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+          __Pyx_INCREF(__pyx_t_8);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_5, function);
+        }
+      }
+      if (__pyx_t_8) {
+        __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 753; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      } else {
+        __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 753; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+      /* "adios.pyx":752
+ *             self.last_step = self.fp.last_step
+ * 
+ *             for v in self.var.values():             # <<<<<<<<<<<<<<
+ *                 v.advance()
+ * 
+ */
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios.pyx":755
+ *                 v.advance()
+ * 
+ *         return val             # <<<<<<<<<<<<<<
+ * 
+ *     def __getitem__(self, varname):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 755; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
   goto __pyx_L0;
+
+  /* "adios.pyx":736
+ *         printfile(self.fp)
+ * 
+ *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
+ *         """
+ *         Advance a timestep for stream reader.
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.file.last_step.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_AddTraceback("adios.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_v);
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":510
- *     cpdef public int current_step
- *     cpdef public int last_step
- *     cpdef public int endianness             # <<<<<<<<<<<<<<
- *     cpdef public int version
- *     cpdef public int file_size
- */
-
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_10endianness_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_10endianness_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_5adios_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_4file_8advance[] = "file.advance(self, int last=0, float timeout_sec=0.0)\n\n        Advance a timestep for stream reader.\n\n        Args:\n            last (int, optional): last timestep index (default: 0).\n            timeout_sec (float, optional): timeout seconds (default: 0.0).\n\n        Returns:\n            int: 0 if successful, non-zero otherwise.\n        ";
+static PyObject *__pyx_pw_5adios_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_v_last;
+  float __pyx_v_timeout_sec;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_10endianness___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_last,&__pyx_n_s_timeout_sec,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_last);
+          if (value) { values[0] = value; kw_args--; }
+        }
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_timeout_sec);
+          if (value) { values[1] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    if (values[0]) {
+      __pyx_v_last = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_last == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_last = ((int)0);
+    }
+    if (values[1]) {
+      __pyx_v_timeout_sec = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_timeout_sec == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_timeout_sec = ((float)0.0);
+    }
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("advance", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_4file_8advance(((struct __pyx_obj_5adios_file *)__pyx_v_self), __pyx_v_last, __pyx_v_timeout_sec);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4file_10endianness___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_4file_8advance(struct __pyx_obj_5adios_file *__pyx_v_self, int __pyx_v_last, float __pyx_v_timeout_sec) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  struct __pyx_opt_args_5adios_4file_advance __pyx_t_2;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("advance", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->endianness); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2.__pyx_n = 2;
+  __pyx_t_2.last = __pyx_v_last;
+  __pyx_t_2.timeout_sec = __pyx_v_timeout_sec;
+  __pyx_t_1 = __pyx_vtabptr_5adios_file->advance(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -8076,7 +10530,7 @@ static PyObject *__pyx_pf_5adios_4file_10endianness___get__(struct __pyx_obj_5ad
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.endianness.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -8084,163 +10538,519 @@ static PyObject *__pyx_pf_5adios_4file_10endianness___get__(struct __pyx_obj_5ad
   return __pyx_r;
 }
 
+/* "adios.pyx":757
+ *         return val
+ * 
+ *     def __getitem__(self, varname):             # <<<<<<<<<<<<<<
+ *         """
+ *         Return Adios variable.
+ */
+
 /* Python wrapper */
-static int __pyx_pw_5adios_4file_10endianness_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_4file_10endianness_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_5adios_4file_11__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_varname); /*proto*/
+static char __pyx_doc_5adios_4file_10__getitem__[] = "\n        Return Adios variable.\n\n        Args:\n            varname (str): variable name.\n\n        Raises:\n            KeyError: If no varname exists.\n\n        ";
+#if CYTHON_COMPILING_IN_CPYTHON
+struct wrapperbase __pyx_wrapperbase_5adios_4file_10__getitem__;
+#endif
+static PyObject *__pyx_pw_5adios_4file_11__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_varname) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_10endianness_2__set__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_10__getitem__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_varname));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_5adios_4file_10endianness_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pf_5adios_4file_10__getitem__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_varname) {
+  PyObject *__pyx_v_key_ = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  PyObject *__pyx_t_7 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->endianness = __pyx_t_1;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.file.endianness.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_INCREF(__pyx_v_varname);
 
-/* "adios.pyx":511
- *     cpdef public int last_step
- *     cpdef public int endianness
- *     cpdef public int version             # <<<<<<<<<<<<<<
- *     cpdef public int file_size
+  /* "adios.pyx":768
+ * 
+ *         """
+ *         if not isinstance(varname, tuple):             # <<<<<<<<<<<<<<
+ *             varname = (varname,)
  * 
  */
+  __pyx_t_1 = PyTuple_Check(__pyx_v_varname); 
+  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
+  if (__pyx_t_2) {
 
-/* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_7version_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_7version_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_7version___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+    /* "adios.pyx":769
+ *         """
+ *         if not isinstance(varname, tuple):
+ *             varname = (varname,)             # <<<<<<<<<<<<<<
+ * 
+ *         if len(varname) > 1:
+ */
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(__pyx_v_varname);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_varname);
+    __Pyx_GIVEREF(__pyx_v_varname);
+    __Pyx_DECREF_SET(__pyx_v_varname, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":771
+ *             varname = (varname,)
+ * 
+ *         if len(varname) > 1:             # <<<<<<<<<<<<<<
+ *             raise KeyError(varname)
+ * 
+ */
+  __pyx_t_4 = PyObject_Length(__pyx_v_varname); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((__pyx_t_4 > 1) != 0);
+  if (__pyx_t_2) {
 
-static PyObject *__pyx_pf_5adios_4file_7version___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+    /* "adios.pyx":772
+ * 
+ *         if len(varname) > 1:
+ *             raise KeyError(varname)             # <<<<<<<<<<<<<<
+ * 
+ *         for key_ in varname:
+ */
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(__pyx_v_varname);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_varname);
+    __Pyx_GIVEREF(__pyx_v_varname);
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_KeyError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.version.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":774
+ *             raise KeyError(varname)
+ * 
+ *         for key_ in varname:             # <<<<<<<<<<<<<<
+ *             if not isinstance(key_, str):
+ *                 raise TypeError("Unhashable type")
+ */
+  if (likely(PyList_CheckExact(__pyx_v_varname)) || PyTuple_CheckExact(__pyx_v_varname)) {
+    __pyx_t_5 = __pyx_v_varname; __Pyx_INCREF(__pyx_t_5); __pyx_t_4 = 0;
+    __pyx_t_6 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_varname); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  for (;;) {
+    if (likely(!__pyx_t_6)) {
+      if (likely(PyList_CheckExact(__pyx_t_5))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_5)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_3 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_3 = PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_3 = PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_3 = __pyx_t_6(__pyx_t_5);
+      if (unlikely(!__pyx_t_3)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    __pyx_v_key_ = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-/* Python wrapper */
-static int __pyx_pw_5adios_4file_7version_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_4file_7version_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_7version_2__set__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+    /* "adios.pyx":775
+ * 
+ *         for key_ in varname:
+ *             if not isinstance(key_, str):             # <<<<<<<<<<<<<<
+ *                 raise TypeError("Unhashable type")
+ * 
+ */
+    __pyx_t_2 = PyString_Check(__pyx_v_key_); 
+    __pyx_t_1 = ((!(__pyx_t_2 != 0)) != 0);
+    if (__pyx_t_1) {
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+      /* "adios.pyx":776
+ *         for key_ in varname:
+ *             if not isinstance(key_, str):
+ *                 raise TypeError("Unhashable type")             # <<<<<<<<<<<<<<
+ * 
+ *             if key_ in self.var.keys():
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 776; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 776; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
 
-static int __pyx_pf_5adios_4file_7version_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->version = __pyx_t_1;
+    /* "adios.pyx":778
+ *                 raise TypeError("Unhashable type")
+ * 
+ *             if key_ in self.var.keys():             # <<<<<<<<<<<<<<
+ *                 return self.var.get(key_)
+ *             elif key_ in self.attr.keys():
+ */
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_Keys(__pyx_v_self->var); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_key_, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_2 = (__pyx_t_1 != 0);
+    if (__pyx_t_2) {
+
+      /* "adios.pyx":779
+ * 
+ *             if key_ in self.var.keys():
+ *                 return self.var.get(key_)             # <<<<<<<<<<<<<<
+ *             elif key_ in self.attr.keys():
+ *                 return self.attr.get(key_)
+ */
+      __Pyx_XDECREF(__pyx_r);
+      if (unlikely(__pyx_v_self->var == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "get");
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_t_3 = __Pyx_PyDict_GetItemDefault(__pyx_v_self->var, __pyx_v_key_, Py_None); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_r = __pyx_t_3;
+      __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      goto __pyx_L0;
+    }
+
+    /* "adios.pyx":780
+ *             if key_ in self.var.keys():
+ *                 return self.var.get(key_)
+ *             elif key_ in self.attr.keys():             # <<<<<<<<<<<<<<
+ *                 return self.attr.get(key_)
+ *             else:
+ */
+    if (unlikely(__pyx_v_self->attr == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_Keys(__pyx_v_self->attr); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_2 = (__Pyx_PySequence_Contains(__pyx_v_key_, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_1 = (__pyx_t_2 != 0);
+    if (__pyx_t_1) {
+
+      /* "adios.pyx":781
+ *                 return self.var.get(key_)
+ *             elif key_ in self.attr.keys():
+ *                 return self.attr.get(key_)             # <<<<<<<<<<<<<<
+ *             else:
+ *                 raise KeyError(key_)
+ */
+      __Pyx_XDECREF(__pyx_r);
+      if (unlikely(__pyx_v_self->attr == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "get");
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_t_3 = __Pyx_PyDict_GetItemDefault(__pyx_v_self->attr, __pyx_v_key_, Py_None); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_r = __pyx_t_3;
+      __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      goto __pyx_L0;
+    }
+    /*else*/ {
+
+      /* "adios.pyx":783
+ *                 return self.attr.get(key_)
+ *             else:
+ *                 raise KeyError(key_)             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
+ */
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_INCREF(__pyx_v_key_);
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_key_);
+      __Pyx_GIVEREF(__pyx_v_key_);
+      __pyx_t_7 = __Pyx_PyObject_Call(__pyx_builtin_KeyError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_Raise(__pyx_t_7, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "adios.pyx":774
+ *             raise KeyError(varname)
+ * 
+ *         for key_ in varname:             # <<<<<<<<<<<<<<
+ *             if not isinstance(key_, str):
+ *                 raise TypeError("Unhashable type")
+ */
+  }
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+  /* "adios.pyx":757
+ *         return val
+ * 
+ *     def __getitem__(self, varname):             # <<<<<<<<<<<<<<
+ *         """
+ *         Return Adios variable.
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.file.version.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("adios.file.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_key_);
+  __Pyx_XDECREF(__pyx_v_varname);
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":512
- *     cpdef public int endianness
- *     cpdef public int version
- *     cpdef public int file_size             # <<<<<<<<<<<<<<
+/* "adios.pyx":785
+ *                 raise KeyError(key_)
  * 
- *     cpdef public dict var
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         """ Return string representation. """
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_9file_size_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_9file_size_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_5adios_4file_13__repr__(PyObject *__pyx_v_self); /*proto*/
+static char __pyx_doc_5adios_4file_12__repr__[] = " Return string representation. ";
+#if CYTHON_COMPILING_IN_CPYTHON
+struct wrapperbase __pyx_wrapperbase_5adios_4file_12__repr__;
+#endif
+static PyObject *__pyx_pw_5adios_4file_13__repr__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_9file_size___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4file_12__repr__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4file_9file_size___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_4file_12__repr__(struct __pyx_obj_5adios_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__repr__", 0);
+
+  /* "adios.pyx":787
+ *     def __repr__(self):
+ *         """ Return string representation. """
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "             # <<<<<<<<<<<<<<
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \
+ *                 (self.fp.path,
+ */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->file_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":789
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \
+ *                 (self.fp.path,             # <<<<<<<<<<<<<<
+ *                  self.nvars,
+ *                  self.var.keys(),
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->fp->path); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
+
+  /* "adios.pyx":790
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \
+ *                 (self.fp.path,
+ *                  self.nvars,             # <<<<<<<<<<<<<<
+ *                  self.var.keys(),
+ *                  self.nattrs,
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->nvars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "adios.pyx":791
+ *                 (self.fp.path,
+ *                  self.nvars,
+ *                  self.var.keys(),             # <<<<<<<<<<<<<<
+ *                  self.nattrs,
+ *                  self.attr.keys(),
+ */
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_3 = __Pyx_PyDict_Keys(__pyx_v_self->var); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "adios.pyx":792
+ *                  self.nvars,
+ *                  self.var.keys(),
+ *                  self.nattrs,             # <<<<<<<<<<<<<<
+ *                  self.attr.keys(),
+ *                  self.current_step,
+ */
+  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->nattrs); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 792; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+
+  /* "adios.pyx":793
+ *                  self.var.keys(),
+ *                  self.nattrs,
+ *                  self.attr.keys(),             # <<<<<<<<<<<<<<
+ *                  self.current_step,
+ *                  self.last_step,
+ */
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 793; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_5 = __Pyx_PyDict_Keys(__pyx_v_self->attr); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 793; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+
+  /* "adios.pyx":794
+ *                  self.nattrs,
+ *                  self.attr.keys(),
+ *                  self.current_step,             # <<<<<<<<<<<<<<
+ *                  self.last_step,
+ *                  self.file_size)
+ */
+  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->current_step); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+
+  /* "adios.pyx":795
+ *                  self.attr.keys(),
+ *                  self.current_step,
+ *                  self.last_step,             # <<<<<<<<<<<<<<
+ *                  self.file_size)
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_self->last_step); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+
+  /* "adios.pyx":796
+ *                  self.current_step,
+ *                  self.last_step,
+ *                  self.file_size)             # <<<<<<<<<<<<<<
+ * 
+ * cdef class var:
+ */
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_self->file_size); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+
+  /* "adios.pyx":789
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \
+ *                 (self.fp.path,             # <<<<<<<<<<<<<<
+ *                  self.nvars,
+ *                  self.var.keys(),
+ */
+  __pyx_t_9 = PyTuple_New(8); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_9);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_4);
+  __Pyx_GIVEREF(__pyx_t_4);
+  PyTuple_SET_ITEM(__pyx_t_9, 4, __pyx_t_5);
+  __Pyx_GIVEREF(__pyx_t_5);
+  PyTuple_SET_ITEM(__pyx_t_9, 5, __pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_6);
+  PyTuple_SET_ITEM(__pyx_t_9, 6, __pyx_t_7);
+  __Pyx_GIVEREF(__pyx_t_7);
+  PyTuple_SET_ITEM(__pyx_t_9, 7, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
   __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_4 = 0;
+  __pyx_t_5 = 0;
+  __pyx_t_6 = 0;
+  __pyx_t_7 = 0;
+  __pyx_t_8 = 0;
+
+  /* "adios.pyx":788
+ *         """ Return string representation. """
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.fp.path,
+ *                  self.nvars,
+ */
+  __pyx_t_8 = __Pyx_PyString_Format(__pyx_kp_s_AdiosFile_path_r_nvars_r_var_r_n, __pyx_t_9); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_r = __pyx_t_8;
+  __pyx_t_8 = 0;
   goto __pyx_L0;
 
+  /* "adios.pyx":785
+ *                 raise KeyError(key_)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         """ Return string representation. """
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+ */
+
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.file_size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("adios.file.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -8248,44 +11058,9 @@ static PyObject *__pyx_pf_5adios_4file_9file_size___get__(struct __pyx_obj_5adio
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_5adios_4file_9file_size_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_4file_9file_size_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_9file_size_2__set__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_5adios_4file_9file_size_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->file_size = __pyx_t_1;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.file.file_size.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "adios.pyx":514
- *     cpdef public int file_size
+/* "adios.pyx":636
  * 
+ *     ## Public Memeber
  *     cpdef public dict var             # <<<<<<<<<<<<<<
  *     cpdef public dict attr
  * 
@@ -8341,7 +11116,7 @@ static int __pyx_pf_5adios_4file_3var_2__set__(struct __pyx_obj_5adios_file *__p
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __pyx_v_value;
   __Pyx_INCREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
@@ -8391,12 +11166,12 @@ static int __pyx_pf_5adios_4file_3var_4__del__(struct __pyx_obj_5adios_file *__p
   return __pyx_r;
 }
 
-/* "adios.pyx":515
- * 
+/* "adios.pyx":637
+ *     ## Public Memeber
  *     cpdef public dict var
  *     cpdef public dict attr             # <<<<<<<<<<<<<<
  * 
- *     cpdef public bint is_stream
+ *     property name:
  */
 
 /* Python wrapper */
@@ -8449,7 +11224,7 @@ static int __pyx_pf_5adios_4file_4attr_2__set__(struct __pyx_obj_5adios_file *__
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __pyx_v_value;
   __Pyx_INCREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
@@ -8499,28 +11274,81 @@ static int __pyx_pf_5adios_4file_4attr_4__del__(struct __pyx_obj_5adios_file *__
   return __pyx_r;
 }
 
-/* "adios.pyx":517
- *     cpdef public dict attr
- * 
- *     cpdef public bint is_stream             # <<<<<<<<<<<<<<
+/* "adios.pyx":826
+ *     property name:
+ *         """ The variable name. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
- *     """ Initialization. Call adios_read_open and populate public members """
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_4file_9is_stream_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_4file_9is_stream_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_5adios_3var_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_4name_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_9is_stream___get__(((struct __pyx_obj_5adios_file *)__pyx_v_self));
+  __pyx_r = __pyx_pf_5adios_3var_4name___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_4file_9is_stream___get__(struct __pyx_obj_5adios_file *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_3var_4name___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":827
+ *         """ The variable name. """
+ *         def __get__(self):
+ *             return self.name             # <<<<<<<<<<<<<<
+ * 
+ *     property varid:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->name);
+  __pyx_r = __pyx_v_self->name;
+  goto __pyx_L0;
+
+  /* "adios.pyx":826
+ *     property name:
+ *         """ The variable name. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":831
+ *     property varid:
+ *         """ Internal variable id. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.varid
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_3var_5varid_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_5varid_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_3var_5varid___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_3var_5varid___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -8528,17 +11356,33 @@ static PyObject *__pyx_pf_5adios_4file_9is_stream___get__(struct __pyx_obj_5adio
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":832
+ *         """ Internal variable id. """
+ *         def __get__(self):
+ *             return self.varid             # <<<<<<<<<<<<<<
+ * 
+ *     property dtype:
+ */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_stream); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
+  /* "adios.pyx":831
+ *     property varid:
+ *         """ Internal variable id. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.varid
+ * 
+ */
+
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.file.is_stream.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.var.varid.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -8546,44 +11390,241 @@ static PyObject *__pyx_pf_5adios_4file_9is_stream___get__(struct __pyx_obj_5adio
   return __pyx_r;
 }
 
+/* "adios.pyx":836
+ *     property dtype:
+ *         """ Variable type as in numpy.dtype. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
+
 /* Python wrapper */
-static int __pyx_pw_5adios_4file_9is_stream_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_4file_9is_stream_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_5adios_3var_5dtype_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_5dtype_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_4file_9is_stream_2__set__(((struct __pyx_obj_5adios_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_3var_5dtype___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_5adios_4file_9is_stream_2__set__(struct __pyx_obj_5adios_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pf_5adios_3var_5dtype___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":837
+ *         """ Variable type as in numpy.dtype. """
+ *         def __get__(self):
+ *             return self.dtype             # <<<<<<<<<<<<<<
+ * 
+ *     property ndim:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->dtype));
+  __pyx_r = ((PyObject *)__pyx_v_self->dtype);
+  goto __pyx_L0;
+
+  /* "adios.pyx":836
+ *     property dtype:
+ *         """ Variable type as in numpy.dtype. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":841
+ *     property ndim:
+ *         """ The number of dimensions of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.ndim
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_3var_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_4ndim_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_3var_4ndim___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_3var_4ndim___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->is_stream = __pyx_t_1;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":842
+ *         """ The number of dimensions of the variable. """
+ *         def __get__(self):
+ *             return self.ndim             # <<<<<<<<<<<<<<
+ * 
+ *     property dims:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "adios.pyx":841
+ *     property ndim:
+ *         """ The number of dimensions of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.ndim
+ * 
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.var.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":846
+ *     property dims:
+ *         """ The shape of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dims
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_3var_4dims_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_4dims_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_3var_4dims___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_3var_4dims___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":847
+ *         """ The shape of the variable. """
+ *         def __get__(self):
+ *             return self.dims             # <<<<<<<<<<<<<<
+ * 
+ *     property nsteps:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->dims);
+  __pyx_r = __pyx_v_self->dims;
+  goto __pyx_L0;
+
+  /* "adios.pyx":846
+ *     property dims:
+ *         """ The shape of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dims
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":851
+ *     property nsteps:
+ *         """ The number of time steps of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nsteps
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_3var_6nsteps_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_6nsteps_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_3var_6nsteps___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_3var_6nsteps___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":852
+ *         """ The number of time steps of the variable. """
+ *         def __get__(self):
+ *             return self.nsteps             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, file file, char * name):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
   goto __pyx_L0;
+
+  /* "adios.pyx":851
+ *     property nsteps:
+ *         """ The number of time steps of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nsteps
+ * 
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.file.is_stream.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.var.nsteps.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":586
+/* "adios.pyx":854
+ *             return self.nsteps
  * 
- *     """ Initialization. Call adios_inq_var and populate public members """
  *     def __init__(self, file file, char * name):             # <<<<<<<<<<<<<<
  *         self.file = file
  *         self.vp = NULL
@@ -8620,11 +11661,11 @@ static int __pyx_pw_5adios_3var_1__init__(PyObject *__pyx_v_self, PyObject *__py
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -8633,17 +11674,17 @@ static int __pyx_pw_5adios_3var_1__init__(PyObject *__pyx_v_self, PyObject *__py
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
     __pyx_v_file = ((struct __pyx_obj_5adios_file *)values[0]);
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.var.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_file), __pyx_ptype_5adios_file, 1, "file", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_file), __pyx_ptype_5adios_file, 1, "file", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_5adios_3var___init__(((struct __pyx_obj_5adios_var *)__pyx_v_self), __pyx_v_file, __pyx_v_name);
 
   /* function exit code */
@@ -8663,13 +11704,17 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
   int __pyx_t_2;
   int __pyx_t_3;
   PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  size_t __pyx_t_7;
+  struct __pyx_opt_args_5adios_adios2npdtype __pyx_t_8;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "adios.pyx":587
- *     """ Initialization. Call adios_inq_var and populate public members """
+  /* "adios.pyx":855
+ * 
  *     def __init__(self, file file, char * name):
  *         self.file = file             # <<<<<<<<<<<<<<
  *         self.vp = NULL
@@ -8681,7 +11726,7 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
   __Pyx_DECREF(((PyObject *)__pyx_v_self->file));
   __pyx_v_self->file = __pyx_v_file;
 
-  /* "adios.pyx":588
+  /* "adios.pyx":856
  *     def __init__(self, file file, char * name):
  *         self.file = file
  *         self.vp = NULL             # <<<<<<<<<<<<<<
@@ -8690,7 +11735,7 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
  */
   __pyx_v_self->vp = NULL;
 
-  /* "adios.pyx":590
+  /* "adios.pyx":858
  *         self.vp = NULL
  * 
  *         assert self.file.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
@@ -8701,12 +11746,12 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
   if (unlikely(!Py_OptimizeFlag)) {
     if (unlikely(!((__pyx_v_self->file->fp != NULL) != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 590; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios.pyx":591
+  /* "adios.pyx":859
  * 
  *         assert self.file.fp != NULL, 'Not an open file'
  *         self.vp = adios_inq_var(self.file.fp, name)             # <<<<<<<<<<<<<<
@@ -8715,7 +11760,7 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
  */
   __pyx_v_self->vp = adios_inq_var(__pyx_v_self->file->fp, __pyx_v_name);
 
-  /* "adios.pyx":592
+  /* "adios.pyx":860
  *         assert self.file.fp != NULL, 'Not an open file'
  *         self.vp = adios_inq_var(self.file.fp, name)
  *         assert self.vp != NULL, 'Not a valid var'             # <<<<<<<<<<<<<<
@@ -8726,19 +11771,19 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
   if (unlikely(!Py_OptimizeFlag)) {
     if (unlikely(!((__pyx_v_self->vp != NULL) != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_a_valid_var);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios.pyx":594
+  /* "adios.pyx":862
  *         assert self.vp != NULL, 'Not a valid var'
  * 
  *         self.name = name             # <<<<<<<<<<<<<<
  *         self.varid = self.vp.varid
- *         self.type = adios2nptype(self.vp.type)
+ *         self.ndim = self.vp.ndim
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __Pyx_GOTREF(__pyx_v_self->name);
@@ -8746,34 +11791,19 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
   __pyx_v_self->name = ((PyObject*)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "adios.pyx":595
+  /* "adios.pyx":863
  * 
  *         self.name = name
  *         self.varid = self.vp.varid             # <<<<<<<<<<<<<<
- *         self.type = adios2nptype(self.vp.type)
  *         self.ndim = self.vp.ndim
+ *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
  */
   __pyx_t_2 = __pyx_v_self->vp->varid;
   __pyx_v_self->varid = __pyx_t_2;
 
-  /* "adios.pyx":596
+  /* "adios.pyx":864
  *         self.name = name
  *         self.varid = self.vp.varid
- *         self.type = adios2nptype(self.vp.type)             # <<<<<<<<<<<<<<
- *         self.ndim = self.vp.ndim
- *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
- */
-  __pyx_t_1 = ((PyObject *)__pyx_f_5adios_adios2nptype(__pyx_v_self->vp->type)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->type);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->type));
-  __pyx_v_self->type = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
-
-  /* "adios.pyx":597
- *         self.varid = self.vp.varid
- *         self.type = adios2nptype(self.vp.type)
  *         self.ndim = self.vp.ndim             # <<<<<<<<<<<<<<
  *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
  *         self.nsteps = self.vp.nsteps
@@ -8781,24 +11811,24 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
   __pyx_t_2 = __pyx_v_self->vp->ndim;
   __pyx_v_self->ndim = __pyx_t_2;
 
-  /* "adios.pyx":598
- *         self.type = adios2nptype(self.vp.type)
+  /* "adios.pyx":865
+ *         self.varid = self.vp.varid
  *         self.ndim = self.vp.ndim
  *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])             # <<<<<<<<<<<<<<
  *         self.nsteps = self.vp.nsteps
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __pyx_v_self->vp->ndim;
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
-    __pyx_t_4 = __Pyx_PyInt_From_uint64_t((__pyx_v_self->vp->dims[__pyx_v_i])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_From_uint64_t((__pyx_v_self->vp->dims[__pyx_v_i])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
-  __pyx_t_4 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_4);
@@ -8807,19 +11837,78 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
   __pyx_v_self->dims = ((PyObject*)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "adios.pyx":599
+  /* "adios.pyx":866
  *         self.ndim = self.vp.ndim
  *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
  *         self.nsteps = self.vp.nsteps             # <<<<<<<<<<<<<<
  * 
- *     def __del__(self):
+ *         if self.vp.type == DATATYPE.string:
  */
   __pyx_t_2 = __pyx_v_self->vp->nsteps;
   __pyx_v_self->nsteps = __pyx_t_2;
 
-  /* "adios.pyx":586
+  /* "adios.pyx":868
+ *         self.nsteps = self.vp.nsteps
+ * 
+ *         if self.vp.type == DATATYPE.string:             # <<<<<<<<<<<<<<
+ *             self.dtype = adios2npdtype(self.vp.type, len(<char*> self.vp.value))
+ *         else:
+ */
+  __pyx_t_4 = PyInt_FromLong(__pyx_v_self->vp->type); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_string); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_6) {
+
+    /* "adios.pyx":869
+ * 
+ *         if self.vp.type == DATATYPE.string:
+ *             self.dtype = adios2npdtype(self.vp.type, len(<char*> self.vp.value))             # <<<<<<<<<<<<<<
+ *         else:
+ *             self.dtype = adios2npdtype(self.vp.type)
+ */
+    __pyx_t_7 = strlen(((char *)__pyx_v_self->vp->value)); 
+    __pyx_t_8.__pyx_n = 1;
+    __pyx_t_8.strlen = __pyx_t_7;
+    __pyx_t_1 = ((PyObject *)__pyx_f_5adios_adios2npdtype(__pyx_v_self->vp->type, 0, &__pyx_t_8)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __Pyx_GOTREF(__pyx_v_self->dtype);
+    __Pyx_DECREF(((PyObject *)__pyx_v_self->dtype));
+    __pyx_v_self->dtype = ((PyArray_Descr *)__pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L5;
+  }
+  /*else*/ {
+
+    /* "adios.pyx":871
+ *             self.dtype = adios2npdtype(self.vp.type, len(<char*> self.vp.value))
+ *         else:
+ *             self.dtype = adios2npdtype(self.vp.type)             # <<<<<<<<<<<<<<
+ * 
+ *     def __del__(self):
+ */
+    __pyx_t_1 = ((PyObject *)__pyx_f_5adios_adios2npdtype(__pyx_v_self->vp->type, 0, NULL)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __Pyx_GOTREF(__pyx_v_self->dtype);
+    __Pyx_DECREF(((PyObject *)__pyx_v_self->dtype));
+    __pyx_v_self->dtype = ((PyArray_Descr *)__pyx_t_1);
+    __pyx_t_1 = 0;
+  }
+  __pyx_L5:;
+
+  /* "adios.pyx":854
+ *             return self.nsteps
  * 
- *     """ Initialization. Call adios_inq_var and populate public members """
  *     def __init__(self, file file, char * name):             # <<<<<<<<<<<<<<
  *         self.file = file
  *         self.vp = NULL
@@ -8831,6 +11920,7 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
   __Pyx_AddTraceback("adios.var.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
@@ -8838,8 +11928,8 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
   return __pyx_r;
 }
 
-/* "adios.pyx":601
- *         self.nsteps = self.vp.nsteps
+/* "adios.pyx":873
+ *             self.dtype = adios2npdtype(self.vp.type)
  * 
  *     def __del__(self):             # <<<<<<<<<<<<<<
  *         self.close()
@@ -8848,6 +11938,7 @@ static int __pyx_pf_5adios_3var___init__(struct __pyx_obj_5adios_var *__pyx_v_se
 
 /* Python wrapper */
 static PyObject *__pyx_pw_5adios_3var_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_5adios_3var_2__del__[] = "var.__del__(self)";
 static PyObject *__pyx_pw_5adios_3var_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
@@ -8868,19 +11959,19 @@ static PyObject *__pyx_pf_5adios_3var_2__del__(struct __pyx_obj_5adios_var *__py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__del__", 0);
 
-  /* "adios.pyx":602
+  /* "adios.pyx":874
  * 
  *     def __del__(self):
  *         self.close()             # <<<<<<<<<<<<<<
  * 
- *     """ Call adios_free_varinfo """
+ *     cpdef close(self):
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_5adios_var *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_5adios_var *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":601
- *         self.nsteps = self.vp.nsteps
+  /* "adios.pyx":873
+ *             self.dtype = adios2npdtype(self.vp.type)
  * 
  *     def __del__(self):             # <<<<<<<<<<<<<<
  *         self.close()
@@ -8900,12 +11991,12 @@ static PyObject *__pyx_pf_5adios_3var_2__del__(struct __pyx_obj_5adios_var *__py
   return __pyx_r;
 }
 
-/* "adios.pyx":605
+/* "adios.pyx":876
+ *         self.close()
  * 
- *     """ Call adios_free_varinfo """
  *     cpdef close(self):             # <<<<<<<<<<<<<<
+ *         """ Close and free variable information """
  *         assert self.vp != NULL, 'Not an open var'
- *         adios_free_varinfo(self.vp)
  */
 
 static PyObject *__pyx_pw_5adios_3var_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
@@ -8924,7 +12015,7 @@ static PyObject *__pyx_f_5adios_3var_close(struct __pyx_obj_5adios_var *__pyx_v_
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overridden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_3var_5close)) {
       __Pyx_XDECREF(__pyx_r);
@@ -8940,10 +12031,10 @@ static PyObject *__pyx_f_5adios_3var_close(struct __pyx_obj_5adios_var *__pyx_v_
         }
       }
       if (__pyx_t_4) {
-        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       } else {
-        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -8955,9 +12046,9 @@ static PyObject *__pyx_f_5adios_3var_close(struct __pyx_obj_5adios_var *__pyx_v_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "adios.pyx":606
- *     """ Call adios_free_varinfo """
+  /* "adios.pyx":878
  *     cpdef close(self):
+ *         """ Close and free variable information """
  *         assert self.vp != NULL, 'Not an open var'             # <<<<<<<<<<<<<<
  *         adios_free_varinfo(self.vp)
  *         self.vp = NULL
@@ -8966,13 +12057,13 @@ static PyObject *__pyx_f_5adios_3var_close(struct __pyx_obj_5adios_var *__pyx_v_
   if (unlikely(!Py_OptimizeFlag)) {
     if (unlikely(!((__pyx_v_self->vp != NULL) != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_var);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios.pyx":607
- *     cpdef close(self):
+  /* "adios.pyx":879
+ *         """ Close and free variable information """
  *         assert self.vp != NULL, 'Not an open var'
  *         adios_free_varinfo(self.vp)             # <<<<<<<<<<<<<<
  *         self.vp = NULL
@@ -8980,21 +12071,21 @@ static PyObject *__pyx_f_5adios_3var_close(struct __pyx_obj_5adios_var *__pyx_v_
  */
   adios_free_varinfo(__pyx_v_self->vp);
 
-  /* "adios.pyx":608
+  /* "adios.pyx":880
  *         assert self.vp != NULL, 'Not an open var'
  *         adios_free_varinfo(self.vp)
  *         self.vp = NULL             # <<<<<<<<<<<<<<
  * 
- *     """ Call adios_schedule_read and adios_perform_reads """
+ *     cpdef advance(self):
  */
   __pyx_v_self->vp = NULL;
 
-  /* "adios.pyx":605
+  /* "adios.pyx":876
+ *         self.close()
  * 
- *     """ Call adios_free_varinfo """
  *     cpdef close(self):             # <<<<<<<<<<<<<<
+ *         """ Close and free variable information """
  *         assert self.vp != NULL, 'Not an open var'
- *         adios_free_varinfo(self.vp)
  */
 
   /* function exit code */
@@ -9015,6 +12106,7 @@ static PyObject *__pyx_f_5adios_3var_close(struct __pyx_obj_5adios_var *__pyx_v_
 
 /* Python wrapper */
 static PyObject *__pyx_pw_5adios_3var_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_5adios_3var_4close[] = "var.close(self)\n Close and free variable information ";
 static PyObject *__pyx_pw_5adios_3var_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
@@ -9035,7 +12127,7 @@ static PyObject *__pyx_pf_5adios_3var_4close(struct __pyx_obj_5adios_var *__pyx_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("close", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_5adios_3var_close(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_5adios_3var_close(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -9052,20 +12144,178 @@ static PyObject *__pyx_pf_5adios_3var_4close(struct __pyx_obj_5adios_var *__pyx_
   return __pyx_r;
 }
 
-/* "adios.pyx":611
+/* "adios.pyx":882
+ *         self.vp = NULL
+ * 
+ *     cpdef advance(self):             # <<<<<<<<<<<<<<
+ *         """ Update variable information after the stream advanced """
+ *         self.vp = adios_inq_var(self.file.fp, self.name)
+ */
+
+static PyObject *__pyx_pw_5adios_3var_7advance(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_f_5adios_3var_advance(struct __pyx_obj_5adios_var *__pyx_v_self, int __pyx_skip_dispatch) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  char const *__pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("advance", 0);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_3var_7advance)) {
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_3, function);
+        }
+      }
+      if (__pyx_t_4) {
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      } else {
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_2;
+      __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "adios.pyx":884
+ *     cpdef advance(self):
+ *         """ Update variable information after the stream advanced """
+ *         self.vp = adios_inq_var(self.file.fp, self.name)             # <<<<<<<<<<<<<<
+ *         assert self.vp != NULL, 'Not a valid var'
+ *         self.nsteps = self.vp.nsteps
+ */
+  __pyx_t_5 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_self->vp = adios_inq_var(__pyx_v_self->file->fp, __pyx_t_5);
+
+  /* "adios.pyx":885
+ *         """ Update variable information after the stream advanced """
+ *         self.vp = adios_inq_var(self.file.fp, self.name)
+ *         assert self.vp != NULL, 'Not a valid var'             # <<<<<<<<<<<<<<
+ *         self.nsteps = self.vp.nsteps
+ * 
+ */
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(!Py_OptimizeFlag)) {
+    if (unlikely(!((__pyx_v_self->vp != NULL) != 0))) {
+      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_a_valid_var);
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+  }
+  #endif
+
+  /* "adios.pyx":886
+ *         self.vp = adios_inq_var(self.file.fp, self.name)
+ *         assert self.vp != NULL, 'Not a valid var'
+ *         self.nsteps = self.vp.nsteps             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):
+ */
+  __pyx_t_6 = __pyx_v_self->vp->nsteps;
+  __pyx_v_self->nsteps = __pyx_t_6;
+
+  /* "adios.pyx":882
+ *         self.vp = NULL
+ * 
+ *     cpdef advance(self):             # <<<<<<<<<<<<<<
+ *         """ Update variable information after the stream advanced """
+ *         self.vp = adios_inq_var(self.file.fp, self.name)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios.var.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_3var_7advance(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_5adios_3var_6advance[] = "var.advance(self)\n Update variable information after the stream advanced ";
+static PyObject *__pyx_pw_5adios_3var_7advance(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_3var_6advance(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_3var_6advance(struct __pyx_obj_5adios_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("advance", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_5adios_3var_advance(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.var.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":888
+ *         self.nsteps = self.vp.nsteps
+ * 
+ *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):             # <<<<<<<<<<<<<<
+ *         """ Perform read.
  * 
- *     """ Call adios_schedule_read and adios_perform_reads """
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):             # <<<<<<<<<<<<<<
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):
  */
 
-static PyObject *__pyx_pw_5adios_3var_7read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_9read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_3var_read *__pyx_optional_args) {
   PyObject *__pyx_v_offset = ((PyObject*)__pyx_empty_tuple);
   PyObject *__pyx_v_count = ((PyObject*)__pyx_empty_tuple);
-  PyObject *__pyx_v_from_steps = ((PyObject *)__pyx_int_0);
-  PyObject *__pyx_v_nsteps = ((PyObject *)__pyx_int_1);
+  PyObject *__pyx_v_from_steps = ((PyObject *)Py_None);
+  PyObject *__pyx_v_nsteps = ((PyObject *)Py_None);
+  PyObject *__pyx_v_fill = ((PyObject *)__pyx_int_0);
   PyObject *__pyx_v_lshape = 0;
   PyArrayObject *__pyx_v_npshape = 0;
   PyArrayObject *__pyx_v_npoffset = 0;
@@ -9086,6 +12336,7 @@ static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_s
   int __pyx_t_8;
   int __pyx_t_9;
   int __pyx_t_10;
+  int __pyx_t_11;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -9099,18 +12350,23 @@ static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_s
           __pyx_v_from_steps = __pyx_optional_args->from_steps;
           if (__pyx_optional_args->__pyx_n > 3) {
             __pyx_v_nsteps = __pyx_optional_args->nsteps;
+            if (__pyx_optional_args->__pyx_n > 4) {
+              __pyx_v_fill = __pyx_optional_args->fill;
+            }
           }
         }
       }
     }
   }
+  __Pyx_INCREF(__pyx_v_from_steps);
+  __Pyx_INCREF(__pyx_v_nsteps);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overridden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_3var_7read)) {
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_3var_9read)) {
       __Pyx_XDECREF(__pyx_r);
       __Pyx_INCREF(__pyx_t_1);
       __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
@@ -9125,7 +12381,7 @@ static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_s
           __pyx_t_5 = 1;
         }
       }
-      __pyx_t_6 = PyTuple_New(4+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyTuple_New(5+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       if (__pyx_t_4) {
         PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = NULL;
@@ -9142,7 +12398,10 @@ static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_s
       __Pyx_INCREF(__pyx_v_nsteps);
       PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_5, __pyx_v_nsteps);
       __Pyx_GIVEREF(__pyx_v_nsteps);
-      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_INCREF(__pyx_v_fill);
+      PyTuple_SET_ITEM(__pyx_t_6, 4+__pyx_t_5, __pyx_v_fill);
+      __Pyx_GIVEREF(__pyx_v_fill);
+      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -9154,117 +12413,192 @@ static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "adios.pyx":612
- *     """ Call adios_schedule_read and adios_perform_reads """
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):
- *         assert self.type is not None, 'Data type is not supported yet'             # <<<<<<<<<<<<<<
- *         if (self.nsteps > 0):
- *             assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'
+  /* "adios.pyx":935
+ * 
+ *         """
+ *         if from_steps is None:             # <<<<<<<<<<<<<<
+ *             from_steps = 0 ##self.file.current_step
+ * 
+ */
+  __pyx_t_7 = (__pyx_v_from_steps == Py_None);
+  __pyx_t_8 = (__pyx_t_7 != 0);
+  if (__pyx_t_8) {
+
+    /* "adios.pyx":936
+ *         """
+ *         if from_steps is None:
+ *             from_steps = 0 ##self.file.current_step             # <<<<<<<<<<<<<<
+ * 
+ *         if nsteps is None:
+ */
+    __Pyx_INCREF(__pyx_int_0);
+    __Pyx_DECREF_SET(__pyx_v_from_steps, __pyx_int_0);
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios.pyx":938
+ *             from_steps = 0 ##self.file.current_step
+ * 
+ *         if nsteps is None:             # <<<<<<<<<<<<<<
+ *             nsteps = self.file.last_step - from_steps + 1
+ * 
+ */
+  __pyx_t_8 = (__pyx_v_nsteps == Py_None);
+  __pyx_t_7 = (__pyx_t_8 != 0);
+  if (__pyx_t_7) {
+
+    /* "adios.pyx":939
+ * 
+ *         if nsteps is None:
+ *             nsteps = self.file.last_step - from_steps + 1             # <<<<<<<<<<<<<<
+ * 
+ *         assert self.dtype is not None, 'Data type is not supported yet'
+ */
+    __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->file->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_v_from_steps); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF_SET(__pyx_v_nsteps, __pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L4;
+  }
+  __pyx_L4:;
+
+  /* "adios.pyx":941
+ *             nsteps = self.file.last_step - from_steps + 1
+ * 
+ *         assert self.dtype is not None, 'Data type is not supported yet'             # <<<<<<<<<<<<<<
+ *         if (self.nsteps > 0) and (from_steps + nsteps > self.nsteps):
+ *             raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))
  */
   #ifndef CYTHON_WITHOUT_ASSERTIONS
   if (unlikely(!Py_OptimizeFlag)) {
-    __pyx_t_7 = (__pyx_v_self->type != ((PyObject*)Py_None));
+    __pyx_t_7 = (((PyObject *)__pyx_v_self->dtype) != Py_None);
     if (unlikely(!(__pyx_t_7 != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Data_type_is_not_supported_yet);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 941; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios.pyx":613
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):             # <<<<<<<<<<<<<<
- *             assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'
+  /* "adios.pyx":942
+ * 
+ *         assert self.dtype is not None, 'Data type is not supported yet'
+ *         if (self.nsteps > 0) and (from_steps + nsteps > self.nsteps):             # <<<<<<<<<<<<<<
+ *             raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))
  * 
  */
-  __pyx_t_7 = ((__pyx_v_self->nsteps > 0) != 0);
+  __pyx_t_8 = ((__pyx_v_self->nsteps > 0) != 0);
+  if (__pyx_t_8) {
+  } else {
+    __pyx_t_7 = __pyx_t_8;
+    goto __pyx_L6_bool_binop_done;
+  }
+  __pyx_t_1 = PyNumber_Add(__pyx_v_from_steps, __pyx_v_nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_7 = __pyx_t_8;
+  __pyx_L6_bool_binop_done:;
   if (__pyx_t_7) {
 
-    /* "adios.pyx":614
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):
- *             assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'             # <<<<<<<<<<<<<<
+    /* "adios.pyx":943
+ *         assert self.dtype is not None, 'Data type is not supported yet'
+ *         if (self.nsteps > 0) and (from_steps + nsteps > self.nsteps):
+ *             raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))             # <<<<<<<<<<<<<<
  * 
  *         cdef list lshape = [self.vp.dims[i] for i in range(self.vp.ndim)]
  */
-    #ifndef CYTHON_WITHOUT_ASSERTIONS
-    if (unlikely(!Py_OptimizeFlag)) {
-      __pyx_t_1 = PyNumber_Add(__pyx_v_from_steps, __pyx_v_nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (unlikely(!__pyx_t_7)) {
-        PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Step_index_is_out_of_range);
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-    }
-    #endif
-    goto __pyx_L3;
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(__pyx_v_from_steps);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_steps);
+    __Pyx_GIVEREF(__pyx_v_from_steps);
+    __Pyx_INCREF(__pyx_v_nsteps);
+    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_nsteps);
+    __Pyx_GIVEREF(__pyx_v_nsteps);
+    __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_Step_index_is_out_of_range_from, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L3:;
 
-  /* "adios.pyx":616
- *             assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'
+  /* "adios.pyx":945
+ *             raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))
  * 
  *         cdef list lshape = [self.vp.dims[i] for i in range(self.vp.ndim)]             # <<<<<<<<<<<<<<
  *         cdef np.ndarray npshape = np.array(lshape, dtype=np.int64)
  * 
  */
-  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_8 = __pyx_v_self->vp->ndim;
-  for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
-    __pyx_v_i = __pyx_t_9;
-    __pyx_t_2 = __Pyx_PyInt_From_uint64_t((__pyx_v_self->vp->dims[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __pyx_v_self->vp->ndim;
+  for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
+    __pyx_v_i = __pyx_t_10;
+    __pyx_t_3 = __Pyx_PyInt_From_uint64_t((__pyx_v_self->vp->dims[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
-  __pyx_v_lshape = ((PyObject*)__pyx_t_3);
-  __pyx_t_3 = 0;
+  __pyx_v_lshape = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
 
-  /* "adios.pyx":617
+  /* "adios.pyx":946
  * 
  *         cdef list lshape = [self.vp.dims[i] for i in range(self.vp.ndim)]
  *         cdef np.ndarray npshape = np.array(lshape, dtype=np.int64)             # <<<<<<<<<<<<<<
  * 
  *         cdef np.ndarray npoffset
  */
-  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_lshape);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_lshape);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_lshape);
   __Pyx_GIVEREF(__pyx_v_lshape);
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_int64); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_int64); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_npshape = ((PyArrayObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "adios.pyx":620
+  /* "adios.pyx":949
  * 
  *         cdef np.ndarray npoffset
  *         if len(offset) == 0:             # <<<<<<<<<<<<<<
@@ -9273,98 +12607,98 @@ static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_s
  */
   if (unlikely(__pyx_v_offset == Py_None)) {
     PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_t_5 = PyTuple_GET_SIZE(__pyx_v_offset); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyTuple_GET_SIZE(__pyx_v_offset); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_7 = ((__pyx_t_5 == 0) != 0);
   if (__pyx_t_7) {
 
-    /* "adios.pyx":621
+    /* "adios.pyx":950
  *         cdef np.ndarray npoffset
  *         if len(offset) == 0:
  *             npoffset = npshape.copy()             # <<<<<<<<<<<<<<
  *             npoffset.fill(0)
  *         else:
  */
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_npshape), __pyx_n_s_copy); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 621; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_npshape), __pyx_n_s_copy); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_3 = NULL;
+    __pyx_t_2 = NULL;
     if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
-      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
-      if (likely(__pyx_t_3)) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+      if (likely(__pyx_t_2)) {
         PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
-        __Pyx_INCREF(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_2);
         __Pyx_INCREF(function);
         __Pyx_DECREF_SET(__pyx_t_1, function);
       }
     }
-    if (__pyx_t_3) {
-      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 621; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (__pyx_t_2) {
+      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     } else {
-      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 621; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 621; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_npoffset = ((PyArrayObject *)__pyx_t_4);
     __pyx_t_4 = 0;
 
-    /* "adios.pyx":622
+    /* "adios.pyx":951
  *         if len(offset) == 0:
  *             npoffset = npshape.copy()
  *             npoffset.fill(0)             # <<<<<<<<<<<<<<
  *         else:
  *             npoffset = np.array(offset, dtype=np.int64)
  */
-    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_npoffset), __pyx_n_s_fill); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_npoffset), __pyx_n_s_fill); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L10;
   }
   /*else*/ {
 
-    /* "adios.pyx":624
+    /* "adios.pyx":953
  *             npoffset.fill(0)
  *         else:
  *             npoffset = np.array(offset, dtype=np.int64)             # <<<<<<<<<<<<<<
  * 
  *         cdef np.ndarray npcount
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_offset);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_offset);
     __Pyx_GIVEREF(__pyx_v_offset);
-    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_int64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_npoffset = ((PyArrayObject *)__pyx_t_6);
     __pyx_t_6 = 0;
   }
-  __pyx_L6:;
+  __pyx_L10:;
 
-  /* "adios.pyx":627
+  /* "adios.pyx":956
  * 
  *         cdef np.ndarray npcount
  *         if len(count) == 0:             # <<<<<<<<<<<<<<
@@ -9373,258 +12707,350 @@ static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_s
  */
   if (unlikely(__pyx_v_count == Py_None)) {
     PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_t_5 = PyTuple_GET_SIZE(__pyx_v_count); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyTuple_GET_SIZE(__pyx_v_count); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_7 = ((__pyx_t_5 == 0) != 0);
   if (__pyx_t_7) {
 
-    /* "adios.pyx":628
+    /* "adios.pyx":957
  *         cdef np.ndarray npcount
  *         if len(count) == 0:
  *             npcount = npshape - npoffset             # <<<<<<<<<<<<<<
  *         else:
  *             npcount = np.array(count, dtype=np.int64)
  */
-    __pyx_t_6 = PyNumber_Subtract(((PyObject *)__pyx_v_npshape), ((PyObject *)__pyx_v_npoffset)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Subtract(((PyObject *)__pyx_v_npshape), ((PyObject *)__pyx_v_npoffset)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_npcount = ((PyArrayObject *)__pyx_t_6);
     __pyx_t_6 = 0;
-    goto __pyx_L7;
+    goto __pyx_L11;
   }
   /*else*/ {
 
-    /* "adios.pyx":630
+    /* "adios.pyx":959
  *             npcount = npshape - npoffset
  *         else:
  *             npcount = np.array(count, dtype=np.int64)             # <<<<<<<<<<<<<<
  * 
- *         assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'
+ *         if npshape.ndim != npoffset.ndim:
  */
-    __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_INCREF(__pyx_v_count);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_count);
     __Pyx_GIVEREF(__pyx_v_count);
-    __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int64); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int64); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_npcount = ((PyArrayObject *)__pyx_t_2);
-    __pyx_t_2 = 0;
+    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_npcount = ((PyArrayObject *)__pyx_t_3);
+    __pyx_t_3 = 0;
   }
-  __pyx_L7:;
+  __pyx_L11:;
 
-  /* "adios.pyx":632
+  /* "adios.pyx":961
  *             npcount = np.array(count, dtype=np.int64)
  * 
- *         assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'             # <<<<<<<<<<<<<<
- *         assert npshape.ndim == npcount.ndim, 'Count dimension mismatch.'
- *         assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'
+ *         if npshape.ndim != npoffset.ndim:             # <<<<<<<<<<<<<<
+ *             raise IndexError('Offset dimension mismatch (offset dim: %r)' % (npoffset.ndim))
+ * 
  */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_npshape->nd == __pyx_v_npoffset->nd) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Offset_dimension_mismatch);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-  }
-  #endif
+  __pyx_t_7 = ((__pyx_v_npshape->nd != __pyx_v_npoffset->nd) != 0);
+  if (__pyx_t_7) {
 
-  /* "adios.pyx":633
+    /* "adios.pyx":962
  * 
- *         assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'
- *         assert npshape.ndim == npcount.ndim, 'Count dimension mismatch.'             # <<<<<<<<<<<<<<
- *         assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'
+ *         if npshape.ndim != npoffset.ndim:
+ *             raise IndexError('Offset dimension mismatch (offset dim: %r)' % (npoffset.ndim))             # <<<<<<<<<<<<<<
  * 
+ *         if npshape.ndim != npcount.ndim:
  */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_npshape->nd == __pyx_v_npcount->nd) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Count_dimension_mismatch);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
+    __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_npoffset->nd); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Offset_dimension_mismatch_offset, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  #endif
 
-  /* "adios.pyx":634
- *         assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'
- *         assert npshape.ndim == npcount.ndim, 'Count dimension mismatch.'
- *         assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'             # <<<<<<<<<<<<<<
+  /* "adios.pyx":964
+ *             raise IndexError('Offset dimension mismatch (offset dim: %r)' % (npoffset.ndim))
+ * 
+ *         if npshape.ndim != npcount.ndim:             # <<<<<<<<<<<<<<
+ *             raise IndexError('Count dimension mismatch (count dim: %r)' % (npcount.ndim))
  * 
- *         shape = list(npcount)
  */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    __pyx_t_1 = PyNumber_Subtract(((PyObject *)__pyx_v_npshape), ((PyObject *)__pyx_v_npoffset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = ((__pyx_v_npshape->nd != __pyx_v_npcount->nd) != 0);
+  if (__pyx_t_7) {
+
+    /* "adios.pyx":965
+ * 
+ *         if npshape.ndim != npcount.ndim:
+ *             raise IndexError('Count dimension mismatch (count dim: %r)' % (npcount.ndim))             # <<<<<<<<<<<<<<
+ * 
+ *         if (npshape < npcount + npoffset).any():
+ */
+    __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_npcount->nd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_1, ((PyObject *)__pyx_v_npcount), Py_GE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_Count_dimension_mismatch_count_d, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_all); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = NULL;
-    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
-      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
-      if (likely(__pyx_t_6)) {
-        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
-        __Pyx_INCREF(__pyx_t_6);
-        __Pyx_INCREF(function);
-        __Pyx_DECREF_SET(__pyx_t_1, function);
-      }
-    }
-    if (__pyx_t_6) {
-      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    } else {
-      __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-    __Pyx_GOTREF(__pyx_t_2);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_3);
+    __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (unlikely(!__pyx_t_7)) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Count_is_larger_than_shape);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "adios.pyx":967
+ *             raise IndexError('Count dimension mismatch (count dim: %r)' % (npcount.ndim))
+ * 
+ *         if (npshape < npcount + npoffset).any():             # <<<<<<<<<<<<<<
+ *             raise IndexError('Requested is larger than the shape.')
+ * 
+ */
+  __pyx_t_1 = PyNumber_Add(((PyObject *)__pyx_v_npcount), ((PyObject *)__pyx_v_npoffset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_6 = PyObject_RichCompare(((PyObject *)__pyx_v_npshape), __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_any); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_6)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
     }
   }
-  #endif
+  if (__pyx_t_6) {
+    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  } else {
+    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (__pyx_t_7) {
+
+    /* "adios.pyx":968
+ * 
+ *         if (npshape < npcount + npoffset).any():
+ *             raise IndexError('Requested is larger than the shape.')             # <<<<<<<<<<<<<<
+ * 
+ *         shape = list(npcount)
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
 
-  /* "adios.pyx":636
- *         assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'
+  /* "adios.pyx":970
+ *             raise IndexError('Requested is larger than the shape.')
  * 
  *         shape = list(npcount)             # <<<<<<<<<<<<<<
  *         if (nsteps > 1):
  *             shape.insert(0, nsteps)
  */
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_v_npcount));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_npcount));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_npcount));
-  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyList_Type))), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_v_shape = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+  __pyx_t_3 = PySequence_List(((PyObject *)__pyx_v_npcount)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_shape = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-  /* "adios.pyx":637
+  /* "adios.pyx":971
  * 
  *         shape = list(npcount)
  *         if (nsteps > 1):             # <<<<<<<<<<<<<<
  *             shape.insert(0, nsteps)
- *         cdef np.ndarray var = np.zeros(shape, dtype=self.type)
+ *         cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_nsteps, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_nsteps, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (__pyx_t_7) {
 
-    /* "adios.pyx":638
+    /* "adios.pyx":972
  *         shape = list(npcount)
  *         if (nsteps > 1):
  *             shape.insert(0, nsteps)             # <<<<<<<<<<<<<<
- *         cdef np.ndarray var = np.zeros(shape, dtype=self.type)
+ *         cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)
  * 
  */
-    __pyx_t_10 = PyList_Insert(__pyx_v_shape, 0, __pyx_v_nsteps); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L8;
+    __pyx_t_11 = PyList_Insert(__pyx_v_shape, 0, __pyx_v_nsteps); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L15;
   }
-  __pyx_L8:;
+  __pyx_L15:;
 
-  /* "adios.pyx":639
+  /* "adios.pyx":973
  *         if (nsteps > 1):
  *             shape.insert(0, nsteps)
- *         cdef np.ndarray var = np.zeros(shape, dtype=self.type)             # <<<<<<<<<<<<<<
+ *         cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)             # <<<<<<<<<<<<<<
  * 
- *         cdef ADIOS_SELECTION * sel
+ *         if len(shape) > 0:
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_v_shape);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_shape);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_shape);
   __Pyx_GIVEREF(__pyx_v_shape);
-  __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, ((PyObject *)__pyx_v_self->type)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, ((PyObject *)__pyx_v_self->dtype)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_var = ((PyArrayObject *)__pyx_t_3);
-  __pyx_t_3 = 0;
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_var = ((PyArrayObject *)__pyx_t_2);
+  __pyx_t_2 = 0;
 
-  /* "adios.pyx":642
+  /* "adios.pyx":975
+ *         cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)
+ * 
+ *         if len(shape) > 0:             # <<<<<<<<<<<<<<
+ *             var[:] = fill
+ * 
+ */
+  __pyx_t_5 = PyList_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = ((__pyx_t_5 > 0) != 0);
+  if (__pyx_t_7) {
+
+    /* "adios.pyx":976
+ * 
+ *         if len(shape) > 0:
+ *             var[:] = fill             # <<<<<<<<<<<<<<
+ * 
+ *         cdef ADIOS_SELECTION * sel
+ */
+    if (__Pyx_PyObject_SetSlice(((PyObject *)__pyx_v_var), __pyx_v_fill, 0, 0, NULL, NULL, &__pyx_slice__16, 0, 0, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L16;
+  }
+  __pyx_L16:;
+
+  /* "adios.pyx":979
  * 
  *         cdef ADIOS_SELECTION * sel
  *         sel = adios_selection_boundingbox (self.vp.ndim, <uint64_t *> npoffset.data, <uint64_t *> npcount.data)             # <<<<<<<<<<<<<<
  * 
- *         adios_schedule_read_byid (self.file.fp, sel, self.vp.varid, from_steps, nsteps, <void *> var.data)
+ *         ##print 'npoffset', npoffset
  */
   __pyx_v_sel = adios_selection_boundingbox(__pyx_v_self->vp->ndim, ((uint64_t *)__pyx_v_npoffset->data), ((uint64_t *)__pyx_v_npcount->data));
 
-  /* "adios.pyx":644
- *         sel = adios_selection_boundingbox (self.vp.ndim, <uint64_t *> npoffset.data, <uint64_t *> npcount.data)
+  /* "adios.pyx":984
+ *         ##print 'npcount', npcount
  * 
  *         adios_schedule_read_byid (self.file.fp, sel, self.vp.varid, from_steps, nsteps, <void *> var.data)             # <<<<<<<<<<<<<<
  *         adios_perform_reads(self.file.fp, 1)
  * 
  */
-  __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_v_from_steps); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_nsteps); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  adios_schedule_read_byid(__pyx_v_self->file->fp, __pyx_v_sel, __pyx_v_self->vp->varid, __pyx_t_8, __pyx_t_9, ((void *)__pyx_v_var->data));
+  __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_from_steps); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_v_nsteps); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  adios_schedule_read_byid(__pyx_v_self->file->fp, __pyx_v_sel, __pyx_v_self->vp->varid, __pyx_t_9, __pyx_t_10, ((void *)__pyx_v_var->data));
 
-  /* "adios.pyx":645
+  /* "adios.pyx":985
  * 
  *         adios_schedule_read_byid (self.file.fp, sel, self.vp.varid, from_steps, nsteps, <void *> var.data)
  *         adios_perform_reads(self.file.fp, 1)             # <<<<<<<<<<<<<<
  * 
- *         return var
+ *         ## Try not to return as scalar to be consistent
  */
   adios_perform_reads(__pyx_v_self->file->fp, 1);
 
-  /* "adios.pyx":647
- *         adios_perform_reads(self.file.fp, 1)
- * 
- *         return var             # <<<<<<<<<<<<<<
+  /* "adios.pyx":992
+ *         ##else:
+ *         ##    return var
+ *         return np.squeeze(var)             # <<<<<<<<<<<<<<
  * 
- *     """ Print self """
+ *     cpdef printself(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_var));
-  __pyx_r = ((PyObject *)__pyx_v_var);
+  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_squeeze); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_6)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+    }
+  }
+  if (!__pyx_t_6) {
+    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, ((PyObject *)__pyx_v_var)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+  } else {
+    __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
+    __Pyx_INCREF(((PyObject *)__pyx_v_var));
+    PyTuple_SET_ITEM(__pyx_t_1, 0+1, ((PyObject *)__pyx_v_var));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_var));
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
   goto __pyx_L0;
 
-  /* "adios.pyx":611
+  /* "adios.pyx":888
+ *         self.nsteps = self.vp.nsteps
+ * 
+ *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):             # <<<<<<<<<<<<<<
+ *         """ Perform read.
  * 
- *     """ Call adios_schedule_read and adios_perform_reads """
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):             # <<<<<<<<<<<<<<
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):
  */
 
   /* function exit code */
@@ -9643,18 +13069,22 @@ static PyObject *__pyx_f_5adios_3var_read(struct __pyx_obj_5adios_var *__pyx_v_s
   __Pyx_XDECREF((PyObject *)__pyx_v_npcount);
   __Pyx_XDECREF(__pyx_v_shape);
   __Pyx_XDECREF((PyObject *)__pyx_v_var);
+  __Pyx_XDECREF(__pyx_v_from_steps);
+  __Pyx_XDECREF(__pyx_v_nsteps);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_3var_7read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_5adios_3var_7read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_5adios_3var_9read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_3var_8read[] = "var.read(self, tuple offset=(), tuple count=(), from_steps=None, nsteps=None, fill=0)\n Perform read.\n\n        Read data from an ADIOS BP file. Subset reading is\n        supported. Without any options, this will read out a whole\n        data.\n\n        Args:\n            offset (tuple of int, optional): offset (default: ())\n            count (tuple of int, optional): count (default: ())\n            from_steps (int, optional): starting s [...]
+static PyObject *__pyx_pw_5adios_3var_9read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_offset = 0;
   PyObject *__pyx_v_count = 0;
   PyObject *__pyx_v_from_steps = 0;
   PyObject *__pyx_v_nsteps = 0;
+  PyObject *__pyx_v_fill = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -9662,16 +13092,18 @@ static PyObject *__pyx_pw_5adios_3var_7read(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_offset,&__pyx_n_s_count,&__pyx_n_s_from_steps,&__pyx_n_s_nsteps,0};
-    PyObject* values[4] = {0,0,0,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_offset,&__pyx_n_s_count,&__pyx_n_s_from_steps,&__pyx_n_s_nsteps,&__pyx_n_s_fill,0};
+    PyObject* values[5] = {0,0,0,0,0};
     values[0] = ((PyObject*)__pyx_empty_tuple);
     values[1] = ((PyObject*)__pyx_empty_tuple);
-    values[2] = ((PyObject *)__pyx_int_0);
-    values[3] = ((PyObject *)__pyx_int_1);
+    values[2] = ((PyObject *)Py_None);
+    values[3] = ((PyObject *)Py_None);
+    values[4] = ((PyObject *)__pyx_int_0);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
       switch (pos_args) {
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -9701,12 +13133,18 @@ static PyObject *__pyx_pw_5adios_3var_7read(PyObject *__pyx_v_self, PyObject *__
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_nsteps);
           if (value) { values[3] = value; kw_args--; }
         }
+        case  4:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fill);
+          if (value) { values[4] = value; kw_args--; }
+        }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -9719,18 +13157,19 @@ static PyObject *__pyx_pw_5adios_3var_7read(PyObject *__pyx_v_self, PyObject *__
     __pyx_v_count = ((PyObject*)values[1]);
     __pyx_v_from_steps = values[2];
     __pyx_v_nsteps = values[3];
+    __pyx_v_fill = values[4];
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read", 0, 0, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read", 0, 0, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios.var.read", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_offset), (&PyTuple_Type), 1, "offset", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_count), (&PyTuple_Type), 1, "count", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_5adios_3var_6read(((struct __pyx_obj_5adios_var *)__pyx_v_self), __pyx_v_offset, __pyx_v_count, __pyx_v_from_steps, __pyx_v_nsteps);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_offset), (&PyTuple_Type), 1, "offset", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_count), (&PyTuple_Type), 1, "count", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_5adios_3var_8read(((struct __pyx_obj_5adios_var *)__pyx_v_self), __pyx_v_offset, __pyx_v_count, __pyx_v_from_steps, __pyx_v_nsteps, __pyx_v_fill);
 
   /* function exit code */
   goto __pyx_L0;
@@ -9741,7 +13180,7 @@ static PyObject *__pyx_pw_5adios_3var_7read(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_3var_6read(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_offset, PyObject *__pyx_v_count, PyObject *__pyx_v_from_steps, PyObject *__pyx_v_nsteps) {
+static PyObject *__pyx_pf_5adios_3var_8read(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_offset, PyObject *__pyx_v_count, PyObject *__pyx_v_from_steps, PyObject *__pyx_v_nsteps, PyObject *__pyx_v_fill) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -9751,12 +13190,13 @@ static PyObject *__pyx_pf_5adios_3var_6read(struct __pyx_obj_5adios_var *__pyx_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2.__pyx_n = 4;
+  __pyx_t_2.__pyx_n = 5;
   __pyx_t_2.offset = __pyx_v_offset;
   __pyx_t_2.count = __pyx_v_count;
   __pyx_t_2.from_steps = __pyx_v_from_steps;
   __pyx_t_2.nsteps = __pyx_v_nsteps;
-  __pyx_t_1 = __pyx_vtabptr_5adios_var->read(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2.fill = __pyx_v_fill;
+  __pyx_t_1 = __pyx_vtabptr_5adios_var->read(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -9773,15 +13213,15 @@ static PyObject *__pyx_pf_5adios_3var_6read(struct __pyx_obj_5adios_var *__pyx_v
   return __pyx_r;
 }
 
-/* "adios.pyx":650
+/* "adios.pyx":994
+ *         return np.squeeze(var)
  * 
- *     """ Print self """
  *     cpdef printself(self):             # <<<<<<<<<<<<<<
+ *         """ Print native ADIOS_VARINFO structure. """
  *         assert self.vp != NULL, 'Not an open variable'
- *         print '=== AdiosVariable ==='
  */
 
-static PyObject *__pyx_pw_5adios_3var_9printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_11printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static PyObject *__pyx_f_5adios_3var_printself(struct __pyx_obj_5adios_var *__pyx_v_self, int __pyx_skip_dispatch) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -9797,9 +13237,9 @@ static PyObject *__pyx_f_5adios_3var_printself(struct __pyx_obj_5adios_var *__py
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overridden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_printself); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 650; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_printself); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_3var_9printself)) {
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5adios_3var_11printself)) {
       __Pyx_XDECREF(__pyx_r);
       __Pyx_INCREF(__pyx_t_1);
       __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
@@ -9813,10 +13253,10 @@ static PyObject *__pyx_f_5adios_3var_printself(struct __pyx_obj_5adios_var *__py
         }
       }
       if (__pyx_t_4) {
-        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 650; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       } else {
-        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 650; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -9828,9 +13268,9 @@ static PyObject *__pyx_f_5adios_3var_printself(struct __pyx_obj_5adios_var *__py
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "adios.pyx":651
- *     """ Print self """
+  /* "adios.pyx":996
  *     cpdef printself(self):
+ *         """ Print native ADIOS_VARINFO structure. """
  *         assert self.vp != NULL, 'Not an open variable'             # <<<<<<<<<<<<<<
  *         print '=== AdiosVariable ==='
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
@@ -9839,30 +13279,30 @@ static PyObject *__pyx_f_5adios_3var_printself(struct __pyx_obj_5adios_var *__py
   if (unlikely(!Py_OptimizeFlag)) {
     if (unlikely(!((__pyx_v_self->vp != NULL) != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_variable);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 651; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios.pyx":652
- *     cpdef printself(self):
+  /* "adios.pyx":997
+ *         """ Print native ADIOS_VARINFO structure. """
  *         assert self.vp != NULL, 'Not an open variable'
  *         print '=== AdiosVariable ==='             # <<<<<<<<<<<<<<
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
  *         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)
  */
-  if (__Pyx_PrintOne(0, __pyx_kp_s_AdiosVariable) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_kp_s_AdiosVariable) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":653
+  /* "adios.pyx":998
  *         assert self.vp != NULL, 'Not an open variable'
  *         print '=== AdiosVariable ==='
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)             # <<<<<<<<<<<<<<
  *         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)
  *         printvar(self.vp)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->vp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->vp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_vp);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_vp);
@@ -9870,22 +13310,22 @@ static PyObject *__pyx_f_5adios_3var_printself(struct __pyx_obj_5adios_var *__py
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":654
+  /* "adios.pyx":999
  *         print '=== AdiosVariable ==='
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
  *         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)             # <<<<<<<<<<<<<<
  *         printvar(self.vp)
  * 
  */
-  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->file->fp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->file->fp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_fp);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_fp);
@@ -9893,29 +13333,29 @@ static PyObject *__pyx_f_5adios_3var_printself(struct __pyx_obj_5adios_var *__py
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":655
+  /* "adios.pyx":1000
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
  *         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)
  *         printvar(self.vp)             # <<<<<<<<<<<<<<
  * 
- * ## ====================
+ *     def __repr__(self):
  */
-  __pyx_t_1 = __pyx_f_5adios_printvar(__pyx_v_self->vp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_5adios_printvar(__pyx_v_self->vp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":650
+  /* "adios.pyx":994
+ *         return np.squeeze(var)
  * 
- *     """ Print self """
  *     cpdef printself(self):             # <<<<<<<<<<<<<<
+ *         """ Print native ADIOS_VARINFO structure. """
  *         assert self.vp != NULL, 'Not an open variable'
- *         print '=== AdiosVariable ==='
  */
 
   /* function exit code */
@@ -9935,19 +13375,20 @@ static PyObject *__pyx_f_5adios_3var_printself(struct __pyx_obj_5adios_var *__py
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_3var_9printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_5adios_3var_9printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_5adios_3var_11printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_5adios_3var_10printself[] = "var.printself(self)\n Print native ADIOS_VARINFO structure. ";
+static PyObject *__pyx_pw_5adios_3var_11printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("printself (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_8printself(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+  __pyx_r = __pyx_pf_5adios_3var_10printself(((struct __pyx_obj_5adios_var *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_3var_8printself(struct __pyx_obj_5adios_var *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_3var_10printself(struct __pyx_obj_5adios_var *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -9956,7 +13397,7 @@ static PyObject *__pyx_pf_5adios_3var_8printself(struct __pyx_obj_5adios_var *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("printself", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_5adios_3var_printself(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 650; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_5adios_3var_printself(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -9973,416 +13414,1367 @@ static PyObject *__pyx_pf_5adios_3var_8printself(struct __pyx_obj_5adios_var *__
   return __pyx_r;
 }
 
-/* "adios.pyx":578
+/* "adios.pyx":1002
+ *         printvar(self.vp)
  * 
- *     """ Public Memeber """
- *     cpdef public bytes name             # <<<<<<<<<<<<<<
- *     cpdef public int varid
- *     cpdef public type type
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+ *                (self.varid,
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_3var_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_3var_4name_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_5adios_3var_13__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_13__repr__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4name___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_3var_12__repr__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_3var_4name___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_3var_12__repr__(struct __pyx_obj_5adios_var *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__repr__", 0);
+
+  /* "adios.pyx":1003
+ * 
+ *     def __repr__(self):
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \             # <<<<<<<<<<<<<<
+ *                (self.varid,
+ *                 self.dtype,
+ */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->name);
-  __pyx_r = __pyx_v_self->name;
-  goto __pyx_L0;
 
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":1004
+ *     def __repr__(self):
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+ *                (self.varid,             # <<<<<<<<<<<<<<
+ *                 self.dtype,
+ *                 self.ndim,
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
 
-/* Python wrapper */
-static int __pyx_pw_5adios_3var_4name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_3var_4name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4name_2__set__(((struct __pyx_obj_5adios_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  /* "adios.pyx":1006
+ *                (self.varid,
+ *                 self.dtype,
+ *                 self.ndim,             # <<<<<<<<<<<<<<
+ *                 self.dims,
+ *                 self.nsteps)
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->ndim); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":1008
+ *                 self.ndim,
+ *                 self.dims,
+ *                 self.nsteps)             # <<<<<<<<<<<<<<
+ * 
+ *     def __getitem__(self, index):
+ */
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
 
-static int __pyx_pf_5adios_3var_4name_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyBytes_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
+  /* "adios.pyx":1004
+ *     def __repr__(self):
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+ *                (self.varid,             # <<<<<<<<<<<<<<
+ *                 self.dtype,
+ *                 self.ndim,
+ */
+  __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->name);
-  __Pyx_DECREF(__pyx_v_self->name);
-  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->dtype));
+  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_self->dtype));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->dtype));
+  PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_self->dims);
+  PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_self->dims);
+  __Pyx_GIVEREF(__pyx_v_self->dims);
+  PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_3 = 0;
 
-  /* function exit code */
-  __pyx_r = 0;
+  /* "adios.pyx":1003
+ * 
+ *     def __repr__(self):
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \             # <<<<<<<<<<<<<<
+ *                (self.varid,
+ *                 self.dtype,
+ */
+  __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_AdiosVar_varid_r_dtype_r_ndim_r, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
   goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.var.name.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_5adios_3var_4name_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_5adios_3var_4name_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4name_4__del__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-static int __pyx_pf_5adios_3var_4name_4__del__(struct __pyx_obj_5adios_var *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->name);
-  __Pyx_DECREF(__pyx_v_self->name);
-  __pyx_v_self->name = ((PyObject*)Py_None);
+  /* "adios.pyx":1002
+ *         printvar(self.vp)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+ *                (self.varid,
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios.var.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":579
- *     """ Public Memeber """
- *     cpdef public bytes name
- *     cpdef public int varid             # <<<<<<<<<<<<<<
- *     cpdef public type type
- *     cpdef public int ndim
+/* "adios.pyx":1010
+ *                 self.nsteps)
+ * 
+ *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_3var_5varid_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_3var_5varid_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_5adios_3var_15__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
+static PyObject *__pyx_pw_5adios_3var_15__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_5varid___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_3var_14__getitem__(((struct __pyx_obj_5adios_var *)__pyx_v_self), ((PyObject *)__pyx_v_index));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
+static PyObject *__pyx_gb_5adios_3var_11__getitem___2generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-static PyObject *__pyx_pf_5adios_3var_5varid___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+/* "adios.pyx":1031
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+
+static PyObject *__pyx_pf_5adios_3var_11__getitem___genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *)__pyx_tp_new_5adios___pyx_scope_struct_1_genexpr(__pyx_ptype_5adios___pyx_scope_struct_1_genexpr, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *) __pyx_self;
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_5adios_3var_11__getitem___2generator, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_getitem___locals_genexpr); if (unlikely(!gen)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   /* function exit code */
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.var.varid.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.var.__getitem__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
-  __pyx_L0:;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_5adios_3var_5varid_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_3var_5varid_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_5varid_2__set__(((struct __pyx_obj_5adios_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_5adios_3var_5varid_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+static PyObject *__pyx_gb_5adios_3var_11__getitem___2generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *__pyx_cur_scope = ((struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *(*__pyx_t_4)(PyObject *);
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->varid = __pyx_t_1;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.var.varid.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "adios.pyx":580
- *     cpdef public bytes name
- *     cpdef public int varid
- *     cpdef public type type             # <<<<<<<<<<<<<<
- *     cpdef public int ndim
- *     cpdef public tuple dims
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_5adios_3var_4type_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_3var_4type_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4type___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L6_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_)) { __Pyx_RaiseClosureNameError("index_"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_dims_)) { __Pyx_RaiseClosureNameError("dims_"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_dims_);
+  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_dims_);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_dims_);
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
+    __pyx_t_1 = __pyx_t_2; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  for (;;) {
+    if (likely(!__pyx_t_4)) {
+      if (likely(PyList_CheckExact(__pyx_t_1))) {
+        if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_2 = __pyx_t_4(__pyx_t_1);
+      if (unlikely(!__pyx_t_2)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_x);
+    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_x, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_x, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_indices); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_x, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_7 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
+      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
+      if (likely(__pyx_t_7)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+        __Pyx_INCREF(__pyx_t_7);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_6, function);
+      }
+    }
+    if (!__pyx_t_7) {
+      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_GOTREF(__pyx_t_2);
+    } else {
+      __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+      PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      __pyx_t_5 = 0;
+      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_r = __pyx_t_2;
+    __pyx_t_2 = 0;
+    __Pyx_XGIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+    __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
+    __pyx_cur_scope->__pyx_t_2 = __pyx_t_4;
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    /* return from generator, yielding value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L6_resume_from_yield:;
+    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+    __pyx_cur_scope->__pyx_t_0 = 0;
+    __Pyx_XGOTREF(__pyx_t_1);
+    __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
+    __pyx_t_4 = __pyx_cur_scope->__pyx_t_2;
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_5adios_3var_4type___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->type));
-  __pyx_r = ((PyObject *)__pyx_v_self->type);
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
-
-  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
+  return NULL;
 }
+static PyObject *__pyx_gb_5adios_3var_11__getitem___5generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* Python wrapper */
-static int __pyx_pw_5adios_3var_4type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_3var_4type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4type_2__set__(((struct __pyx_obj_5adios_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+/* "adios.pyx":1039
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
 
-static int __pyx_pf_5adios_3var_4type_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pf_5adios_3var_11__getitem___3genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyType_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->type);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->type));
-  __pyx_v_self->type = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *)__pyx_tp_new_5adios___pyx_scope_struct_2_genexpr(__pyx_ptype_5adios___pyx_scope_struct_2_genexpr, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *) __pyx_self;
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_5adios_3var_11__getitem___5generator1, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_getitem___locals_genexpr); if (unlikely(!gen)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.var.type.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_5adios_3var_4type_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_5adios_3var_4type_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4type_4__del__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_5adios_3var_4type_4__del__(struct __pyx_obj_5adios_var *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->type);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->type));
-  __pyx_v_self->type = ((PyObject*)Py_None);
-
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "adios.pyx":581
- *     cpdef public int varid
- *     cpdef public type type
- *     cpdef public int ndim             # <<<<<<<<<<<<<<
- *     cpdef public tuple dims
- *     cpdef public int nsteps
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_5adios_3var_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_3var_4ndim_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4ndim___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
-
-  /* function exit code */
+  __Pyx_AddTraceback("adios.var.__getitem__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_3var_4ndim___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+static PyObject *__pyx_gb_5adios_3var_11__getitem___5generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *__pyx_cur_scope = ((struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *(*__pyx_t_4)(PyObject *);
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L6_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_)) { __Pyx_RaiseClosureNameError("index_"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->dims);
+  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->dims);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->dims);
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
+    __pyx_t_1 = __pyx_t_2; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  for (;;) {
+    if (likely(!__pyx_t_4)) {
+      if (likely(PyList_CheckExact(__pyx_t_1))) {
+        if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_2 = __pyx_t_4(__pyx_t_1);
+      if (unlikely(!__pyx_t_2)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_x);
+    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_x, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_x, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_indices); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_x, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_7 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
+      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
+      if (likely(__pyx_t_7)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+        __Pyx_INCREF(__pyx_t_7);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_6, function);
+      }
+    }
+    if (!__pyx_t_7) {
+      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_GOTREF(__pyx_t_2);
+    } else {
+      __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+      PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      __pyx_t_5 = 0;
+      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_r = __pyx_t_2;
+    __pyx_t_2 = 0;
+    __Pyx_XGIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+    __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
+    __pyx_cur_scope->__pyx_t_2 = __pyx_t_4;
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    /* return from generator, yielding value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L6_resume_from_yield:;
+    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+    __pyx_cur_scope->__pyx_t_0 = 0;
+    __Pyx_XGOTREF(__pyx_t_1);
+    __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
+    __pyx_t_4 = __pyx_cur_scope->__pyx_t_2;
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.var.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
+  return NULL;
 }
 
-/* Python wrapper */
-static int __pyx_pw_5adios_3var_4ndim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_3var_4ndim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4ndim_2__set__(((struct __pyx_obj_5adios_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+/* "adios.pyx":1010
+ *                 self.nsteps)
+ * 
+ *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1
+ */
 
-static int __pyx_pf_5adios_3var_4ndim_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pf_5adios_3var_14__getitem__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_index) {
+  struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *__pyx_cur_scope;
+  PyObject *__pyx_v_ndim_ = NULL;
+  PyObject *__pyx_v_slice_ = NULL;
+  PyObject *__pyx_v_indices = NULL;
+  PyObject *__pyx_v_z = NULL;
+  PyObject *__pyx_v_from_steps_ = NULL;
+  PyObject *__pyx_v_nsteps_ = NULL;
+  PyObject *__pyx_v_offset_ = NULL;
+  PyObject *__pyx_v_count_ = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  Py_ssize_t __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  struct __pyx_opt_args_5adios_3var_read __pyx_t_14;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->ndim = __pyx_t_1;
+  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __pyx_cur_scope = (struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *)__pyx_tp_new_5adios___pyx_scope_struct____getitem__(__pyx_ptype_5adios___pyx_scope_struct____getitem__, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.var.ndim.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios.pyx":1011
+ * 
+ *     def __getitem__(self, index):
+ *         ndim_ = self.ndim             # <<<<<<<<<<<<<<
+ *         if (self.nsteps) > 1: ndim_ += 1
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_ndim_ = __pyx_t_1;
+  __pyx_t_1 = 0;
 
-/* "adios.pyx":582
- *     cpdef public type type
- *     cpdef public int ndim
- *     cpdef public tuple dims             # <<<<<<<<<<<<<<
- *     cpdef public int nsteps
+  /* "adios.pyx":1012
+ *     def __getitem__(self, index):
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1             # <<<<<<<<<<<<<<
  * 
+ *         index_ = __parse_index(index, ndim_)
  */
+  __pyx_t_2 = ((__pyx_cur_scope->__pyx_v_self->nsteps > 1) != 0);
+  if (__pyx_t_2) {
+    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_ndim_, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF_SET(__pyx_v_ndim_, __pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_5adios_3var_4dims_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_3var_4dims_1__get__(PyObject *__pyx_v_self) {
+  /* "adios.pyx":1014
+ *         if (self.nsteps) > 1: ndim_ += 1
+ * 
+ *         index_ = __parse_index(index, ndim_)             # <<<<<<<<<<<<<<
+ * 
+ *         if (ndim_ > 0) and (len(index_) > ndim_):
+ */
+  __pyx_t_1 = __pyx_f_5adios___parse_index(__pyx_v_index, __pyx_v_ndim_, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_index_ = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1016
+ *         index_ = __parse_index(index, ndim_)
+ * 
+ *         if (ndim_ > 0) and (len(index_) > ndim_):             # <<<<<<<<<<<<<<
+ *             raise IndexError("Too many indices for data")
+ * 
+ */
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ndim_, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_3) {
+  } else {
+    __pyx_t_2 = __pyx_t_3;
+    goto __pyx_L5_bool_binop_done;
+  }
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_index_;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_4 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = PyObject_RichCompare(__pyx_t_1, __pyx_v_ndim_, Py_GT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_2 = __pyx_t_3;
+  __pyx_L5_bool_binop_done:;
+  if (__pyx_t_2) {
+
+    /* "adios.pyx":1017
+ * 
+ *         if (ndim_ > 0) and (len(index_) > ndim_):
+ *             raise IndexError("Too many indices for data")             # <<<<<<<<<<<<<<
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):
+ */
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "adios.pyx":1019
+ *             raise IndexError("Too many indices for data")
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):             # <<<<<<<<<<<<<<
+ *             raise IndexError("Too many indices for data")
+ * 
+ */
+  __pyx_t_5 = PyObject_RichCompare(__pyx_v_ndim_, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  if (__pyx_t_3) {
+  } else {
+    __pyx_t_2 = __pyx_t_3;
+    goto __pyx_L8_bool_binop_done;
+  }
+  __pyx_t_5 = __pyx_cur_scope->__pyx_v_index_;
+  __Pyx_INCREF(__pyx_t_5);
+  __pyx_t_4 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_3 = ((__pyx_t_4 > 1) != 0);
+  __pyx_t_2 = __pyx_t_3;
+  __pyx_L8_bool_binop_done:;
+  if (__pyx_t_2) {
+
+    /* "adios.pyx":1020
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):
+ *             raise IndexError("Too many indices for data")             # <<<<<<<<<<<<<<
+ * 
+ *         for slice_ in index_:
+ */
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "adios.pyx":1022
+ *             raise IndexError("Too many indices for data")
+ * 
+ *         for slice_ in index_:             # <<<<<<<<<<<<<<
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ */
+  if (likely(PyList_CheckExact(__pyx_cur_scope->__pyx_v_index_)) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_index_)) {
+    __pyx_t_5 = __pyx_cur_scope->__pyx_v_index_; __Pyx_INCREF(__pyx_t_5); __pyx_t_4 = 0;
+    __pyx_t_6 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_index_); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  for (;;) {
+    if (likely(!__pyx_t_6)) {
+      if (likely(PyList_CheckExact(__pyx_t_5))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_5)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_1 = __pyx_t_6(__pyx_t_5);
+      if (unlikely(!__pyx_t_1)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_1);
+    }
+    __Pyx_XDECREF_SET(__pyx_v_slice_, __pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "adios.pyx":1023
+ * 
+ *         for slice_ in index_:
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):             # <<<<<<<<<<<<<<
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ *             if isinstance(slice_, str):
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_slice_, __pyx_n_s_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_7 = PyInt_Check(__pyx_t_1); 
+    __pyx_t_8 = (__pyx_t_7 != 0);
+    if (!__pyx_t_8) {
+    } else {
+      __pyx_t_3 = __pyx_t_8;
+      goto __pyx_L15_bool_binop_done;
+    }
+    __pyx_t_8 = PyLong_Check(__pyx_t_1); 
+    __pyx_t_7 = (__pyx_t_8 != 0);
+    __pyx_t_3 = __pyx_t_7;
+    __pyx_L15_bool_binop_done:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_7 = (__pyx_t_3 != 0);
+    if (__pyx_t_7) {
+    } else {
+      __pyx_t_2 = __pyx_t_7;
+      goto __pyx_L13_bool_binop_done;
+    }
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_slice_, __pyx_n_s_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_9 = PyObject_RichCompare(__pyx_t_1, __pyx_int_1, Py_NE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_2 = __pyx_t_7;
+    __pyx_L13_bool_binop_done:;
+    if (__pyx_t_2) {
+
+      /* "adios.pyx":1024
+ *         for slice_ in index_:
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))             # <<<<<<<<<<<<<<
+ *             if isinstance(slice_, str):
+ *                 raise IndexError("Name index (%r) is not supported." % (slice_))
+ */
+      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_slice_, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Step_size_d_is_not_supported, __pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_t_1 = 0;
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "adios.pyx":1025
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ *             if isinstance(slice_, str):             # <<<<<<<<<<<<<<
+ *                 raise IndexError("Name index (%r) is not supported." % (slice_))
+ * 
+ */
+    __pyx_t_2 = PyString_Check(__pyx_v_slice_); 
+    __pyx_t_7 = (__pyx_t_2 != 0);
+    if (__pyx_t_7) {
+
+      /* "adios.pyx":1026
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ *             if isinstance(slice_, str):
+ *                 raise IndexError("Name index (%r) is not supported." % (slice_))             # <<<<<<<<<<<<<<
+ * 
+ *         if (self.nsteps) > 1:
+ */
+      __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Name_index_r_is_not_supported, __pyx_v_slice_); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_t_1 = 0;
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "adios.pyx":1022
+ *             raise IndexError("Too many indices for data")
+ * 
+ *         for slice_ in index_:             # <<<<<<<<<<<<<<
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ */
+  }
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+  /* "adios.pyx":1028
+ *                 raise IndexError("Name index (%r) is not supported." % (slice_))
+ * 
+ *         if (self.nsteps) > 1:             # <<<<<<<<<<<<<<
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)
+ */
+  __pyx_t_7 = ((__pyx_cur_scope->__pyx_v_self->nsteps > 1) != 0);
+  if (__pyx_t_7) {
+
+    /* "adios.pyx":1029
+ * 
+ *         if (self.nsteps) > 1:
+ *             dims_ = list(self.dims)             # <<<<<<<<<<<<<<
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))
+ */
+    __pyx_t_5 = PySequence_List(__pyx_cur_scope->__pyx_v_self->dims); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GIVEREF(__pyx_t_5);
+    __pyx_cur_scope->__pyx_v_dims_ = ((PyObject*)__pyx_t_5);
+    __pyx_t_5 = 0;
+
+    /* "adios.pyx":1030
+ *         if (self.nsteps) > 1:
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)             # <<<<<<<<<<<<<<
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))
+ *             z = zip(*indices)
+ */
+    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->nsteps); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_10 = PyList_Insert(__pyx_cur_scope->__pyx_v_dims_, 0, __pyx_t_5); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+    /* "adios.pyx":1031
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+    __pyx_t_5 = __pyx_pf_5adios_3var_11__getitem___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_1 = PySequence_Tuple(__pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_indices = ((PyObject*)__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "adios.pyx":1032
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))
+ *             z = zip(*indices)             # <<<<<<<<<<<<<<
+ * 
+ *             from_steps_ = z[0][0]
+ */
+    __pyx_t_1 = PySequence_Tuple(__pyx_v_indices); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_v_z = __pyx_t_5;
+    __pyx_t_5 = 0;
+
+    /* "adios.pyx":1034
+ *             z = zip(*indices)
+ * 
+ *             from_steps_ = z[0][0]             # <<<<<<<<<<<<<<
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]
+ */
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_from_steps_ = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "adios.pyx":1035
+ * 
+ *             from_steps_ = z[0][0]
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1             # <<<<<<<<<<<<<<
+ *             offset_ = z[0][1:]
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ */
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyNumber_Subtract(__pyx_t_5, __pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_9 = PyNumber_Subtract(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = PyNumber_Remainder(__pyx_t_9, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyNumber_Add(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_nsteps_ = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "adios.pyx":1036
+ *             from_steps_ = z[0][0]
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]             # <<<<<<<<<<<<<<
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ */
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = __Pyx_PyObject_GetSlice(__pyx_t_1, 1, 0, NULL, NULL, &__pyx_slice__19, 1, 0, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_v_offset_ = __pyx_t_5;
+    __pyx_t_5 = 0;
+
+    /* "adios.pyx":1037
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)             # <<<<<<<<<<<<<<
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))
+ */
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_subtract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_11 = __Pyx_PyObject_GetSlice(__pyx_t_1, 1, 0, NULL, NULL, &__pyx_slice__20, 1, 0, 1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_11);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_12 = __Pyx_PyObject_GetSlice(__pyx_t_1, 1, 0, NULL, NULL, &__pyx_slice__21, 1, 0, 1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_12);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = NULL;
+    __pyx_t_4 = 0;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_9))) {
+      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_9);
+      if (likely(__pyx_t_1)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+        __Pyx_INCREF(__pyx_t_1);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_9, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    __pyx_t_13 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    if (__pyx_t_1) {
+      PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = NULL;
+    }
+    PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_4, __pyx_t_11);
+    __Pyx_GIVEREF(__pyx_t_11);
+    PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_4, __pyx_t_12);
+    __Pyx_GIVEREF(__pyx_t_12);
+    __pyx_t_11 = 0;
+    __pyx_t_12 = 0;
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_13, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_9 = PyNumber_Subtract(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = __Pyx_PyList_GetSlice(__pyx_cur_scope->__pyx_v_dims_, 1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_13 = PyNumber_Remainder(__pyx_t_9, __pyx_t_5); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = PyNumber_Add(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+    __pyx_t_13 = PySequence_Tuple(__pyx_t_5); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_count_ = ((PyObject*)__pyx_t_13);
+    __pyx_t_13 = 0;
+    goto __pyx_L18;
+  }
+  /*else*/ {
+
+    /* "adios.pyx":1039
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+    __pyx_t_13 = __pyx_pf_5adios_3var_11__getitem___3genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __pyx_t_5 = PySequence_Tuple(__pyx_t_13); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+    __pyx_v_indices = ((PyObject*)__pyx_t_5);
+    __pyx_t_5 = 0;
+
+    /* "adios.pyx":1040
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))
+ *             z = zip(*indices)             # <<<<<<<<<<<<<<
+ * 
+ *             if len(z) == 0:
+ */
+    __pyx_t_5 = PySequence_Tuple(__pyx_v_indices); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_5, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_z = __pyx_t_13;
+    __pyx_t_13 = 0;
+
+    /* "adios.pyx":1042
+ *             z = zip(*indices)
+ * 
+ *             if len(z) == 0:             # <<<<<<<<<<<<<<
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps
+ */
+    __pyx_t_4 = PyObject_Length(__pyx_v_z); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = ((__pyx_t_4 == 0) != 0);
+    if (__pyx_t_7) {
+
+      /* "adios.pyx":1043
+ * 
+ *             if len(z) == 0:
+ *                 from_steps_ = 0             # <<<<<<<<<<<<<<
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = ()
+ */
+      __Pyx_INCREF(__pyx_int_0);
+      __pyx_v_from_steps_ = __pyx_int_0;
+
+      /* "adios.pyx":1044
+ *             if len(z) == 0:
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps             # <<<<<<<<<<<<<<
+ *                 offset_ = ()
+ *                 count_ = ()
+ */
+      __pyx_t_13 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->nsteps); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __pyx_v_nsteps_ = __pyx_t_13;
+      __pyx_t_13 = 0;
+
+      /* "adios.pyx":1045
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = ()             # <<<<<<<<<<<<<<
+ *                 count_ = ()
+ *             else:
+ */
+      __Pyx_INCREF(__pyx_empty_tuple);
+      __pyx_v_offset_ = __pyx_empty_tuple;
+
+      /* "adios.pyx":1046
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = ()
+ *                 count_ = ()             # <<<<<<<<<<<<<<
+ *             else:
+ *                 from_steps_ = 0
+ */
+      __Pyx_INCREF(__pyx_empty_tuple);
+      __pyx_v_count_ = __pyx_empty_tuple;
+      goto __pyx_L19;
+    }
+    /*else*/ {
+
+      /* "adios.pyx":1048
+ *                 count_ = ()
+ *             else:
+ *                 from_steps_ = 0             # <<<<<<<<<<<<<<
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = z[0]
+ */
+      __Pyx_INCREF(__pyx_int_0);
+      __pyx_v_from_steps_ = __pyx_int_0;
+
+      /* "adios.pyx":1049
+ *             else:
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps             # <<<<<<<<<<<<<<
+ *                 offset_ = z[0]
+ *                 count_ = tuple((np.subtract(z[1], z[0])-1)%self.dims+1)
+ */
+      __pyx_t_13 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->nsteps); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __pyx_v_nsteps_ = __pyx_t_13;
+      __pyx_t_13 = 0;
+
+      /* "adios.pyx":1050
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = z[0]             # <<<<<<<<<<<<<<
+ *                 count_ = tuple((np.subtract(z[1], z[0])-1)%self.dims+1)
+ * 
+ */
+      __pyx_t_13 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_13 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+      __Pyx_GOTREF(__pyx_t_13);
+      __pyx_v_offset_ = __pyx_t_13;
+      __pyx_t_13 = 0;
+
+      /* "adios.pyx":1051
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = z[0]
+ *                 count_ = tuple((np.subtract(z[1], z[0])-1)%self.dims+1)             # <<<<<<<<<<<<<<
+ * 
+ *         ##print "from_steps", from_steps_
+ */
+      __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_subtract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_z, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_12 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_12 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+      __Pyx_GOTREF(__pyx_t_12);
+      __pyx_t_11 = NULL;
+      __pyx_t_4 = 0;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_9))) {
+        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_9);
+        if (likely(__pyx_t_11)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+          __Pyx_INCREF(__pyx_t_11);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_9, function);
+          __pyx_t_4 = 1;
+        }
+      }
+      __pyx_t_1 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      if (__pyx_t_11) {
+        PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __pyx_t_11 = NULL;
+      }
+      PyTuple_SET_ITEM(__pyx_t_1, 0+__pyx_t_4, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_1, 1+__pyx_t_4, __pyx_t_12);
+      __Pyx_GIVEREF(__pyx_t_12);
+      __pyx_t_5 = 0;
+      __pyx_t_12 = 0;
+      __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_1, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = PyNumber_Subtract(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+      __pyx_t_13 = PyNumber_Remainder(__pyx_t_9, __pyx_cur_scope->__pyx_v_self->dims); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = PyNumber_Add(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+      __pyx_t_13 = PySequence_Tuple(__pyx_t_9); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_v_count_ = ((PyObject*)__pyx_t_13);
+      __pyx_t_13 = 0;
+    }
+    __pyx_L19:;
+  }
+  __pyx_L18:;
+
+  /* "adios.pyx":1058
+ *         ##print "count", count_
+ * 
+ *         return self.read(offset=offset_,             # <<<<<<<<<<<<<<
+ *                          count=count_,
+ *                          from_steps=from_steps_,
+ */
+  __Pyx_XDECREF(__pyx_r);
+  if (!(likely(PyTuple_CheckExact(__pyx_v_offset_))||((__pyx_v_offset_) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v_offset_)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1058; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":1061
+ *                          count=count_,
+ *                          from_steps=from_steps_,
+ *                          nsteps=nsteps_)             # <<<<<<<<<<<<<<
+ * 
+ * cdef class attr:
+ */
+  __pyx_t_14.__pyx_n = 4;
+  __pyx_t_14.offset = ((PyObject*)__pyx_v_offset_);
+  __pyx_t_14.count = __pyx_v_count_;
+  __pyx_t_14.from_steps = __pyx_v_from_steps_;
+  __pyx_t_14.nsteps = __pyx_v_nsteps_;
+  __pyx_t_13 = ((struct __pyx_vtabstruct_5adios_var *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->read(__pyx_cur_scope->__pyx_v_self, 0, &__pyx_t_14); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1058; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_r = __pyx_t_13;
+  __pyx_t_13 = 0;
+  goto __pyx_L0;
+
+  /* "adios.pyx":1010
+ *                 self.nsteps)
+ * 
+ *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_13);
+  __Pyx_AddTraceback("adios.var.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_ndim_);
+  __Pyx_XDECREF(__pyx_v_slice_);
+  __Pyx_XDECREF(__pyx_v_indices);
+  __Pyx_XDECREF(__pyx_v_z);
+  __Pyx_XDECREF(__pyx_v_from_steps_);
+  __Pyx_XDECREF(__pyx_v_nsteps_);
+  __Pyx_XDECREF(__pyx_v_offset_);
+  __Pyx_XDECREF(__pyx_v_count_);
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1085
+ *     property name:
+ *         """ The attribute name """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_4attr_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4attr_4name_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4dims___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+  __pyx_r = __pyx_pf_5adios_4attr_4name___get__(((struct __pyx_obj_5adios_attr *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_3var_4dims___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_4attr_4name___get__(struct __pyx_obj_5adios_attr *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":1086
+ *         """ The attribute name """
+ *         def __get__(self):
+ *             return self.name             # <<<<<<<<<<<<<<
+ * 
+ *     property dtype:
+ */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->dims);
-  __pyx_r = __pyx_v_self->dims;
+  __Pyx_INCREF(__pyx_v_self->name);
+  __pyx_r = __pyx_v_self->name;
   goto __pyx_L0;
 
+  /* "adios.pyx":1085
+ *     property name:
+ *         """ The attribute name """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
+ * 
+ */
+
   /* function exit code */
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -10390,181 +14782,133 @@ static PyObject *__pyx_pf_5adios_3var_4dims___get__(struct __pyx_obj_5adios_var
   return __pyx_r;
 }
 
+/* "adios.pyx":1090
+ *     property dtype:
+ *         """ The attribute type as in numpy.dtype """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
+
 /* Python wrapper */
-static int __pyx_pw_5adios_3var_4dims_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_3var_4dims_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_5adios_4attr_5dtype_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4attr_5dtype_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4dims_2__set__(((struct __pyx_obj_5adios_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4attr_5dtype___get__(((struct __pyx_obj_5adios_attr *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_5adios_3var_4dims_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pf_5adios_4attr_5dtype___get__(struct __pyx_obj_5adios_attr *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyTuple_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 582; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->dims);
-  __Pyx_DECREF(__pyx_v_self->dims);
-  __pyx_v_self->dims = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* function exit code */
-  __pyx_r = 0;
+  /* "adios.pyx":1091
+ *         """ The attribute type as in numpy.dtype """
+ *         def __get__(self):
+ *             return self.dtype             # <<<<<<<<<<<<<<
+ * 
+ *     property value:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->dtype));
+  __pyx_r = ((PyObject *)__pyx_v_self->dtype);
   goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.var.dims.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_5adios_3var_4dims_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_5adios_3var_4dims_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_4dims_4__del__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-static int __pyx_pf_5adios_3var_4dims_4__del__(struct __pyx_obj_5adios_var *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->dims);
-  __Pyx_DECREF(__pyx_v_self->dims);
-  __pyx_v_self->dims = ((PyObject*)Py_None);
+  /* "adios.pyx":1090
+ *     property dtype:
+ *         """ The attribute type as in numpy.dtype """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":583
- *     cpdef public int ndim
- *     cpdef public tuple dims
- *     cpdef public int nsteps             # <<<<<<<<<<<<<<
+/* "adios.pyx":1095
+ *     property value:
+ *         """ The attribute's value """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.value
  * 
- *     """ Initialization. Call adios_inq_var and populate public members """
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_3var_6nsteps_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_5adios_3var_6nsteps_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_5adios_4attr_5value_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4attr_5value_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_6nsteps___get__(((struct __pyx_obj_5adios_var *)__pyx_v_self));
+  __pyx_r = __pyx_pf_5adios_4attr_5value___get__(((struct __pyx_obj_5adios_attr *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_3var_6nsteps___get__(struct __pyx_obj_5adios_var *__pyx_v_self) {
+static PyObject *__pyx_pf_5adios_4attr_5value___get__(struct __pyx_obj_5adios_attr *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":1096
+ *         """ The attribute's value """
+ *         def __get__(self):
+ *             return self.value             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, file file, char * name):
+ */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->value));
+  __pyx_r = ((PyObject *)__pyx_v_self->value);
   goto __pyx_L0;
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios.var.nsteps.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_5adios_3var_6nsteps_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_5adios_3var_6nsteps_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_3var_6nsteps_2__set__(((struct __pyx_obj_5adios_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_5adios_3var_6nsteps_2__set__(struct __pyx_obj_5adios_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->nsteps = __pyx_t_1;
+  /* "adios.pyx":1095
+ *     property value:
+ *         """ The attribute's value """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.value
+ * 
+ */
 
   /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("adios.var.nsteps.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":661
- * ## ====================
+/* "adios.pyx":1098
+ *             return self.value
  * 
- * def readvar(fname, varname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     if not f.var.has_key(varname):
+ *     def __init__(self, file file, char * name):             # <<<<<<<<<<<<<<
+ *         self.file = file
+ *         self.name = name
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_39readvar(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_5adios_39readvar = {"readvar", (PyCFunction)__pyx_pw_5adios_39readvar, METH_VARARGS|METH_KEYWORDS, 0};
-static PyObject *__pyx_pw_5adios_39readvar(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_fname = 0;
-  PyObject *__pyx_v_varname = 0;
+static int __pyx_pw_5adios_4attr_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_5adios_4attr_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_5adios_file *__pyx_v_file = 0;
+  char *__pyx_v_name;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("readvar (wrapper)", 0);
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_varname,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_file,&__pyx_n_s_name,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -10578,16 +14922,16 @@ static PyObject *__pyx_pw_5adios_39readvar(PyObject *__pyx_self, PyObject *__pyx
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_file)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_varname)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("readvar", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "readvar") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -10595,2373 +14939,3297 @@ static PyObject *__pyx_pw_5adios_39readvar(PyObject *__pyx_self, PyObject *__pyx
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_fname = values[0];
-    __pyx_v_varname = values[1];
+    __pyx_v_file = ((struct __pyx_obj_5adios_file *)values[0]);
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("readvar", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
-  __Pyx_AddTraceback("adios.readvar", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.attr.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
-  return NULL;
+  return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_5adios_38readvar(__pyx_self, __pyx_v_fname, __pyx_v_varname);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_file), __pyx_ptype_5adios_file, 1, "file", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_5adios_4attr___init__(((struct __pyx_obj_5adios_attr *)__pyx_v_self), __pyx_v_file, __pyx_v_name);
 
   /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_38readvar(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname, PyObject *__pyx_v_varname) {
-  struct __pyx_obj_5adios_file *__pyx_v_f = NULL;
-  PyObject *__pyx_v_v = NULL;
-  PyObject *__pyx_r = NULL;
+static int __pyx_pf_5adios_4attr___init__(struct __pyx_obj_5adios_attr *__pyx_v_self, struct __pyx_obj_5adios_file *__pyx_v_file, char *__pyx_v_name) {
+  int64_t __pyx_v_p;
+  ADIOS_DATATYPES __pyx_v_atype;
+  int __pyx_v_bytes;
+  PyObject *__pyx_v_strlist = 0;
+  int __pyx_v_len;
+  int __pyx_v_err;
+  int __pyx_v_i;
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_t_5;
+  char const *__pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  struct __pyx_opt_args_5adios_adios2npdtype __pyx_t_6;
+  size_t __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_t_9;
+  int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("readvar", 0);
+  __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "adios.pyx":662
+  /* "adios.pyx":1099
  * 
- * def readvar(fname, varname):
- *     f = file(fname, comm=MPI_COMM_SELF)             # <<<<<<<<<<<<<<
- *     if not f.var.has_key(varname):
- *         print "No valid variable"
- */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(__pyx_v_fname);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fname);
-  __Pyx_GIVEREF(__pyx_v_fname);
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_PyInt_From_int(MPI_COMM_SELF); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_comm, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_file)), __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_v_f = ((struct __pyx_obj_5adios_file *)__pyx_t_3);
-  __pyx_t_3 = 0;
-
-  /* "adios.pyx":663
- * def readvar(fname, varname):
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     if not f.var.has_key(varname):             # <<<<<<<<<<<<<<
- *         print "No valid variable"
- *         return
- */
-  if (unlikely(__pyx_v_f->var == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_4 = PyDict_Contains(__pyx_v_f->var, __pyx_v_varname); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_5 = ((!(__pyx_t_4 != 0)) != 0);
-  if (__pyx_t_5) {
-
-    /* "adios.pyx":664
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     if not f.var.has_key(varname):
- *         print "No valid variable"             # <<<<<<<<<<<<<<
- *         return
+ *     def __init__(self, file file, char * name):
+ *         self.file = file             # <<<<<<<<<<<<<<
+ *         self.name = name
  * 
  */
-    if (__Pyx_PrintOne(0, __pyx_kp_s_No_valid_variable) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_INCREF(((PyObject *)__pyx_v_file));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_file));
+  __Pyx_GOTREF(__pyx_v_self->file);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->file));
+  __pyx_v_self->file = __pyx_v_file;
 
-    /* "adios.pyx":665
- *     if not f.var.has_key(varname):
- *         print "No valid variable"
- *         return             # <<<<<<<<<<<<<<
+  /* "adios.pyx":1100
+ *     def __init__(self, file file, char * name):
+ *         self.file = file
+ *         self.name = name             # <<<<<<<<<<<<<<
  * 
- *     v = f.var[varname]
+ *         cdef int64_t p
  */
-    __Pyx_XDECREF(__pyx_r);
-    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-    goto __pyx_L0;
-  }
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->name);
+  __Pyx_DECREF(__pyx_v_self->name);
+  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-  /* "adios.pyx":667
- *         return
+  /* "adios.pyx":1108
+ *         cdef int len
  * 
- *     v = f.var[varname]             # <<<<<<<<<<<<<<
- *     return v.read(from_steps=0, nsteps=v.nsteps)
+ *         err = adios_get_attr(self.file.fp, self.name, &atype, &bytes, <void **> &p)             # <<<<<<<<<<<<<<
  * 
+ *         if err == 0:
  */
-  if (unlikely(__pyx_v_f->var == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_f->var, __pyx_v_varname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_v_v = __pyx_t_3;
-  __pyx_t_3 = 0;
+  __pyx_t_2 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_err = adios_get_attr(__pyx_v_self->file->fp, __pyx_t_2, (&__pyx_v_atype), (&__pyx_v_bytes), ((void **)(&__pyx_v_p)));
 
-  /* "adios.pyx":668
- * 
- *     v = f.var[varname]
- *     return v.read(from_steps=0, nsteps=v.nsteps)             # <<<<<<<<<<<<<<
+  /* "adios.pyx":1110
+ *         err = adios_get_attr(self.file.fp, self.name, &atype, &bytes, <void **> &p)
  * 
- * def bpls(fname):
+ *         if err == 0:             # <<<<<<<<<<<<<<
+ *             if atype == DATATYPE.string:
+ *                 bytes = bytes - 1 ## Remove the NULL terminal
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_read); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 668; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 668; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_from_steps, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 668; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 668; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_nsteps, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 668; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 668; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __pyx_t_3 = ((__pyx_v_err == 0) != 0);
+  if (__pyx_t_3) {
 
-  /* "adios.pyx":661
- * ## ====================
+    /* "adios.pyx":1111
  * 
- * def readvar(fname, varname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     if not f.var.has_key(varname):
+ *         if err == 0:
+ *             if atype == DATATYPE.string:             # <<<<<<<<<<<<<<
+ *                 bytes = bytes - 1 ## Remove the NULL terminal
+ *             self.dtype = adios2npdtype(atype, bytes)
  */
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_atype); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_string); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_1, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (__pyx_t_3) {
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("adios.readvar", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_f);
-  __Pyx_XDECREF(__pyx_v_v);
-  __Pyx_XGIVEREF(__pyx_r);
+      /* "adios.pyx":1112
+ *         if err == 0:
+ *             if atype == DATATYPE.string:
+ *                 bytes = bytes - 1 ## Remove the NULL terminal             # <<<<<<<<<<<<<<
+ *             self.dtype = adios2npdtype(atype, bytes)
+ *             if atype == DATATYPE.string_array:
+ */
+      __pyx_v_bytes = (__pyx_v_bytes - 1);
+      goto __pyx_L4;
+    }
+    __pyx_L4:;
+
+    /* "adios.pyx":1113
+ *             if atype == DATATYPE.string:
+ *                 bytes = bytes - 1 ## Remove the NULL terminal
+ *             self.dtype = adios2npdtype(atype, bytes)             # <<<<<<<<<<<<<<
+ *             if atype == DATATYPE.string_array:
+ *                 strlist = list()
+ */
+    __pyx_t_6.__pyx_n = 1;
+    __pyx_t_6.strlen = __pyx_v_bytes;
+    __pyx_t_4 = ((PyObject *)__pyx_f_5adios_adios2npdtype(__pyx_v_atype, 0, &__pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_4);
+    __Pyx_GOTREF(__pyx_v_self->dtype);
+    __Pyx_DECREF(((PyObject *)__pyx_v_self->dtype));
+    __pyx_v_self->dtype = ((PyArray_Descr *)__pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "adios.pyx":1114
+ *                 bytes = bytes - 1 ## Remove the NULL terminal
+ *             self.dtype = adios2npdtype(atype, bytes)
+ *             if atype == DATATYPE.string_array:             # <<<<<<<<<<<<<<
+ *                 strlist = list()
+ *                 len = bytes/sizeof(p)
+ */
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_atype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_string_array); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (__pyx_t_3) {
+
+      /* "adios.pyx":1115
+ *             self.dtype = adios2npdtype(atype, bytes)
+ *             if atype == DATATYPE.string_array:
+ *                 strlist = list()             # <<<<<<<<<<<<<<
+ *                 len = bytes/sizeof(p)
+ *                 for i in range(len):
+ */
+      __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_v_strlist = ((PyObject*)__pyx_t_5);
+      __pyx_t_5 = 0;
+
+      /* "adios.pyx":1116
+ *             if atype == DATATYPE.string_array:
+ *                 strlist = list()
+ *                 len = bytes/sizeof(p)             # <<<<<<<<<<<<<<
+ *                 for i in range(len):
+ *                     strlist.append((<char **>p)[i])
+ */
+      __pyx_t_7 = (sizeof(__pyx_v_p));
+      if (unlikely(__pyx_t_7 == 0)) {
+        #ifdef WITH_THREAD
+        PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();
+        #endif
+        PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
+        #ifdef WITH_THREAD
+        PyGILState_Release(__pyx_gilstate_save);
+        #endif
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_v_len = (__pyx_v_bytes / __pyx_t_7);
+
+      /* "adios.pyx":1117
+ *                 strlist = list()
+ *                 len = bytes/sizeof(p)
+ *                 for i in range(len):             # <<<<<<<<<<<<<<
+ *                     strlist.append((<char **>p)[i])
+ *                 self.value = np.array(strlist)
+ */
+      __pyx_t_8 = __pyx_v_len;
+      for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
+        __pyx_v_i = __pyx_t_9;
+
+        /* "adios.pyx":1118
+ *                 len = bytes/sizeof(p)
+ *                 for i in range(len):
+ *                     strlist.append((<char **>p)[i])             # <<<<<<<<<<<<<<
+ *                 self.value = np.array(strlist)
+ *                 self.dtype = self.value.dtype
+ */
+        __pyx_t_5 = __Pyx_PyBytes_FromString((((char **)__pyx_v_p)[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_strlist, __pyx_t_5); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+
+      /* "adios.pyx":1119
+ *                 for i in range(len):
+ *                     strlist.append((<char **>p)[i])
+ *                 self.value = np.array(strlist)             # <<<<<<<<<<<<<<
+ *                 self.dtype = self.value.dtype
+ * 
+ */
+      __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_1 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
+        __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+        if (likely(__pyx_t_1)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_1);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_4, function);
+        }
+      }
+      if (!__pyx_t_1) {
+        __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_strlist); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+      } else {
+        __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = NULL;
+        __Pyx_INCREF(__pyx_v_strlist);
+        PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_strlist);
+        __Pyx_GIVEREF(__pyx_v_strlist);
+        __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_11, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GIVEREF(__pyx_t_5);
+      __Pyx_GOTREF(__pyx_v_self->value);
+      __Pyx_DECREF(((PyObject *)__pyx_v_self->value));
+      __pyx_v_self->value = ((PyArrayObject *)__pyx_t_5);
+      __pyx_t_5 = 0;
+
+      /* "adios.pyx":1120
+ *                     strlist.append((<char **>p)[i])
+ *                 self.value = np.array(strlist)
+ *                 self.dtype = self.value.dtype             # <<<<<<<<<<<<<<
+ * 
+ *             elif self.dtype is None:
+ */
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->value), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GIVEREF(__pyx_t_5);
+      __Pyx_GOTREF(__pyx_v_self->dtype);
+      __Pyx_DECREF(((PyObject *)__pyx_v_self->dtype));
+      __pyx_v_self->dtype = ((PyArray_Descr *)__pyx_t_5);
+      __pyx_t_5 = 0;
+      goto __pyx_L5;
+    }
+
+    /* "adios.pyx":1122
+ *                 self.dtype = self.value.dtype
+ * 
+ *             elif self.dtype is None:             # <<<<<<<<<<<<<<
+ *                 print 'Warning: No support yet: %s (type=%d, bytes=%d)' % \
+ *                       (self.name, atype, bytes)
+ */
+    __pyx_t_3 = (((PyObject *)__pyx_v_self->dtype) == Py_None);
+    __pyx_t_12 = (__pyx_t_3 != 0);
+    if (__pyx_t_12) {
+
+      /* "adios.pyx":1124
+ *             elif self.dtype is None:
+ *                 print 'Warning: No support yet: %s (type=%d, bytes=%d)' % \
+ *                       (self.name, atype, bytes)             # <<<<<<<<<<<<<<
+ *             else:
+ *                 len = bytes/self.dtype.itemsize
+ */
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_atype); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_bytes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_11);
+      __Pyx_INCREF(__pyx_v_self->name);
+      PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_self->name);
+      __Pyx_GIVEREF(__pyx_v_self->name);
+      PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_11, 2, __pyx_t_4);
+      __Pyx_GIVEREF(__pyx_t_4);
+      __pyx_t_5 = 0;
+      __pyx_t_4 = 0;
+
+      /* "adios.pyx":1123
+ * 
+ *             elif self.dtype is None:
+ *                 print 'Warning: No support yet: %s (type=%d, bytes=%d)' % \             # <<<<<<<<<<<<<<
+ *                       (self.name, atype, bytes)
+ *             else:
+ */
+      __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Warning_No_support_yet_s_type_d, __pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      if (__Pyx_PrintOne(0, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      goto __pyx_L5;
+    }
+    /*else*/ {
+
+      /* "adios.pyx":1126
+ *                       (self.name, atype, bytes)
+ *             else:
+ *                 len = bytes/self.dtype.itemsize             # <<<<<<<<<<<<<<
+ *                 if len == 1:
+ *                     self.value = np.array(len, dtype=self.dtype)
+ */
+      if (unlikely(__pyx_v_self->dtype->elsize == 0)) {
+        #ifdef WITH_THREAD
+        PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();
+        #endif
+        PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
+        #ifdef WITH_THREAD
+        PyGILState_Release(__pyx_gilstate_save);
+        #endif
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_self->dtype->elsize == (int)-1)  && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_bytes))) {
+        #ifdef WITH_THREAD
+        PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();
+        #endif
+        PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
+        #ifdef WITH_THREAD
+        PyGILState_Release(__pyx_gilstate_save);
+        #endif
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_v_len = __Pyx_div_int(__pyx_v_bytes, __pyx_v_self->dtype->elsize);
+
+      /* "adios.pyx":1127
+ *             else:
+ *                 len = bytes/self.dtype.itemsize
+ *                 if len == 1:             # <<<<<<<<<<<<<<
+ *                     self.value = np.array(len, dtype=self.dtype)
+ *                 else:
+ */
+      __pyx_t_12 = ((__pyx_v_len == 1) != 0);
+      if (__pyx_t_12) {
+
+        /* "adios.pyx":1128
+ *                 len = bytes/self.dtype.itemsize
+ *                 if len == 1:
+ *                     self.value = np.array(len, dtype=self.dtype)             # <<<<<<<<<<<<<<
+ *                 else:
+ *                     self.value = np.zeros(len, dtype=self.dtype)
+ */
+        __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_len); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
+        __Pyx_GIVEREF(__pyx_t_4);
+        __pyx_t_4 = 0;
+        __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, ((PyObject *)__pyx_v_self->dtype)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GIVEREF(__pyx_t_1);
+        __Pyx_GOTREF(__pyx_v_self->value);
+        __Pyx_DECREF(((PyObject *)__pyx_v_self->value));
+        __pyx_v_self->value = ((PyArrayObject *)__pyx_t_1);
+        __pyx_t_1 = 0;
+        goto __pyx_L8;
+      }
+      /*else*/ {
+
+        /* "adios.pyx":1130
+ *                     self.value = np.array(len, dtype=self.dtype)
+ *                 else:
+ *                     self.value = np.zeros(len, dtype=self.dtype)             # <<<<<<<<<<<<<<
+ *                 self.value.data = <char *> p
+ *         else:
+ */
+        __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
+        __Pyx_GIVEREF(__pyx_t_1);
+        __pyx_t_1 = 0;
+        __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, ((PyObject *)__pyx_v_self->dtype)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        if (!(likely(((__pyx_t_11) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GIVEREF(__pyx_t_11);
+        __Pyx_GOTREF(__pyx_v_self->value);
+        __Pyx_DECREF(((PyObject *)__pyx_v_self->value));
+        __pyx_v_self->value = ((PyArrayObject *)__pyx_t_11);
+        __pyx_t_11 = 0;
+      }
+      __pyx_L8:;
+
+      /* "adios.pyx":1131
+ *                 else:
+ *                     self.value = np.zeros(len, dtype=self.dtype)
+ *                 self.value.data = <char *> p             # <<<<<<<<<<<<<<
+ *         else:
+ *             raise KeyError(name)
+ */
+      __pyx_v_self->value->data = ((char *)__pyx_v_p);
+    }
+    __pyx_L5:;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "adios.pyx":1133
+ *                 self.value.data = <char *> p
+ *         else:
+ *             raise KeyError(name)             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
+ */
+    __pyx_t_11 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_11);
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
+    __Pyx_GIVEREF(__pyx_t_11);
+    __pyx_t_11 = 0;
+    __pyx_t_11 = __Pyx_PyObject_Call(__pyx_builtin_KeyError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_11);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_Raise(__pyx_t_11, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_L3:;
+
+  /* "adios.pyx":1098
+ *             return self.value
+ * 
+ *     def __init__(self, file file, char * name):             # <<<<<<<<<<<<<<
+ *         self.file = file
+ *         self.name = name
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_AddTraceback("adios.attr.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_strlist);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios.pyx":670
- *     return v.read(from_steps=0, nsteps=v.nsteps)
+/* "adios.pyx":1135
+ *             raise KeyError(name)
  * 
- * def bpls(fname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     return {'nvars': f.nvars,
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \
+ *                (self.name, self.dtype, self.value)
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_5adios_41bpls(PyObject *__pyx_self, PyObject *__pyx_v_fname); /*proto*/
-static PyMethodDef __pyx_mdef_5adios_41bpls = {"bpls", (PyCFunction)__pyx_pw_5adios_41bpls, METH_O, 0};
-static PyObject *__pyx_pw_5adios_41bpls(PyObject *__pyx_self, PyObject *__pyx_v_fname) {
+static PyObject *__pyx_pw_5adios_4attr_3__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_4attr_3__repr__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("bpls (wrapper)", 0);
-  __pyx_r = __pyx_pf_5adios_40bpls(__pyx_self, ((PyObject *)__pyx_v_fname));
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_4attr_2__repr__(((struct __pyx_obj_5adios_attr *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_5adios_40bpls(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname) {
-  struct __pyx_obj_5adios_file *__pyx_v_f = NULL;
-  PyObject *__pyx_v_k = NULL;
+static PyObject *__pyx_pf_5adios_4attr_2__repr__(struct __pyx_obj_5adios_attr *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  Py_ssize_t __pyx_t_4;
-  Py_ssize_t __pyx_t_5;
-  int __pyx_t_6;
-  PyObject *__pyx_t_7 = NULL;
-  int __pyx_t_8;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("bpls", 0);
+  __Pyx_RefNannySetupContext("__repr__", 0);
 
-  /* "adios.pyx":671
+  /* "adios.pyx":1136
+ * 
+ *     def __repr__(self):
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \             # <<<<<<<<<<<<<<
+ *                (self.name, self.dtype, self.value)
  * 
- * def bpls(fname):
- *     f = file(fname, comm=MPI_COMM_SELF)             # <<<<<<<<<<<<<<
- *     return {'nvars': f.nvars,
- *             'nattrs': f.nattrs,
- */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(__pyx_v_fname);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fname);
-  __Pyx_GIVEREF(__pyx_v_fname);
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_PyInt_From_int(MPI_COMM_SELF); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_comm, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_file)), __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_v_f = ((struct __pyx_obj_5adios_file *)__pyx_t_3);
-  __pyx_t_3 = 0;
-
-  /* "adios.pyx":672
- * def bpls(fname):
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     return {'nvars': f.nvars,             # <<<<<<<<<<<<<<
- *             'nattrs': f.nattrs,
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->nvars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_nvars, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
-  /* "adios.pyx":673
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     return {'nvars': f.nvars,
- *             'nattrs': f.nattrs,             # <<<<<<<<<<<<<<
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
- */
-  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->nattrs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_nattrs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "adios.pyx":674
- *     return {'nvars': f.nvars,
- *             'nattrs': f.nattrs,
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),             # <<<<<<<<<<<<<<
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
- *             'time_steps': (f.current_step, f.last_step),
+  /* "adios.pyx":1137
+ *     def __repr__(self):
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \
+ *                (self.name, self.dtype, self.value)             # <<<<<<<<<<<<<<
+ * 
+ * 
  */
-  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_4 = 0;
-  if (unlikely(__pyx_v_f->var == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iterkeys");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_f->var, 1, __pyx_n_s_iterkeys, (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_7);
-  __Pyx_XDECREF(__pyx_t_1);
-  __pyx_t_1 = __pyx_t_7;
-  __pyx_t_7 = 0;
-  while (1) {
-    __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_5, &__pyx_t_4, &__pyx_t_7, NULL, NULL, __pyx_t_6);
-    if (unlikely(__pyx_t_8 == 0)) break;
-    if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_7);
-    __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_7);
-    __pyx_t_7 = 0;
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_v_k))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_vars, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_INCREF(__pyx_v_self->name);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name);
+  __Pyx_GIVEREF(__pyx_v_self->name);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->dtype));
+  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_self->dtype));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->dtype));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->value));
+  PyTuple_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_v_self->value));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->value));
 
-  /* "adios.pyx":675
- *             'nattrs': f.nattrs,
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),             # <<<<<<<<<<<<<<
- *             'time_steps': (f.current_step, f.last_step),
- *             'file_size': f.file_size}
+  /* "adios.pyx":1136
+ * 
+ *     def __repr__(self):
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \             # <<<<<<<<<<<<<<
+ *                (self.name, self.dtype, self.value)
+ * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = 0;
-  if (unlikely(__pyx_v_f->attr == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iterkeys");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_f->attr, 1, __pyx_n_s_iterkeys, (&__pyx_t_4), (&__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_7);
-  __Pyx_XDECREF(__pyx_t_2);
-  __pyx_t_2 = __pyx_t_7;
-  __pyx_t_7 = 0;
-  while (1) {
-    __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_2, __pyx_t_4, &__pyx_t_5, &__pyx_t_7, NULL, NULL, __pyx_t_6);
-    if (unlikely(__pyx_t_8 == 0)) break;
-    if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_7);
-    __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_7);
-    __pyx_t_7 = 0;
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_v_k))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_AdiosAttr_name_r_dtype_r_value_r, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_attrs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
-  /* "adios.pyx":676
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
- *             'time_steps': (f.current_step, f.last_step),             # <<<<<<<<<<<<<<
- *             'file_size': f.file_size}
- */
-  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->current_step); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_7);
-  PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
-  __pyx_t_1 = 0;
-  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_time_steps, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-
-  /* "adios.pyx":677
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
- *             'time_steps': (f.current_step, f.last_step),
- *             'file_size': f.file_size}             # <<<<<<<<<<<<<<
- */
-  __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_f->file_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 677; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_7);
-  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_file_size, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-  __pyx_r = __pyx_t_3;
-  __pyx_t_3 = 0;
   goto __pyx_L0;
 
-  /* "adios.pyx":670
- *     return v.read(from_steps=0, nsteps=v.nsteps)
+  /* "adios.pyx":1135
+ *             raise KeyError(name)
  * 
- * def bpls(fname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     return {'nvars': f.nvars,
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \
+ *                (self.name, self.dtype, self.value)
  */
 
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_7);
-  __Pyx_AddTraceback("adios.bpls", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios.attr.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_f);
-  __Pyx_XDECREF(__pyx_v_k);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":194
- *         # experimental exception made for __getbuffer__ and __releasebuffer__
- *         # -- the details of this may change.
- *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
- *             # This implementation of getbuffer is geared towards Cython
- *             # requirements, and does not yet fullfill the PEP.
+/* "adios.pyx":1143
+ * cdef class smartdict(dict):
+ *     cdef factory
+ *     def __init__(self, factory):             # <<<<<<<<<<<<<<
+ *         dict.__init__(self)
+ *         self.factory = factory
  */
 
 /* Python wrapper */
-static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
-static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
+static int __pyx_pw_5adios_9smartdict_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_5adios_9smartdict_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_factory = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_factory,0};
+    PyObject* values[1] = {0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_factory)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+    }
+    __pyx_v_factory = values[0];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.smartdict.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_9smartdict___init__(((struct __pyx_obj_5adios_smartdict *)__pyx_v_self), __pyx_v_factory);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
-  int __pyx_v_copy_shape;
-  int __pyx_v_i;
-  int __pyx_v_ndim;
-  int __pyx_v_endian_detector;
-  int __pyx_v_little_endian;
-  int __pyx_v_t;
-  char *__pyx_v_f;
-  PyArray_Descr *__pyx_v_descr = 0;
-  int __pyx_v_offset;
-  int __pyx_v_hasfields;
+static int __pyx_pf_5adios_9smartdict___init__(struct __pyx_obj_5adios_smartdict *__pyx_v_self, PyObject *__pyx_v_factory) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  char *__pyx_t_7;
+  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getbuffer__", 0);
-  if (__pyx_v_info != NULL) {
-    __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
-    __Pyx_GIVEREF(__pyx_v_info->obj);
-  }
+  __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":200
- *             # of flags
- * 
- *             if info == NULL: return             # <<<<<<<<<<<<<<
+  /* "adios.pyx":1144
+ *     cdef factory
+ *     def __init__(self, factory):
+ *         dict.__init__(self)             # <<<<<<<<<<<<<<
+ *         self.factory = factory
  * 
- *             cdef int copy_shape, i, ndim
  */
-  __pyx_t_1 = ((__pyx_v_info == NULL) != 0);
-  if (__pyx_t_1) {
-    __pyx_r = 0;
-    goto __pyx_L0;
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)((PyObject*)(&PyDict_Type))), __pyx_n_s_init); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_3)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+    }
   }
+  if (!__pyx_t_3) {
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+  } else {
+    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = NULL;
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":203
- * 
- *             cdef int copy_shape, i, ndim
- *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<
- *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+  /* "adios.pyx":1145
+ *     def __init__(self, factory):
+ *         dict.__init__(self)
+ *         self.factory = factory             # <<<<<<<<<<<<<<
  * 
+ *     def __setitem__(self, key, value):
  */
-  __pyx_v_endian_detector = 1;
+  __Pyx_INCREF(__pyx_v_factory);
+  __Pyx_GIVEREF(__pyx_v_factory);
+  __Pyx_GOTREF(__pyx_v_self->factory);
+  __Pyx_DECREF(__pyx_v_self->factory);
+  __pyx_v_self->factory = __pyx_v_factory;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":204
- *             cdef int copy_shape, i, ndim
- *             cdef int endian_detector = 1
- *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
- * 
- *             ndim = PyArray_NDIM(self)
+  /* "adios.pyx":1143
+ * cdef class smartdict(dict):
+ *     cdef factory
+ *     def __init__(self, factory):             # <<<<<<<<<<<<<<
+ *         dict.__init__(self)
+ *         self.factory = factory
  */
-  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":206
- *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
- * 
- *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios.smartdict.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1147
+ *         self.factory = factory
  * 
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *     def __setitem__(self, key, value):             # <<<<<<<<<<<<<<
+ *         if key in dict.keys(self):
+ *             dict.__setitem__(self, key, value)
  */
-  __pyx_v_ndim = PyArray_NDIM(__pyx_v_self);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":208
- *             ndim = PyArray_NDIM(self)
+/* Python wrapper */
+static int __pyx_pw_5adios_9smartdict_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_key, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_5adios_9smartdict_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_key, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_9smartdict_2__setitem__(((struct __pyx_obj_5adios_smartdict *)__pyx_v_self), ((PyObject *)__pyx_v_key), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_9smartdict_2__setitem__(struct __pyx_obj_5adios_smartdict *__pyx_v_self, PyObject *__pyx_v_key, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  Py_ssize_t __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setitem__", 0);
+
+  /* "adios.pyx":1148
  * 
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
- *                 copy_shape = 1
- *             else:
+ *     def __setitem__(self, key, value):
+ *         if key in dict.keys(self):             # <<<<<<<<<<<<<<
+ *             dict.__setitem__(self, key, value)
+ *         else:
  */
-  __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0);
-  if (__pyx_t_1) {
+  if (unlikely(((PyObject *)__pyx_v_self) == Py_None)) {
+    PyErr_Format(PyExc_TypeError, "descriptor '%s' requires a '%s' object but received a 'NoneType'", "keys", "dict");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = __Pyx_PyDict_Keys(((PyObject*)__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = (__Pyx_PySequence_Contains(__pyx_v_key, __pyx_t_1, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = (__pyx_t_2 != 0);
+  if (__pyx_t_3) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":209
- * 
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
- *                 copy_shape = 1             # <<<<<<<<<<<<<<
- *             else:
- *                 copy_shape = 0
+    /* "adios.pyx":1149
+ *     def __setitem__(self, key, value):
+ *         if key in dict.keys(self):
+ *             dict.__setitem__(self, key, value)             # <<<<<<<<<<<<<<
+ *         else:
+ *             self.factory(key, value)
  */
-    __pyx_v_copy_shape = 1;
-    goto __pyx_L4;
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)((PyObject*)(&PyDict_Type))), __pyx_n_s_setitem); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_5)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_5);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    __pyx_t_7 = PyTuple_New(3+__pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    if (__pyx_t_5) {
+      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
+    }
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, ((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __Pyx_INCREF(__pyx_v_key);
+    PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_v_key);
+    __Pyx_GIVEREF(__pyx_v_key);
+    __Pyx_INCREF(__pyx_v_value);
+    PyTuple_SET_ITEM(__pyx_t_7, 2+__pyx_t_6, __pyx_v_value);
+    __Pyx_GIVEREF(__pyx_v_value);
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211
- *                 copy_shape = 1
- *             else:
- *                 copy_shape = 0             # <<<<<<<<<<<<<<
+    /* "adios.pyx":1151
+ *             dict.__setitem__(self, key, value)
+ *         else:
+ *             self.factory(key, value)             # <<<<<<<<<<<<<<
  * 
- *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ * cdef class writer:
  */
-    __pyx_v_copy_shape = 0;
+    __Pyx_INCREF(__pyx_v_self->factory);
+    __pyx_t_4 = __pyx_v_self->factory; __pyx_t_7 = NULL;
+    __pyx_t_6 = 0;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_7)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_7);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    __pyx_t_5 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    if (__pyx_t_7) {
+      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+    }
+    __Pyx_INCREF(__pyx_v_key);
+    PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_6, __pyx_v_key);
+    __Pyx_GIVEREF(__pyx_v_key);
+    __Pyx_INCREF(__pyx_v_value);
+    PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_6, __pyx_v_value);
+    __Pyx_GIVEREF(__pyx_v_value);
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
-  __pyx_L4:;
+  __pyx_L3:;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":213
- *                 copy_shape = 0
+  /* "adios.pyx":1147
+ *         self.factory = factory
  * 
- *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<
- *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not C contiguous")
+ *     def __setitem__(self, key, value):             # <<<<<<<<<<<<<<
+ *         if key in dict.keys(self):
+ *             dict.__setitem__(self, key, value)
  */
-  __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0);
-  if (__pyx_t_2) {
-  } else {
-    __pyx_t_1 = __pyx_t_2;
-    goto __pyx_L6_bool_binop_done;
-  }
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":214
- * 
- *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
- *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<
- *                 raise ValueError(u"ndarray is not C contiguous")
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("adios.smartdict.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1182
+ *     property fname:
+ *         """ The filename to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.fname
  * 
  */
-  __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0);
-  __pyx_t_1 = __pyx_t_2;
-  __pyx_L6_bool_binop_done:;
-  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":215
- *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
- *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_5fname_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_6writer_5fname_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_6writer_5fname___get__(((struct __pyx_obj_5adios_writer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_6writer_5fname___get__(struct __pyx_obj_5adios_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":1183
+ *         """ The filename to write. """
+ *         def __get__(self):
+ *             return self.fname             # <<<<<<<<<<<<<<
  * 
- *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ *     property gname:
  */
-    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->fname);
+  __pyx_r = __pyx_v_self->fname;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":217
- *                 raise ValueError(u"ndarray is not C contiguous")
+  /* "adios.pyx":1182
+ *     property fname:
+ *         """ The filename to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.fname
  * 
- *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<
- *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not Fortran contiguous")
  */
-  __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0);
-  if (__pyx_t_2) {
-  } else {
-    __pyx_t_1 = __pyx_t_2;
-    goto __pyx_L9_bool_binop_done;
-  }
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218
- * 
- *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
- *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<
- *                 raise ValueError(u"ndarray is not Fortran contiguous")
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1187
+ *     property gname:
+ *         """ The groupname associated with the file. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.gname
  * 
  */
-  __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0);
-  __pyx_t_1 = __pyx_t_2;
-  __pyx_L9_bool_binop_done:;
-  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":219
- *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
- *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_5gname_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_6writer_5gname_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_6writer_5gname___get__(((struct __pyx_obj_5adios_writer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_6writer_5gname___get__(struct __pyx_obj_5adios_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":1188
+ *         """ The groupname associated with the file. """
+ *         def __get__(self):
+ *             return self.gname             # <<<<<<<<<<<<<<
  * 
- *             info.buf = PyArray_DATA(self)
+ *     property is_noxml:
  */
-    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->gname);
+  __pyx_r = __pyx_v_self->gname;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":221
- *                 raise ValueError(u"ndarray is not Fortran contiguous")
+  /* "adios.pyx":1187
+ *     property gname:
+ *         """ The groupname associated with the file. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.gname
  * 
- *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<
- *             info.ndim = ndim
- *             if copy_shape:
  */
-  __pyx_v_info->buf = PyArray_DATA(__pyx_v_self);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1192
+ *     property is_noxml:
+ *         """ Boolean to indicate using No-XML or not. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_noxml
  * 
- *             info.buf = PyArray_DATA(self)
- *             info.ndim = ndim             # <<<<<<<<<<<<<<
- *             if copy_shape:
- *                 # Allocate new buffer for strides and shape info.
  */
-  __pyx_v_info->ndim = __pyx_v_ndim;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":223
- *             info.buf = PyArray_DATA(self)
- *             info.ndim = ndim
- *             if copy_shape:             # <<<<<<<<<<<<<<
- *                 # Allocate new buffer for strides and shape info.
- *                 # This is allocated as one block, strides first.
- */
-  __pyx_t_1 = (__pyx_v_copy_shape != 0);
-  if (__pyx_t_1) {
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_8is_noxml_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_6writer_8is_noxml_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_6writer_8is_noxml___get__(((struct __pyx_obj_5adios_writer *)__pyx_v_self));
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226
- *                 # Allocate new buffer for strides and shape info.
- *                 # This is allocated as one block, strides first.
- *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)             # <<<<<<<<<<<<<<
- *                 info.shape = info.strides + ndim
- *                 for i in range(ndim):
- */
-    __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2)));
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":227
- *                 # This is allocated as one block, strides first.
- *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)
- *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<
- *                 for i in range(ndim):
- *                     info.strides[i] = PyArray_STRIDES(self)[i]
- */
-    __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
+static PyObject *__pyx_pf_5adios_6writer_8is_noxml___get__(struct __pyx_obj_5adios_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":228
- *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)
- *                 info.shape = info.strides + ndim
- *                 for i in range(ndim):             # <<<<<<<<<<<<<<
- *                     info.strides[i] = PyArray_STRIDES(self)[i]
- *                     info.shape[i] = PyArray_DIMS(self)[i]
+  /* "adios.pyx":1193
+ *         """ Boolean to indicate using No-XML or not. """
+ *         def __get__(self):
+ *             return self.is_noxml             # <<<<<<<<<<<<<<
+ * 
+ *     property var:
  */
-    __pyx_t_4 = __pyx_v_ndim;
-    for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
-      __pyx_v_i = __pyx_t_5;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_noxml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":229
- *                 info.shape = info.strides + ndim
- *                 for i in range(ndim):
- *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<
- *                     info.shape[i] = PyArray_DIMS(self)[i]
- *             else:
+  /* "adios.pyx":1192
+ *     property is_noxml:
+ *         """ Boolean to indicate using No-XML or not. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_noxml
+ * 
  */
-      (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":230
- *                 for i in range(ndim):
- *                     info.strides[i] = PyArray_STRIDES(self)[i]
- *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<
- *             else:
- *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
- */
-      (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]);
-    }
-    goto __pyx_L11;
-  }
-  /*else*/ {
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.writer.is_noxml.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":232
- *                     info.shape[i] = PyArray_DIMS(self)[i]
- *             else:
- *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
- *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
- *             info.suboffsets = NULL
+/* "adios.pyx":1197
+ *     property var:
+ *         """ Dictionary of variables to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.var
+ * 
  */
-    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self));
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":233
- *             else:
- *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
- *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)             # <<<<<<<<<<<<<<
- *             info.suboffsets = NULL
- *             info.itemsize = PyArray_ITEMSIZE(self)
- */
-    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self));
-  }
-  __pyx_L11:;
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_3var_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_6writer_3var_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_6writer_3var___get__(((struct __pyx_obj_5adios_writer *)__pyx_v_self));
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":234
- *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
- *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
- *             info.suboffsets = NULL             # <<<<<<<<<<<<<<
- *             info.itemsize = PyArray_ITEMSIZE(self)
- *             info.readonly = not PyArray_ISWRITEABLE(self)
- */
-  __pyx_v_info->suboffsets = NULL;
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":235
- *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
- *             info.suboffsets = NULL
- *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<
- *             info.readonly = not PyArray_ISWRITEABLE(self)
+static PyObject *__pyx_pf_5adios_6writer_3var___get__(struct __pyx_obj_5adios_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":1198
+ *         """ Dictionary of variables to write. """
+ *         def __get__(self):
+ *             return self.var             # <<<<<<<<<<<<<<
  * 
+ *     property attr:
  */
-  __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->var);
+  __pyx_r = __pyx_v_self->var;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":236
- *             info.suboffsets = NULL
- *             info.itemsize = PyArray_ITEMSIZE(self)
- *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<
+  /* "adios.pyx":1197
+ *     property var:
+ *         """ Dictionary of variables to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.var
  * 
- *             cdef int t
  */
-  __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0));
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":239
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1202
+ *     property attr:
+ *         """ Dictionary of attributes to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.attr
  * 
- *             cdef int t
- *             cdef char* f = NULL             # <<<<<<<<<<<<<<
- *             cdef dtype descr = self.descr
- *             cdef list stack
  */
-  __pyx_v_f = NULL;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":240
- *             cdef int t
- *             cdef char* f = NULL
- *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<
- *             cdef list stack
- *             cdef int offset
- */
-  __pyx_t_3 = ((PyObject *)__pyx_v_self->descr);
-  __Pyx_INCREF(__pyx_t_3);
-  __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3);
-  __pyx_t_3 = 0;
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_4attr_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_6writer_4attr_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_6writer_4attr___get__(((struct __pyx_obj_5adios_writer *)__pyx_v_self));
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":244
- *             cdef int offset
- * 
- *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_6writer_4attr___get__(struct __pyx_obj_5adios_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios.pyx":1203
+ *         """ Dictionary of attributes to write. """
+ *         def __get__(self):
+ *             return self.attr             # <<<<<<<<<<<<<<
  * 
- *             if not hasfields and not copy_shape:
+ *     def __init__(self,char * fname,
  */
-  __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->attr);
+  __pyx_r = __pyx_v_self->attr;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":246
- *             cdef bint hasfields = PyDataType_HASFIELDS(descr)
+  /* "adios.pyx":1202
+ *     property attr:
+ *         """ Dictionary of attributes to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.attr
  * 
- *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<
- *                 # do not call releasebuffer
- *                 info.obj = None
  */
-  __pyx_t_2 = ((!(__pyx_v_hasfields != 0)) != 0);
-  if (__pyx_t_2) {
-  } else {
-    __pyx_t_1 = __pyx_t_2;
-    goto __pyx_L15_bool_binop_done;
-  }
-  __pyx_t_2 = ((!(__pyx_v_copy_shape != 0)) != 0);
-  __pyx_t_1 = __pyx_t_2;
-  __pyx_L15_bool_binop_done:;
-  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":248
- *             if not hasfields and not copy_shape:
- *                 # do not call releasebuffer
- *                 info.obj = None             # <<<<<<<<<<<<<<
- *             else:
- *                 # need to call releasebuffer
- */
-    __Pyx_INCREF(Py_None);
-    __Pyx_GIVEREF(Py_None);
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj);
-    __pyx_v_info->obj = Py_None;
-    goto __pyx_L14;
-  }
-  /*else*/ {
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":251
- *             else:
- *                 # need to call releasebuffer
- *                 info.obj = self             # <<<<<<<<<<<<<<
- * 
- *             if not hasfields:
- */
-    __Pyx_INCREF(((PyObject *)__pyx_v_self));
-    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj);
-    __pyx_v_info->obj = ((PyObject *)__pyx_v_self);
-  }
-  __pyx_L14:;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":253
- *                 info.obj = self
- * 
- *             if not hasfields:             # <<<<<<<<<<<<<<
- *                 t = descr.type_num
- *                 if ((descr.byteorder == c'>' and little_endian) or
- */
-  __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0);
-  if (__pyx_t_1) {
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":254
+/* "adios.pyx":1205
+ *             return self.attr
  * 
- *             if not hasfields:
- *                 t = descr.type_num             # <<<<<<<<<<<<<<
- *                 if ((descr.byteorder == c'>' and little_endian) or
- *                     (descr.byteorder == c'<' and not little_endian)):
+ *     def __init__(self,char * fname,             # <<<<<<<<<<<<<<
+ *                  bint is_noxml = True,
+ *                  MPI_Comm comm = MPI_COMM_WORLD):
  */
-    __pyx_t_4 = __pyx_v_descr->type_num;
-    __pyx_v_t = __pyx_t_4;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":255
- *             if not hasfields:
- *                 t = descr.type_num
- *                 if ((descr.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *                     (descr.byteorder == c'<' and not little_endian)):
- *                     raise ValueError(u"Non-native byte order not supported")
- */
-    __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0);
-    if (!__pyx_t_2) {
-      goto __pyx_L20_next_or;
+/* Python wrapper */
+static int __pyx_pw_5adios_6writer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_5adios_6writer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_fname;
+  int __pyx_v_is_noxml;
+  MPI_Comm __pyx_v_comm;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_is_noxml,&__pyx_n_s_comm,0};
+    PyObject* values[3] = {0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_is_noxml);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
+          if (value) { values[2] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1205; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
     } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
     }
-    __pyx_t_2 = (__pyx_v_little_endian != 0);
-    if (!__pyx_t_2) {
+    __pyx_v_fname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_fname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1205; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[1]) {
+      __pyx_v_is_noxml = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_is_noxml == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_t_1 = __pyx_t_2;
-      goto __pyx_L19_bool_binop_done;
-    }
-    __pyx_L20_next_or:;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":256
- *                 t = descr.type_num
- *                 if ((descr.byteorder == c'>' and little_endian) or
- *                     (descr.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
- *                     raise ValueError(u"Non-native byte order not supported")
- *                 if   t == NPY_BYTE:        f = "b"
+      /* "adios.pyx":1206
+ * 
+ *     def __init__(self,char * fname,
+ *                  bint is_noxml = True,             # <<<<<<<<<<<<<<
+ *                  MPI_Comm comm = MPI_COMM_WORLD):
+ *         self.fname = fname
  */
-    __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0);
-    if (__pyx_t_2) {
+      __pyx_v_is_noxml = ((int)1);
+    }
+    if (values[2]) {
+      __pyx_v_comm = __Pyx_PyInt_As_MPI_Comm(values[2]); if (unlikely((__pyx_v_comm == (MPI_Comm)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1207; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_t_1 = __pyx_t_2;
-      goto __pyx_L19_bool_binop_done;
+      __pyx_v_comm = __pyx_k__22;
     }
-    __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0);
-    __pyx_t_1 = __pyx_t_2;
-    __pyx_L19_bool_binop_done:;
-    if (__pyx_t_1) {
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1205; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.writer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_6writer___init__(((struct __pyx_obj_5adios_writer *)__pyx_v_self), __pyx_v_fname, __pyx_v_is_noxml, __pyx_v_comm);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257
- *                 if ((descr.byteorder == c'>' and little_endian) or
- *                     (descr.byteorder == c'<' and not little_endian)):
- *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
- *                 if   t == NPY_BYTE:        f = "b"
- *                 elif t == NPY_UBYTE:       f = "B"
+  /* "adios.pyx":1205
+ *             return self.attr
+ * 
+ *     def __init__(self,char * fname,             # <<<<<<<<<<<<<<
+ *                  bint is_noxml = True,
+ *                  MPI_Comm comm = MPI_COMM_WORLD):
  */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
- *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
- *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- */
-    switch (__pyx_v_t) {
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":258
- *                     (descr.byteorder == c'<' and not little_endian)):
- *                     raise ValueError(u"Non-native byte order not supported")
- *                 if   t == NPY_BYTE:        f = "b"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_UBYTE:       f = "B"
- *                 elif t == NPY_SHORT:       f = "h"
+static int __pyx_pf_5adios_6writer___init__(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_fname, int __pyx_v_is_noxml, MPI_Comm __pyx_v_comm) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__init__", 0);
+
+  /* "adios.pyx":1208
+ *                  bint is_noxml = True,
+ *                  MPI_Comm comm = MPI_COMM_WORLD):
+ *         self.fname = fname             # <<<<<<<<<<<<<<
+ *         self.method = <bytes>""
+ *         self.method_params = <bytes>""
  */
-      case NPY_BYTE:
-      __pyx_v_f = __pyx_k_b;
-      break;
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_fname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->fname);
+  __Pyx_DECREF(__pyx_v_self->fname);
+  __pyx_v_self->fname = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259
- *                     raise ValueError(u"Non-native byte order not supported")
- *                 if   t == NPY_BYTE:        f = "b"
- *                 elif t == NPY_UBYTE:       f = "B"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_SHORT:       f = "h"
- *                 elif t == NPY_USHORT:      f = "H"
+  /* "adios.pyx":1209
+ *                  MPI_Comm comm = MPI_COMM_WORLD):
+ *         self.fname = fname
+ *         self.method = <bytes>""             # <<<<<<<<<<<<<<
+ *         self.method_params = <bytes>""
+ *         self.is_noxml = is_noxml
  */
-      case NPY_UBYTE:
-      __pyx_v_f = __pyx_k_B;
-      break;
+  __pyx_t_1 = __pyx_kp_s__7;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->method);
+  __Pyx_DECREF(__pyx_v_self->method);
+  __pyx_v_self->method = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260
- *                 if   t == NPY_BYTE:        f = "b"
- *                 elif t == NPY_UBYTE:       f = "B"
- *                 elif t == NPY_SHORT:       f = "h"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_USHORT:      f = "H"
- *                 elif t == NPY_INT:         f = "i"
+  /* "adios.pyx":1210
+ *         self.fname = fname
+ *         self.method = <bytes>""
+ *         self.method_params = <bytes>""             # <<<<<<<<<<<<<<
+ *         self.is_noxml = is_noxml
+ *         self.comm = comm
  */
-      case NPY_SHORT:
-      __pyx_v_f = __pyx_k_h;
-      break;
+  __pyx_t_1 = __pyx_kp_s__7;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->method_params);
+  __Pyx_DECREF(__pyx_v_self->method_params);
+  __pyx_v_self->method_params = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":261
- *                 elif t == NPY_UBYTE:       f = "B"
- *                 elif t == NPY_SHORT:       f = "h"
- *                 elif t == NPY_USHORT:      f = "H"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_INT:         f = "i"
- *                 elif t == NPY_UINT:        f = "I"
+  /* "adios.pyx":1211
+ *         self.method = <bytes>""
+ *         self.method_params = <bytes>""
+ *         self.is_noxml = is_noxml             # <<<<<<<<<<<<<<
+ *         self.comm = comm
+ *         self.var = dict()
  */
-      case NPY_USHORT:
-      __pyx_v_f = __pyx_k_H;
-      break;
+  __pyx_v_self->is_noxml = __pyx_v_is_noxml;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":262
- *                 elif t == NPY_SHORT:       f = "h"
- *                 elif t == NPY_USHORT:      f = "H"
- *                 elif t == NPY_INT:         f = "i"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_UINT:        f = "I"
- *                 elif t == NPY_LONG:        f = "l"
+  /* "adios.pyx":1212
+ *         self.method_params = <bytes>""
+ *         self.is_noxml = is_noxml
+ *         self.comm = comm             # <<<<<<<<<<<<<<
+ *         self.var = dict()
+ *         self.attr = dict()
  */
-      case NPY_INT:
-      __pyx_v_f = __pyx_k_i;
-      break;
+  __pyx_v_self->comm = __pyx_v_comm;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":263
- *                 elif t == NPY_USHORT:      f = "H"
- *                 elif t == NPY_INT:         f = "i"
- *                 elif t == NPY_UINT:        f = "I"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_LONG:        f = "l"
- *                 elif t == NPY_ULONG:       f = "L"
+  /* "adios.pyx":1213
+ *         self.is_noxml = is_noxml
+ *         self.comm = comm
+ *         self.var = dict()             # <<<<<<<<<<<<<<
+ *         self.attr = dict()
+ * 
  */
-      case NPY_UINT:
-      __pyx_v_f = __pyx_k_I;
-      break;
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->var);
+  __Pyx_DECREF(__pyx_v_self->var);
+  __pyx_v_self->var = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":264
- *                 elif t == NPY_INT:         f = "i"
- *                 elif t == NPY_UINT:        f = "I"
- *                 elif t == NPY_LONG:        f = "l"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_ULONG:       f = "L"
- *                 elif t == NPY_LONGLONG:    f = "q"
+  /* "adios.pyx":1214
+ *         self.comm = comm
+ *         self.var = dict()
+ *         self.attr = dict()             # <<<<<<<<<<<<<<
+ * 
+ *     ##def __var_factory__(self, name, value):
  */
-      case NPY_LONG:
-      __pyx_v_f = __pyx_k_l;
-      break;
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->attr);
+  __Pyx_DECREF(__pyx_v_self->attr);
+  __pyx_v_self->attr = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":265
- *                 elif t == NPY_UINT:        f = "I"
- *                 elif t == NPY_LONG:        f = "l"
- *                 elif t == NPY_ULONG:       f = "L"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_LONGLONG:    f = "q"
- *                 elif t == NPY_ULONGLONG:   f = "Q"
+  /* "adios.pyx":1205
+ *             return self.attr
+ * 
+ *     def __init__(self,char * fname,             # <<<<<<<<<<<<<<
+ *                  bint is_noxml = True,
+ *                  MPI_Comm comm = MPI_COMM_WORLD):
  */
-      case NPY_ULONG:
-      __pyx_v_f = __pyx_k_L;
-      break;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":266
- *                 elif t == NPY_LONG:        f = "l"
- *                 elif t == NPY_ULONG:       f = "L"
- *                 elif t == NPY_LONGLONG:    f = "q"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_ULONGLONG:   f = "Q"
- *                 elif t == NPY_FLOAT:       f = "f"
- */
-      case NPY_LONGLONG:
-      __pyx_v_f = __pyx_k_q;
-      break;
-
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":267
- *                 elif t == NPY_ULONG:       f = "L"
- *                 elif t == NPY_LONGLONG:    f = "q"
- *                 elif t == NPY_ULONGLONG:   f = "Q"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_FLOAT:       f = "f"
- *                 elif t == NPY_DOUBLE:      f = "d"
- */
-      case NPY_ULONGLONG:
-      __pyx_v_f = __pyx_k_Q;
-      break;
-
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":268
- *                 elif t == NPY_LONGLONG:    f = "q"
- *                 elif t == NPY_ULONGLONG:   f = "Q"
- *                 elif t == NPY_FLOAT:       f = "f"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_DOUBLE:      f = "d"
- *                 elif t == NPY_LONGDOUBLE:  f = "g"
- */
-      case NPY_FLOAT:
-      __pyx_v_f = __pyx_k_f;
-      break;
-
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":269
- *                 elif t == NPY_ULONGLONG:   f = "Q"
- *                 elif t == NPY_FLOAT:       f = "f"
- *                 elif t == NPY_DOUBLE:      f = "d"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_LONGDOUBLE:  f = "g"
- *                 elif t == NPY_CFLOAT:      f = "Zf"
- */
-      case NPY_DOUBLE:
-      __pyx_v_f = __pyx_k_d;
-      break;
-
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":270
- *                 elif t == NPY_FLOAT:       f = "f"
- *                 elif t == NPY_DOUBLE:      f = "d"
- *                 elif t == NPY_LONGDOUBLE:  f = "g"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_CFLOAT:      f = "Zf"
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
- */
-      case NPY_LONGDOUBLE:
-      __pyx_v_f = __pyx_k_g;
-      break;
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.writer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":271
- *                 elif t == NPY_DOUBLE:      f = "d"
- *                 elif t == NPY_LONGDOUBLE:  f = "g"
- *                 elif t == NPY_CFLOAT:      f = "Zf"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+/* "adios.pyx":1222
+ *     ##    print "attr_factory:", name, value
+ * 
+ *     def declare_group(self, char * gname,             # <<<<<<<<<<<<<<
+ *                       char * method = "POSIX1",
+ *                       char * method_params = ""):
  */
-      case NPY_CFLOAT:
-      __pyx_v_f = __pyx_k_Zf;
-      break;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":272
- *                 elif t == NPY_LONGDOUBLE:  f = "g"
- *                 elif t == NPY_CFLOAT:      f = "Zf"
- *                 elif t == NPY_CDOUBLE:     f = "Zd"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
- *                 elif t == NPY_OBJECT:      f = "O"
- */
-      case NPY_CDOUBLE:
-      __pyx_v_f = __pyx_k_Zd;
-      break;
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_3declare_group(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_6writer_2declare_group[] = "writer.declare_group(self, char *gname, char *method='POSIX1', char *method_params='')\n\n        Define a group associated with the file.\n\n        Args:\n            gname (str): group name.\n            method (str, optional): Adios write method (default: 'POSIX1')\n            method_params (str, optional): parameters for the write method (default: '')\n\n        Example:\n\n        >>>  fw.declare_group('group', method='MPI_, [...]
+static PyObject *__pyx_pw_5adios_6writer_3declare_group(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_gname;
+  char *__pyx_v_method;
+  char *__pyx_v_method_params;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("declare_group (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_gname,&__pyx_n_s_method,&__pyx_n_s_method_params,0};
+    PyObject* values[3] = {0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method_params);
+          if (value) { values[2] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "declare_group") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_gname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_gname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[1]) {
+      __pyx_v_method = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1223; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_method = ((char *)__pyx_k_POSIX1);
+    }
+    if (values[2]) {
+      __pyx_v_method_params = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_method_params) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1224; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_method_params = ((char *)__pyx_k__7);
+    }
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("declare_group", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.writer.declare_group", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_6writer_2declare_group(((struct __pyx_obj_5adios_writer *)__pyx_v_self), __pyx_v_gname, __pyx_v_method, __pyx_v_method_params);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":273
- *                 elif t == NPY_CFLOAT:      f = "Zf"
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_OBJECT:      f = "O"
- *                 else:
- */
-      case NPY_CLONGDOUBLE:
-      __pyx_v_f = __pyx_k_Zg;
-      break;
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
- *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
- *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- */
-      case NPY_OBJECT:
-      __pyx_v_f = __pyx_k_O;
-      break;
-      default:
+static PyObject *__pyx_pf_5adios_6writer_2declare_group(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_gname, char *__pyx_v_method, char *__pyx_v_method_params) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int64_t __pyx_t_1;
+  struct __pyx_opt_args_5adios_declare_group __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  char *__pyx_t_4;
+  char *__pyx_t_5;
+  struct __pyx_opt_args_5adios_select_method __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("declare_group", 0);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":276
- *                 elif t == NPY_OBJECT:      f = "O"
- *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
- *                 info.format = f
- *                 return
+  /* "adios.pyx":1238
+ * 
+ *         """
+ *         self.gid = declare_group(gname, "", 1)             # <<<<<<<<<<<<<<
+ *         self.gname = gname
+ *         self.method = method
  */
-      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6);
-      __Pyx_GIVEREF(__pyx_t_6);
-      __pyx_t_6 = 0;
-      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_Raise(__pyx_t_6, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      break;
-    }
+  __pyx_t_2.__pyx_n = 2;
+  __pyx_t_2.time_index = __pyx_k__7;
+  __pyx_t_2.stats = 1;
+  __pyx_t_1 = __pyx_f_5adios_declare_group(__pyx_v_gname, 0, &__pyx_t_2); 
+  __pyx_v_self->gid = __pyx_t_1;
+
+  /* "adios.pyx":1239
+ *         """
+ *         self.gid = declare_group(gname, "", 1)
+ *         self.gname = gname             # <<<<<<<<<<<<<<
+ *         self.method = method
+ *         self.method_params = method_params
+ */
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_gname); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->gname);
+  __Pyx_DECREF(__pyx_v_self->gname);
+  __pyx_v_self->gname = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277
- *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- *                 info.format = f             # <<<<<<<<<<<<<<
- *                 return
- *             else:
+  /* "adios.pyx":1240
+ *         self.gid = declare_group(gname, "", 1)
+ *         self.gname = gname
+ *         self.method = method             # <<<<<<<<<<<<<<
+ *         self.method_params = method_params
+ *         select_method(self.gid, self.method, self.method_params, "")
  */
-    __pyx_v_info->format = __pyx_v_f;
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_method); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->method);
+  __Pyx_DECREF(__pyx_v_self->method);
+  __pyx_v_self->method = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":278
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- *                 info.format = f
- *                 return             # <<<<<<<<<<<<<<
- *             else:
- *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+  /* "adios.pyx":1241
+ *         self.gname = gname
+ *         self.method = method
+ *         self.method_params = method_params             # <<<<<<<<<<<<<<
+ *         select_method(self.gid, self.method, self.method_params, "")
+ * 
  */
-    __pyx_r = 0;
-    goto __pyx_L0;
-  }
-  /*else*/ {
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_method_params); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->method_params);
+  __Pyx_DECREF(__pyx_v_self->method_params);
+  __pyx_v_self->method_params = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":280
- *                 return
- *             else:
- *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<
- *                 info.format[0] = c'^' # Native data types, manual alignment
- *                 offset = 0
+  /* "adios.pyx":1242
+ *         self.method = method
+ *         self.method_params = method_params
+ *         select_method(self.gid, self.method, self.method_params, "")             # <<<<<<<<<<<<<<
+ * 
+ *     def define_var(self, char * varname,
  */
-    __pyx_v_info->format = ((char *)malloc(255));
+  __pyx_t_4 = __Pyx_PyObject_AsString(__pyx_v_self->method); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyObject_AsString(__pyx_v_self->method_params); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6.__pyx_n = 2;
+  __pyx_t_6.parameters = __pyx_t_5;
+  __pyx_t_6.base_path = __pyx_k__7;
+  __pyx_f_5adios_select_method(__pyx_v_self->gid, __pyx_t_4, 0, &__pyx_t_6); 
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":281
- *             else:
- *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
- *                 info.format[0] = c'^' # Native data types, manual alignment             # <<<<<<<<<<<<<<
- *                 offset = 0
- *                 f = _util_dtypestring(descr, info.format + 1,
+  /* "adios.pyx":1222
+ *     ##    print "attr_factory:", name, value
+ * 
+ *     def declare_group(self, char * gname,             # <<<<<<<<<<<<<<
+ *                       char * method = "POSIX1",
+ *                       char * method_params = ""):
  */
-    (__pyx_v_info->format[0]) = '^';
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":282
- *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
- *                 info.format[0] = c'^' # Native data types, manual alignment
- *                 offset = 0             # <<<<<<<<<<<<<<
- *                 f = _util_dtypestring(descr, info.format + 1,
- *                                       info.format + _buffer_format_string_len,
- */
-    __pyx_v_offset = 0;
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios.writer.declare_group", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":283
- *                 info.format[0] = c'^' # Native data types, manual alignment
- *                 offset = 0
- *                 f = _util_dtypestring(descr, info.format + 1,             # <<<<<<<<<<<<<<
- *                                       info.format + _buffer_format_string_len,
- *                                       &offset)
+/* "adios.pyx":1244
+ *         select_method(self.gid, self.method, self.method_params, "")
+ * 
+ *     def define_var(self, char * varname,             # <<<<<<<<<<<<<<
+ *                    ldim = tuple(),
+ *                    gdim = tuple(),
  */
-    __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_f = __pyx_t_7;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":286
- *                                       info.format + _buffer_format_string_len,
- *                                       &offset)
- *                 f[0] = c'\0' # Terminate format string             # <<<<<<<<<<<<<<
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_5define_var(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_6writer_4define_var[] = "writer.define_var(self, char *varname, ldim=<\077\077?>, gdim=<\077\077?>, offset=<\077\077?>)\n\n        Define a variable associated with the file.\n\n        Args:\n            varname (str): variable name.\n            ldim (tuple, optional): local dimension (default: tuple())\n            gdim (tuple, optional): global dimension (default: tuple())\n            offset (tuple, optional): offset (default: tuple())\n\n        Example [...]
+static PyObject *__pyx_pw_5adios_6writer_5define_var(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_varname;
+  PyObject *__pyx_v_ldim = 0;
+  PyObject *__pyx_v_gdim = 0;
+  PyObject *__pyx_v_offset = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define_var (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_varname,&__pyx_n_s_ldim,&__pyx_n_s_gdim,&__pyx_n_s_offset,0};
+    PyObject* values[4] = {0,0,0,0};
+    values[1] = __pyx_k__23;
+    values[2] = __pyx_k__24;
+    values[3] = __pyx_k__25;
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_varname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ldim);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gdim);
+          if (value) { values[2] = value; kw_args--; }
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_offset);
+          if (value) { values[3] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_var") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1244; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_varname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_varname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1244; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_ldim = values[1];
+    __pyx_v_gdim = values[2];
+    __pyx_v_offset = values[3];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("define_var", 0, 1, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1244; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.writer.define_var", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_6writer_4define_var(((struct __pyx_obj_5adios_writer *)__pyx_v_self), __pyx_v_varname, __pyx_v_ldim, __pyx_v_gdim, __pyx_v_offset);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_6writer_4define_var(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_varname, PyObject *__pyx_v_ldim, PyObject *__pyx_v_gdim, PyObject *__pyx_v_offset) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define_var", 0);
+
+  /* "adios.pyx":1264
  * 
- *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ *         """
+ *         self.var[varname] = varinfo(varname, ldim, gdim, offset)             # <<<<<<<<<<<<<<
+ * 
+ *     def define_attr(self, char * attrname):
  */
-    (__pyx_v_f[0]) = '\x00';
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_varname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_ldim);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_ldim);
+  __Pyx_GIVEREF(__pyx_v_ldim);
+  __Pyx_INCREF(__pyx_v_gdim);
+  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_gdim);
+  __Pyx_GIVEREF(__pyx_v_gdim);
+  __Pyx_INCREF(__pyx_v_offset);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_offset);
+  __Pyx_GIVEREF(__pyx_v_offset);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_varinfo)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
+  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_varname); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_t_2, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":194
- *         # experimental exception made for __getbuffer__ and __releasebuffer__
- *         # -- the details of this may change.
- *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
- *             # This implementation of getbuffer is geared towards Cython
- *             # requirements, and does not yet fullfill the PEP.
+  /* "adios.pyx":1244
+ *         select_method(self.gid, self.method, self.method_params, "")
+ * 
+ *     def define_var(self, char * varname,             # <<<<<<<<<<<<<<
+ *                    ldim = tuple(),
+ *                    gdim = tuple(),
  */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) {
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;
-  }
-  goto __pyx_L2;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("adios.writer.define_var", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
-  if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) {
-    __Pyx_GOTREF(Py_None);
-    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;
-  }
-  __pyx_L2:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_descr);
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":288
- *                 f[0] = c'\0' # Terminate format string
+/* "adios.pyx":1266
+ *         self.var[varname] = varinfo(varname, ldim, gdim, offset)
  * 
- *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
- *             if PyArray_HASFIELDS(self):
- *                 stdlib.free(info.format)
+ *     def define_attr(self, char * attrname):             # <<<<<<<<<<<<<<
+ *         """
+ *         Define attribute in the file.
  */
 
 /* Python wrapper */
-static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
-static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0);
-  __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-}
-
-static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
+static PyObject *__pyx_pw_5adios_6writer_7define_attr(PyObject *__pyx_v_self, PyObject *__pyx_arg_attrname); /*proto*/
+static char __pyx_doc_5adios_6writer_6define_attr[] = "writer.define_attr(self, char *attrname)\n\n        Define attribute in the file.\n\n        Args:\n            attrname (str): attribute name.\n        ";
+static PyObject *__pyx_pw_5adios_6writer_7define_attr(PyObject *__pyx_v_self, PyObject *__pyx_arg_attrname) {
+  char *__pyx_v_attrname;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__releasebuffer__", 0);
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":289
- * 
- *         def __releasebuffer__(ndarray self, Py_buffer* info):
- *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<
- *                 stdlib.free(info.format)
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
- */
-  __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0);
-  if (__pyx_t_1) {
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":290
- *         def __releasebuffer__(ndarray self, Py_buffer* info):
- *             if PyArray_HASFIELDS(self):
- *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
- *                 stdlib.free(info.strides)
- */
-    free(__pyx_v_info->format);
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291
- *             if PyArray_HASFIELDS(self):
- *                 stdlib.free(info.format)
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
- *                 stdlib.free(info.strides)
- *                 # info.shape was stored after info.strides in the same block
- */
-  __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0);
-  if (__pyx_t_1) {
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":292
- *                 stdlib.free(info.format)
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
- *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<
- *                 # info.shape was stored after info.strides in the same block
- * 
- */
-    free(__pyx_v_info->strides);
-    goto __pyx_L4;
+  __Pyx_RefNannySetupContext("define_attr (wrapper)", 0);
+  assert(__pyx_arg_attrname); {
+    __pyx_v_attrname = __Pyx_PyObject_AsString(__pyx_arg_attrname); if (unlikely((!__pyx_v_attrname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1266; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
-  __pyx_L4:;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":288
- *                 f[0] = c'\0' # Terminate format string
- * 
- *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
- *             if PyArray_HASFIELDS(self):
- *                 stdlib.free(info.format)
- */
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.writer.define_attr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_6writer_6define_attr(((struct __pyx_obj_5adios_writer *)__pyx_v_self), ((char *)__pyx_v_attrname));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":768
- * ctypedef npy_cdouble     complex_t
- * 
- * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(1, <void*>a)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {
+static PyObject *__pyx_pf_5adios_6writer_6define_attr(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_attrname) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0);
+  __Pyx_RefNannySetupContext("define_attr", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":769
+  /* "adios.pyx":1274
+ *         """
  * 
- * cdef inline object PyArray_MultiIterNew1(a):
- *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
+ *         self.attr[attrname] = attrinfo(attrname, is_static=True)             # <<<<<<<<<<<<<<
  * 
- * cdef inline object PyArray_MultiIterNew2(a, b):
+ *     def define_dynamic_attr(self, char * attrname,
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_attrname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_is_static, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_attrinfo)), __pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_attrname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (unlikely(PyDict_SetItem(__pyx_v_self->attr, __pyx_t_1, __pyx_t_3) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":768
- * ctypedef npy_cdouble     complex_t
- * 
- * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(1, <void*>a)
+  /* "adios.pyx":1266
+ *         self.var[varname] = varinfo(varname, ldim, gdim, offset)
  * 
+ *     def define_attr(self, char * attrname):             # <<<<<<<<<<<<<<
+ *         """
+ *         Define attribute in the file.
  */
 
   /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios.writer.define_attr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771
- *     return PyArray_MultiIterNew(1, <void*>a)
- * 
- * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+/* "adios.pyx":1276
+ *         self.attr[attrname] = attrinfo(attrname, is_static=True)
  * 
+ *     def define_dynamic_attr(self, char * attrname,             # <<<<<<<<<<<<<<
+ *                             char * varname,
+ *                             dtype):
  */
 
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_9define_dynamic_attr(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_6writer_8define_dynamic_attr[] = "writer.define_dynamic_attr(self, char *attrname, char *varname, dtype)";
+static PyObject *__pyx_pw_5adios_6writer_9define_dynamic_attr(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_attrname;
+  char *__pyx_v_varname;
+  PyObject *__pyx_v_dtype = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0);
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":772
- * 
- * cdef inline object PyArray_MultiIterNew2(a, b):
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771
- *     return PyArray_MultiIterNew(1, <void*>a)
- * 
- * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
- * 
- */
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define_dynamic_attr (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_attrname,&__pyx_n_s_varname,&__pyx_n_s_dtype,0};
+    PyObject* values[3] = {0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_attrname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_varname)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_dynamic_attr", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  2:
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dtype)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_dynamic_attr", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_dynamic_attr") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+    }
+    __pyx_v_attrname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_attrname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_varname = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_varname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_dtype = values[2];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("define_dynamic_attr", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.writer.define_dynamic_attr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_6writer_8define_dynamic_attr(((struct __pyx_obj_5adios_writer *)__pyx_v_self), __pyx_v_attrname, __pyx_v_varname, __pyx_v_dtype);
 
   /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {
+static PyObject *__pyx_pf_5adios_6writer_8define_dynamic_attr(struct __pyx_obj_5adios_writer *__pyx_v_self, char *__pyx_v_attrname, char *__pyx_v_varname, PyObject *__pyx_v_dtype) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0);
+  __Pyx_RefNannySetupContext("define_dynamic_attr", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":775
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+  /* "adios.pyx":1279
+ *                             char * varname,
+ *                             dtype):
+ *         self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)             # <<<<<<<<<<<<<<
+ *     def __setitem__(self, name, val):
+ *         if self.var.has_key(name):
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_attrname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
+  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_varname); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_dtype);
+  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_dtype);
+  __Pyx_GIVEREF(__pyx_v_dtype);
   __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __pyx_t_2 = 0;
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_is_static, Py_False) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_attrinfo)), __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_attrname); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (unlikely(PyDict_SetItem(__pyx_v_self->attr, __pyx_t_2, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+  /* "adios.pyx":1276
+ *         self.attr[attrname] = attrinfo(attrname, is_static=True)
  * 
+ *     def define_dynamic_attr(self, char * attrname,             # <<<<<<<<<<<<<<
+ *                             char * varname,
+ *                             dtype):
  */
 
   /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios.writer.define_dynamic_attr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
- * 
+/* "adios.pyx":1280
+ *                             dtype):
+ *         self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)
+ *     def __setitem__(self, name, val):             # <<<<<<<<<<<<<<
+ *         if self.var.has_key(name):
+ *             self.var[name].value = val
  */
 
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {
-  PyObject *__pyx_r = NULL;
+/* Python wrapper */
+static int __pyx_pw_5adios_6writer_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pw_5adios_6writer_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_val) {
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0);
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":778
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
- * 
- */
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_6writer_10__setitem__(((struct __pyx_obj_5adios_writer *)__pyx_v_self), ((PyObject *)__pyx_v_name), ((PyObject *)__pyx_v_val));
 
   /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {
-  PyObject *__pyx_r = NULL;
+static int __pyx_pf_5adios_6writer_10__setitem__(struct __pyx_obj_5adios_writer *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_val) {
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0);
+  __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":781
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
- * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
+  /* "adios.pyx":1281
+ *         self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)
+ *     def __setitem__(self, name, val):
+ *         if self.var.has_key(name):             # <<<<<<<<<<<<<<
+ *             self.var[name].value = val
+ *         elif self.attr.has_key(name):
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = PyDict_Contains(__pyx_v_self->var, __pyx_v_name); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+    /* "adios.pyx":1282
+ *     def __setitem__(self, name, val):
+ *         if self.var.has_key(name):
+ *             self.var[name].value = val             # <<<<<<<<<<<<<<
+ *         elif self.attr.has_key(name):
+ *             self.attr[name].value = val
+ */
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_self->var, __pyx_v_name); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1282; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    if (__Pyx_PyObject_SetAttrStr(__pyx_t_3, __pyx_n_s_value, __pyx_v_val) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    goto __pyx_L3;
+  }
+
+  /* "adios.pyx":1283
+ *         if self.var.has_key(name):
+ *             self.var[name].value = val
+ *         elif self.attr.has_key(name):             # <<<<<<<<<<<<<<
+ *             self.attr[name].value = val
+ *         else:
+ */
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_2 = PyDict_Contains(__pyx_v_self->attr, __pyx_v_name); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__pyx_t_2 != 0);
+  if (__pyx_t_1) {
+
+    /* "adios.pyx":1284
+ *             self.var[name].value = val
+ *         elif self.attr.has_key(name):
+ *             self.attr[name].value = val             # <<<<<<<<<<<<<<
+ *         else:
+ *             self.var[name] = val
+ */
+    if (unlikely(__pyx_v_self->attr == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_self->attr, __pyx_v_name); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1284; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    if (__Pyx_PyObject_SetAttrStr(__pyx_t_3, __pyx_n_s_value, __pyx_v_val) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "adios.pyx":1286
+ *             self.attr[name].value = val
+ *         else:
+ *             self.var[name] = val             # <<<<<<<<<<<<<<
  * 
+ *     def __getitem__(self, name):
+ */
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_v_name, __pyx_v_val) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_L3:;
+
+  /* "adios.pyx":1280
+ *                             dtype):
+ *         self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)
+ *     def __setitem__(self, name, val):             # <<<<<<<<<<<<<<
+ *         if self.var.has_key(name):
+ *             self.var[name].value = val
  */
 
   /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios.writer.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+/* "adios.pyx":1288
+ *             self.var[name] = val
  * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
- *     # Recursive utility function used in __getbuffer__ to get format
- *     # string. The new location in the format string is returned.
+ *     def __getitem__(self, name):             # <<<<<<<<<<<<<<
+ *         if self.var.has_key(name):
+ *             return self.var[name].value
  */
 
-static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
-  PyArray_Descr *__pyx_v_child = 0;
-  int __pyx_v_endian_detector;
-  int __pyx_v_little_endian;
-  PyObject *__pyx_v_fields = 0;
-  PyObject *__pyx_v_childname = NULL;
-  PyObject *__pyx_v_new_offset = NULL;
-  PyObject *__pyx_v_t = NULL;
-  char *__pyx_r;
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_name); /*proto*/
+static PyObject *__pyx_pw_5adios_6writer_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_name) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_6writer_12__getitem__(((struct __pyx_obj_5adios_writer *)__pyx_v_self), ((PyObject *)__pyx_v_name));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_6writer_12__getitem__(struct __pyx_obj_5adios_writer *__pyx_v_self, PyObject *__pyx_v_name) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
   PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  long __pyx_t_8;
-  char *__pyx_t_9;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_util_dtypestring", 0);
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":790
- *     cdef int delta_offset
- *     cdef tuple i
- *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
- *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
- *     cdef tuple fields
- */
-  __pyx_v_endian_detector = 1;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":791
- *     cdef tuple i
- *     cdef int endian_detector = 1
- *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
- *     cdef tuple fields
+  /* "adios.pyx":1289
  * 
+ *     def __getitem__(self, name):
+ *         if self.var.has_key(name):             # <<<<<<<<<<<<<<
+ *             return self.var[name].value
+ *         elif self.attr.has_key(name):
  */
-  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = PyDict_Contains(__pyx_v_self->var, __pyx_v_name); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794
- *     cdef tuple fields
- * 
- *     for childname in descr.names:             # <<<<<<<<<<<<<<
- *         fields = descr.fields[childname]
- *         child, new_offset = fields
+    /* "adios.pyx":1290
+ *     def __getitem__(self, name):
+ *         if self.var.has_key(name):
+ *             return self.var[name].value             # <<<<<<<<<<<<<<
+ *         elif self.attr.has_key(name):
+ *             return self.attr[name].value
  */
-  if (unlikely(__pyx_v_descr->names == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_XDECREF(__pyx_r);
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_self->var, __pyx_v_name); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1290; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_r = __pyx_t_4;
+    __pyx_t_4 = 0;
+    goto __pyx_L0;
   }
-  __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
-  for (;;) {
-    if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-    #if CYTHON_COMPILING_IN_CPYTHON
-    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #else
-    __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #endif
-    __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3);
-    __pyx_t_3 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":795
- * 
- *     for childname in descr.names:
- *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
- *         child, new_offset = fields
- * 
+  /* "adios.pyx":1291
+ *         if self.var.has_key(name):
+ *             return self.var[name].value
+ *         elif self.attr.has_key(name):             # <<<<<<<<<<<<<<
+ *             return self.attr[name].value
+ *         else:
  */
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-    __Pyx_GOTREF(__pyx_t_3);
-    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3));
-    __pyx_t_3 = 0;
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_2 = PyDict_Contains(__pyx_v_self->attr, __pyx_v_name); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__pyx_t_2 != 0);
+  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":796
- *     for childname in descr.names:
- *         fields = descr.fields[childname]
- *         child, new_offset = fields             # <<<<<<<<<<<<<<
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
+    /* "adios.pyx":1292
+ *             return self.var[name].value
+ *         elif self.attr.has_key(name):
+ *             return self.attr[name].value             # <<<<<<<<<<<<<<
+ *         else:
+ *             raise KeyError(name)
  */
-    if (likely(__pyx_v_fields != Py_None)) {
-      PyObject* sequence = __pyx_v_fields;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 2)) {
-        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
-      __Pyx_INCREF(__pyx_t_3);
-      __Pyx_INCREF(__pyx_t_4);
-      #else
-      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      #endif
-    } else {
-      __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_XDECREF(__pyx_r);
+    if (unlikely(__pyx_v_self->attr == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3));
+    __pyx_t_4 = __Pyx_PyDict_GetItem(__pyx_v_self->attr, __pyx_v_name); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1292; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
-    __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4);
-    __pyx_t_4 = 0;
+    goto __pyx_L0;
+  }
+  /*else*/ {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798
- *         child, new_offset = fields
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+    /* "adios.pyx":1294
+ *             return self.attr[name].value
+ *         else:
+ *             raise KeyError(name)             # <<<<<<<<<<<<<<
  * 
+ *     def close(self):
  */
-    __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_INCREF(__pyx_v_name);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_name);
+    __Pyx_GIVEREF(__pyx_v_name);
+    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_KeyError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0);
-    if (__pyx_t_6) {
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
+  /* "adios.pyx":1288
+ *             self.var[name] = val
  * 
- *         if ((child.byteorder == c'>' and little_endian) or
+ *     def __getitem__(self, name):             # <<<<<<<<<<<<<<
+ *         if self.var.has_key(name):
+ *             return self.var[name].value
  */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
- * 
- *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")
- */
-    __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0);
-    if (!__pyx_t_7) {
-      goto __pyx_L8_next_or;
-    } else {
-    }
-    __pyx_t_7 = (__pyx_v_little_endian != 0);
-    if (!__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L7_bool_binop_done;
-    }
-    __pyx_L8_next_or:;
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios.writer.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802
+/* "adios.pyx":1296
+ *             raise KeyError(name)
  * 
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
- *             raise ValueError(u"Non-native byte order not supported")
- *             # One could encode it in the format string and have Cython
- */
-    __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0);
-    if (__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L7_bool_binop_done;
-    }
-    __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0);
-    __pyx_t_6 = __pyx_t_7;
-    __pyx_L7_bool_binop_done:;
-    if (__pyx_t_6) {
-
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":803
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
- *             # One could encode it in the format string and have Cython
- *             # complain instead, BUT: < and > in format strings also imply
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         """
+ *         Write variables and attributes to a file and close the writer.
  */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":813
- * 
- *         # Output padding bytes
- *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
- *             f[0] = 120 # "x"; pad byte
- *             f += 1
- */
-    while (1) {
-      __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (!__pyx_t_6) break;
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_15close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_5adios_6writer_14close[] = "writer.close(self)\n\n        Write variables and attributes to a file and close the writer.\n        ";
+static PyObject *__pyx_pw_5adios_6writer_15close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("close (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_6writer_14close(((struct __pyx_obj_5adios_writer *)__pyx_v_self));
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":814
- *         # Output padding bytes
- *         while offset[0] < new_offset:
- *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
- *             f += 1
- *             offset[0] += 1
- */
-      (__pyx_v_f[0]) = 120;
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":815
- *         while offset[0] < new_offset:
- *             f[0] = 120 # "x"; pad byte
- *             f += 1             # <<<<<<<<<<<<<<
- *             offset[0] += 1
- * 
- */
-      __pyx_v_f = (__pyx_v_f + 1);
+static PyObject *__pyx_pf_5adios_6writer_14close(struct __pyx_obj_5adios_writer *__pyx_v_self) {
+  int64_t __pyx_v_fd;
+  PyObject *__pyx_v_extra_var = NULL;
+  PyObject *__pyx_v_extra_attr = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_v_val = NULL;
+  PyObject *__pyx_v_n = NULL;
+  PyObject *__pyx_v_groupsize = NULL;
+  PyObject *__pyx_v_var = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  char *__pyx_t_1;
+  char *__pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  Py_ssize_t __pyx_t_5;
+  int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  int __pyx_t_10;
+  int __pyx_t_11;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  PyObject *__pyx_t_14 = NULL;
+  PyObject *(*__pyx_t_15)(PyObject *);
+  uint64_t __pyx_t_16;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("close", 0);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":816
- *             f[0] = 120 # "x"; pad byte
- *             f += 1
- *             offset[0] += 1             # <<<<<<<<<<<<<<
+  /* "adios.pyx":1300
+ *         Write variables and attributes to a file and close the writer.
+ *         """
+ *         fd = open(self.gname, self.fname, "w")             # <<<<<<<<<<<<<<
  * 
- *         offset[0] += child.itemsize
+ *         extra_var = dict()
  */
-      __pyx_t_8 = 0;
-      (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1);
-    }
+  __pyx_t_1 = __Pyx_PyObject_AsString(__pyx_v_self->gname); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_AsString(__pyx_v_self->fname); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_fd = __pyx_f_5adios_open(__pyx_t_1, __pyx_t_2, __pyx_k_w, 0, NULL);
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":818
- *             offset[0] += 1
+  /* "adios.pyx":1302
+ *         fd = open(self.gname, self.fname, "w")
  * 
- *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
+ *         extra_var = dict()             # <<<<<<<<<<<<<<
+ *         extra_attr = dict()
  * 
- *         if not PyDataType_HASFIELDS(child):
  */
-    __pyx_t_8 = 0;
-    (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize);
+  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_extra_var = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":820
- *         offset[0] += child.itemsize
+  /* "adios.pyx":1303
  * 
- *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
- *             t = child.type_num
- *             if end - f < 5:
- */
-    __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0);
-    if (__pyx_t_6) {
-
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":821
+ *         extra_var = dict()
+ *         extra_attr = dict()             # <<<<<<<<<<<<<<
  * 
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num             # <<<<<<<<<<<<<<
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")
+ *         for key, val in self.var.iteritems():
  */
-      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4);
-      __pyx_t_4 = 0;
+  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_extra_attr = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":822
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num
- *             if end - f < 5:             # <<<<<<<<<<<<<<
- *                 raise RuntimeError(u"Format string allocated too short.")
+  /* "adios.pyx":1305
+ *         extra_attr = dict()
  * 
+ *         for key, val in self.var.iteritems():             # <<<<<<<<<<<<<<
+ *             if not isinstance(val, varinfo):
+ *                 n = np.array(val)
  */
-      __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0);
-      if (__pyx_t_6) {
-
-        /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823
- *             t = child.type_num
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
- * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- */
-        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
+  __pyx_t_4 = 0;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_self->var, 1, __pyx_n_s_iteritems, (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_3);
+  __pyx_t_3 = __pyx_t_7;
+  __pyx_t_7 = 0;
+  while (1) {
+    __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_5, &__pyx_t_4, &__pyx_t_7, &__pyx_t_8, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_9 == 0)) break;
+    if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_7);
+    __pyx_t_7 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_8);
+    __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826
- * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- */
-      __pyx_t_4 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 98;
-        goto __pyx_L15;
+    /* "adios.pyx":1306
+ * 
+ *         for key, val in self.var.iteritems():
+ *             if not isinstance(val, varinfo):             # <<<<<<<<<<<<<<
+ *                 n = np.array(val)
+ *                 extra_var[key] = varinfo(key, n.shape)
+ */
+    __pyx_t_10 = __Pyx_TypeCheck(__pyx_v_val, ((PyObject*)__pyx_ptype_5adios_varinfo)); 
+    __pyx_t_11 = ((!(__pyx_t_10 != 0)) != 0);
+    if (__pyx_t_11) {
+
+      /* "adios.pyx":1307
+ *         for key, val in self.var.iteritems():
+ *             if not isinstance(val, varinfo):
+ *                 n = np.array(val)             # <<<<<<<<<<<<<<
+ *                 extra_var[key] = varinfo(key, n.shape)
+ *                 extra_var[key].value = val
+ */
+      __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_array); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_12);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_7 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_12))) {
+        __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12);
+        if (likely(__pyx_t_7)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+          __Pyx_INCREF(__pyx_t_7);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_12, function);
+        }
       }
+      if (!__pyx_t_7) {
+        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_v_val); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+      } else {
+        __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_13);
+        PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+        __Pyx_INCREF(__pyx_v_val);
+        PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_val);
+        __Pyx_GIVEREF(__pyx_v_val);
+        __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      __Pyx_XDECREF_SET(__pyx_v_n, __pyx_t_8);
+      __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":827
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+      /* "adios.pyx":1308
+ *             if not isinstance(val, varinfo):
+ *                 n = np.array(val)
+ *                 extra_var[key] = varinfo(key, n.shape)             # <<<<<<<<<<<<<<
+ *                 extra_var[key].value = val
+ *             else:
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 66;
-        goto __pyx_L15;
-      }
+      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_n, __pyx_n_s_shape); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_12);
+      __Pyx_INCREF(__pyx_v_key);
+      PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_key);
+      __Pyx_GIVEREF(__pyx_v_key);
+      PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_8);
+      __Pyx_GIVEREF(__pyx_t_8);
+      __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_varinfo)), __pyx_t_12, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      if (unlikely(PyDict_SetItem(__pyx_v_extra_var, __pyx_v_key, __pyx_t_8) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":828
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"
+      /* "adios.pyx":1309
+ *                 n = np.array(val)
+ *                 extra_var[key] = varinfo(key, n.shape)
+ *                 extra_var[key].value = val             # <<<<<<<<<<<<<<
+ *             else:
+ *                 if self.is_noxml: val.define(self.gid)
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 104;
-        goto __pyx_L15;
+      __pyx_t_8 = __Pyx_PyDict_GetItem(__pyx_v_extra_var, __pyx_v_key); if (unlikely(__pyx_t_8 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1309; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+      __Pyx_GOTREF(__pyx_t_8);
+      if (__Pyx_PyObject_SetAttrStr(__pyx_t_8, __pyx_n_s_value, __pyx_v_val) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L5;
+    }
+    /*else*/ {
+
+      /* "adios.pyx":1311
+ *                 extra_var[key].value = val
+ *             else:
+ *                 if self.is_noxml: val.define(self.gid)             # <<<<<<<<<<<<<<
+ * 
+ *         for key, val in extra_var.iteritems():
+ */
+      __pyx_t_11 = (__pyx_v_self->is_noxml != 0);
+      if (__pyx_t_11) {
+        __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_define); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_12);
+        __pyx_t_13 = __Pyx_PyInt_From_int64_t(__pyx_v_self->gid); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_13);
+        __pyx_t_7 = NULL;
+        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_12))) {
+          __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12);
+          if (likely(__pyx_t_7)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+            __Pyx_INCREF(__pyx_t_7);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_12, function);
+          }
+        }
+        if (!__pyx_t_7) {
+          __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_t_13); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+          __Pyx_GOTREF(__pyx_t_8);
+        } else {
+          __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_14);
+          PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+          PyTuple_SET_ITEM(__pyx_t_14, 0+1, __pyx_t_13);
+          __Pyx_GIVEREF(__pyx_t_13);
+          __pyx_t_13 = 0;
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_14, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L6;
       }
+      __pyx_L6:;
+    }
+    __pyx_L5:;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":829
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
+  /* "adios.pyx":1313
+ *                 if self.is_noxml: val.define(self.gid)
+ * 
+ *         for key, val in extra_var.iteritems():             # <<<<<<<<<<<<<<
+ *             if self.is_noxml: val.define(self.gid)
+ *             self.var[key] = val
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 72;
-        goto __pyx_L15;
-      }
+  __pyx_t_5 = 0;
+  __pyx_t_8 = __Pyx_dict_iterator(__pyx_v_extra_var, 1, __pyx_n_s_iteritems, (&__pyx_t_4), (&__pyx_t_6)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_3);
+  __pyx_t_3 = __pyx_t_8;
+  __pyx_t_8 = 0;
+  while (1) {
+    __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_4, &__pyx_t_5, &__pyx_t_8, &__pyx_t_12, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_9 == 0)) break;
+    if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_GOTREF(__pyx_t_12);
+    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_8);
+    __pyx_t_8 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_12);
+    __pyx_t_12 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":830
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
+    /* "adios.pyx":1314
+ * 
+ *         for key, val in extra_var.iteritems():
+ *             if self.is_noxml: val.define(self.gid)             # <<<<<<<<<<<<<<
+ *             self.var[key] = val
+ * 
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 105;
-        goto __pyx_L15;
+    __pyx_t_11 = (__pyx_v_self->is_noxml != 0);
+    if (__pyx_t_11) {
+      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_define); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_14 = __Pyx_PyInt_From_int64_t(__pyx_v_self->gid); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_14);
+      __pyx_t_13 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
+        __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_8);
+        if (likely(__pyx_t_13)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
+          __Pyx_INCREF(__pyx_t_13);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_8, function);
+        }
       }
+      if (!__pyx_t_13) {
+        __pyx_t_12 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_14); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+        __Pyx_GOTREF(__pyx_t_12);
+      } else {
+        __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_13); __Pyx_GIVEREF(__pyx_t_13); __pyx_t_13 = NULL;
+        PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_14);
+        __Pyx_GIVEREF(__pyx_t_14);
+        __pyx_t_14 = 0;
+        __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_7, NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_12);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      goto __pyx_L9;
+    }
+    __pyx_L9:;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":831
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+    /* "adios.pyx":1315
+ *         for key, val in extra_var.iteritems():
+ *             if self.is_noxml: val.define(self.gid)
+ *             self.var[key] = val             # <<<<<<<<<<<<<<
+ * 
+ *         for key, val in self.attr.iteritems():
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 73;
-        goto __pyx_L15;
-      }
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_v_key, __pyx_v_val) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":832
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+  /* "adios.pyx":1317
+ *             self.var[key] = val
+ * 
+ *         for key, val in self.attr.iteritems():             # <<<<<<<<<<<<<<
+ *             if not isinstance(val, attrinfo):
+ *                 extra_attr[key] = attrinfo(key, val, np.array(val).dtype)
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 108;
-        goto __pyx_L15;
-      }
+  __pyx_t_4 = 0;
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_12 = __Pyx_dict_iterator(__pyx_v_self->attr, 1, __pyx_n_s_iteritems, (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_3);
+  __pyx_t_3 = __pyx_t_12;
+  __pyx_t_12 = 0;
+  while (1) {
+    __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_5, &__pyx_t_4, &__pyx_t_12, &__pyx_t_8, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_9 == 0)) break;
+    if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_12);
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_12);
+    __pyx_t_12 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_8);
+    __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":833
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+    /* "adios.pyx":1318
+ * 
+ *         for key, val in self.attr.iteritems():
+ *             if not isinstance(val, attrinfo):             # <<<<<<<<<<<<<<
+ *                 extra_attr[key] = attrinfo(key, val, np.array(val).dtype)
+ *             else:
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 76;
-        goto __pyx_L15;
+    __pyx_t_11 = __Pyx_TypeCheck(__pyx_v_val, ((PyObject*)__pyx_ptype_5adios_attrinfo)); 
+    __pyx_t_10 = ((!(__pyx_t_11 != 0)) != 0);
+    if (__pyx_t_10) {
+
+      /* "adios.pyx":1319
+ *         for key, val in self.attr.iteritems():
+ *             if not isinstance(val, attrinfo):
+ *                 extra_attr[key] = attrinfo(key, val, np.array(val).dtype)             # <<<<<<<<<<<<<<
+ *             else:
+ *                 if self.is_noxml: val.define(self.gid)
+ */
+      __pyx_t_12 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_12);
+      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_array); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      __pyx_t_12 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) {
+        __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7);
+        if (likely(__pyx_t_12)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+          __Pyx_INCREF(__pyx_t_12);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_7, function);
+        }
       }
+      if (!__pyx_t_12) {
+        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_v_val); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+      } else {
+        __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_14);
+        PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_12); __Pyx_GIVEREF(__pyx_t_12); __pyx_t_12 = NULL;
+        __Pyx_INCREF(__pyx_v_val);
+        PyTuple_SET_ITEM(__pyx_t_14, 0+1, __pyx_v_val);
+        __Pyx_GIVEREF(__pyx_v_val);
+        __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_14, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_dtype); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_INCREF(__pyx_v_key);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_key);
+      __Pyx_GIVEREF(__pyx_v_key);
+      __Pyx_INCREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_val);
+      __Pyx_GIVEREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
+      __pyx_t_7 = 0;
+      __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_attrinfo)), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      if (unlikely(PyDict_SetItem(__pyx_v_extra_attr, __pyx_v_key, __pyx_t_7) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L12;
+    }
+    /*else*/ {
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":834
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- */
-      __pyx_t_4 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 113;
-        goto __pyx_L15;
+      /* "adios.pyx":1321
+ *                 extra_attr[key] = attrinfo(key, val, np.array(val).dtype)
+ *             else:
+ *                 if self.is_noxml: val.define(self.gid)             # <<<<<<<<<<<<<<
+ * 
+ *         for key, val in extra_attr.iteritems():
+ */
+      __pyx_t_10 = (__pyx_v_self->is_noxml != 0);
+      if (__pyx_t_10) {
+        __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_define); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_14 = __Pyx_PyInt_From_int64_t(__pyx_v_self->gid); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_14);
+        __pyx_t_12 = NULL;
+        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
+          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_8);
+          if (likely(__pyx_t_12)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
+            __Pyx_INCREF(__pyx_t_12);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_8, function);
+          }
+        }
+        if (!__pyx_t_12) {
+          __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_14); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+          __Pyx_GOTREF(__pyx_t_7);
+        } else {
+          __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_13);
+          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_12); __Pyx_GIVEREF(__pyx_t_12); __pyx_t_12 = NULL;
+          PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_t_14);
+          __Pyx_GIVEREF(__pyx_t_14);
+          __pyx_t_14 = 0;
+          __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_13, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L13;
       }
+      __pyx_L13:;
+    }
+    __pyx_L12:;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":835
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+  /* "adios.pyx":1323
+ *                 if self.is_noxml: val.define(self.gid)
+ * 
+ *         for key, val in extra_attr.iteritems():             # <<<<<<<<<<<<<<
+ *             if self.is_noxml: val.define(self.gid)
+ * 
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 81;
-        goto __pyx_L15;
+  __pyx_t_5 = 0;
+  __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_extra_attr, 1, __pyx_n_s_iteritems, (&__pyx_t_4), (&__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_3);
+  __pyx_t_3 = __pyx_t_7;
+  __pyx_t_7 = 0;
+  while (1) {
+    __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_4, &__pyx_t_5, &__pyx_t_7, &__pyx_t_8, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_9 == 0)) break;
+    if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_7);
+    __pyx_t_7 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_8);
+    __pyx_t_8 = 0;
+
+    /* "adios.pyx":1324
+ * 
+ *         for key, val in extra_attr.iteritems():
+ *             if self.is_noxml: val.define(self.gid)             # <<<<<<<<<<<<<<
+ * 
+ *         groupsize = 0
+ */
+    __pyx_t_10 = (__pyx_v_self->is_noxml != 0);
+    if (__pyx_t_10) {
+      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_define); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_13 = __Pyx_PyInt_From_int64_t(__pyx_v_self->gid); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __pyx_t_14 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_7))) {
+        __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_7);
+        if (likely(__pyx_t_14)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+          __Pyx_INCREF(__pyx_t_14);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_7, function);
+        }
+      }
+      if (!__pyx_t_14) {
+        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_13); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+        __Pyx_GOTREF(__pyx_t_8);
+      } else {
+        __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_12);
+        PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_14); __Pyx_GIVEREF(__pyx_t_14); __pyx_t_14 = NULL;
+        PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_13);
+        __Pyx_GIVEREF(__pyx_t_13);
+        __pyx_t_13 = 0;
+        __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
       }
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L16;
+    }
+    __pyx_L16:;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":836
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+  /* "adios.pyx":1326
+ *             if self.is_noxml: val.define(self.gid)
+ * 
+ *         groupsize = 0             # <<<<<<<<<<<<<<
+ *         for var in self.var.values():
+ *             groupsize = groupsize + var.bytes()
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 102;
-        goto __pyx_L15;
-      }
+  __Pyx_INCREF(__pyx_int_0);
+  __pyx_v_groupsize = __pyx_int_0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":837
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+  /* "adios.pyx":1327
+ * 
+ *         groupsize = 0
+ *         for var in self.var.values():             # <<<<<<<<<<<<<<
+ *             groupsize = groupsize + var.bytes()
+ * 
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 100;
-        goto __pyx_L15;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "values");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_3 = __Pyx_PyDict_Values(__pyx_v_self->var); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  if (likely(PyList_CheckExact(__pyx_t_3)) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_8 = __pyx_t_3; __Pyx_INCREF(__pyx_t_8); __pyx_t_4 = 0;
+    __pyx_t_15 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_15 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (likely(!__pyx_t_15)) {
+      if (likely(PyList_CheckExact(__pyx_t_8))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_8)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       }
-
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":838
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- */
-      __pyx_t_4 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 103;
-        goto __pyx_L15;
+    } else {
+      __pyx_t_3 = __pyx_t_15(__pyx_t_8);
+      if (unlikely(!__pyx_t_3)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
       }
-
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":839
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- */
-      __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 102;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
+    }
+    __Pyx_XDECREF_SET(__pyx_v_var, __pyx_t_3);
+    __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":840
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+    /* "adios.pyx":1328
+ *         groupsize = 0
+ *         for var in self.var.values():
+ *             groupsize = groupsize + var.bytes()             # <<<<<<<<<<<<<<
+ * 
+ *         set_group_size(fd, groupsize)
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 100;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
+    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_var, __pyx_n_s_bytes_2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_12 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_7))) {
+      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7);
+      if (likely(__pyx_t_12)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+        __Pyx_INCREF(__pyx_t_12);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_7, function);
       }
+    }
+    if (__pyx_t_12) {
+      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_12); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+    } else {
+      __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __pyx_t_7 = PyNumber_Add(__pyx_v_groupsize, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF_SET(__pyx_v_groupsize, __pyx_t_7);
+    __pyx_t_7 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":841
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- *             else:
+    /* "adios.pyx":1327
+ * 
+ *         groupsize = 0
+ *         for var in self.var.values():             # <<<<<<<<<<<<<<
+ *             groupsize = groupsize + var.bytes()
+ * 
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 103;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
+  }
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":842
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+  /* "adios.pyx":1330
+ *             groupsize = groupsize + var.bytes()
+ * 
+ *         set_group_size(fd, groupsize)             # <<<<<<<<<<<<<<
+ * 
+ *         for var in self.var.values():
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 79;
-        goto __pyx_L15;
-      }
-      /*else*/ {
+  __pyx_t_16 = __Pyx_PyInt_As_uint64_t(__pyx_v_groupsize); if (unlikely((__pyx_t_16 == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_f_5adios_set_group_size(__pyx_v_fd, __pyx_t_16, 0);
 
-        /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":844
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
- *             f += 1
- *         else:
+  /* "adios.pyx":1332
+ *         set_group_size(fd, groupsize)
+ * 
+ *         for var in self.var.values():             # <<<<<<<<<<<<<<
+ *             var.write(fd)
+ * 
  */
-        __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
-        __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_t_3 = 0;
-        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "values");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_8 = __Pyx_PyDict_Values(__pyx_v_self->var); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  if (likely(PyList_CheckExact(__pyx_t_8)) || PyTuple_CheckExact(__pyx_t_8)) {
+    __pyx_t_7 = __pyx_t_8; __Pyx_INCREF(__pyx_t_7); __pyx_t_4 = 0;
+    __pyx_t_15 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_t_8); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_15 = Py_TYPE(__pyx_t_7)->tp_iternext; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  for (;;) {
+    if (likely(!__pyx_t_15)) {
+      if (likely(PyList_CheckExact(__pyx_t_7))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_7)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_8 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_4); __Pyx_INCREF(__pyx_t_8); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_4); __Pyx_INCREF(__pyx_t_8); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       }
-      __pyx_L15:;
-
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":845
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- *             f += 1             # <<<<<<<<<<<<<<
- *         else:
- *             # Cython ignores struct boundary information ("T{...}"),
- */
-      __pyx_v_f = (__pyx_v_f + 1);
-      goto __pyx_L13;
+    } else {
+      __pyx_t_8 = __pyx_t_15(__pyx_t_7);
+      if (unlikely(!__pyx_t_8)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_8);
     }
-    /*else*/ {
+    __Pyx_XDECREF_SET(__pyx_v_var, __pyx_t_8);
+    __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":849
- *             # Cython ignores struct boundary information ("T{...}"),
- *             # so don't output it
- *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
- *     return f
+    /* "adios.pyx":1333
  * 
+ *         for var in self.var.values():
+ *             var.write(fd)             # <<<<<<<<<<<<<<
+ * 
+ *         close(fd)
  */
-      __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_f = __pyx_t_9;
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_var, __pyx_n_s_write); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_12 = __Pyx_PyInt_From_int64_t(__pyx_v_fd); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_12);
+    __pyx_t_13 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_13)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_13);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+      }
     }
-    __pyx_L13:;
+    if (!__pyx_t_13) {
+      __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_12); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      __Pyx_GOTREF(__pyx_t_8);
+    } else {
+      __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_14);
+      PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13); __Pyx_GIVEREF(__pyx_t_13); __pyx_t_13 = NULL;
+      PyTuple_SET_ITEM(__pyx_t_14, 0+1, __pyx_t_12);
+      __Pyx_GIVEREF(__pyx_t_12);
+      __pyx_t_12 = 0;
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_14, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794
- *     cdef tuple fields
+    /* "adios.pyx":1332
+ *         set_group_size(fd, groupsize)
+ * 
+ *         for var in self.var.values():             # <<<<<<<<<<<<<<
+ *             var.write(fd)
  * 
- *     for childname in descr.names:             # <<<<<<<<<<<<<<
- *         fields = descr.fields[childname]
- *         child, new_offset = fields
  */
   }
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":850
- *             # so don't output it
- *             f = _util_dtypestring(child, f, end, offset)
- *     return f             # <<<<<<<<<<<<<<
+  /* "adios.pyx":1335
+ *             var.write(fd)
  * 
+ *         close(fd)             # <<<<<<<<<<<<<<
  * 
+ *     def __repr__(self):
  */
-  __pyx_r = __pyx_v_f;
-  goto __pyx_L0;
+  __pyx_f_5adios_close(__pyx_v_fd, 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+  /* "adios.pyx":1296
+ *             raise KeyError(name)
  * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
- *     # Recursive utility function used in __getbuffer__ to get format
- *     # string. The new location in the format string is returned.
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         """
+ *         Write variables and attributes to a file and close the writer.
  */
 
   /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_13);
+  __Pyx_XDECREF(__pyx_t_14);
+  __Pyx_AddTraceback("adios.writer.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_child);
-  __Pyx_XDECREF(__pyx_v_fields);
-  __Pyx_XDECREF(__pyx_v_childname);
-  __Pyx_XDECREF(__pyx_v_new_offset);
-  __Pyx_XDECREF(__pyx_v_t);
+  __Pyx_XDECREF(__pyx_v_extra_var);
+  __Pyx_XDECREF(__pyx_v_extra_attr);
+  __Pyx_XDECREF(__pyx_v_key);
+  __Pyx_XDECREF(__pyx_v_val);
+  __Pyx_XDECREF(__pyx_v_n);
+  __Pyx_XDECREF(__pyx_v_groupsize);
+  __Pyx_XDECREF(__pyx_v_var);
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":966
- * 
+/* "adios.pyx":1337
+ *         close(fd)
  * 
- * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
- *      cdef PyObject* baseptr
- *      if base is None:
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosWriter (fname=%r, gname=%r, "
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \
  */
 
-static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
-  PyObject *__pyx_v_baseptr;
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_6writer_17__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_6writer_17__repr__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  __Pyx_RefNannySetupContext("set_array_base", 0);
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_6writer_16__repr__(((struct __pyx_obj_5adios_writer *)__pyx_v_self));
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":968
- * cdef inline void set_array_base(ndarray arr, object base):
- *      cdef PyObject* baseptr
- *      if base is None:             # <<<<<<<<<<<<<<
- *          baseptr = NULL
- *      else:
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_6writer_16__repr__(struct __pyx_obj_5adios_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__repr__", 0);
+
+  /* "adios.pyx":1338
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosWriter (fname=%r, gname=%r, "             # <<<<<<<<<<<<<<
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \
+ *                 (self.fname,
  */
-  __pyx_t_1 = (__pyx_v_base == Py_None);
-  __pyx_t_2 = (__pyx_t_1 != 0);
-  if (__pyx_t_2) {
+  __Pyx_XDECREF(__pyx_r);
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969
- *      cdef PyObject* baseptr
- *      if base is None:
- *          baseptr = NULL             # <<<<<<<<<<<<<<
- *      else:
- *          Py_INCREF(base) # important to do this before decref below!
+  /* "adios.pyx":1344
+ *                  self.method,
+ *                  self.method_params,
+ *                  self.var.keys(),             # <<<<<<<<<<<<<<
+ *                  self.attr.keys())
+ * 
  */
-    __pyx_v_baseptr = NULL;
-    goto __pyx_L3;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  /*else*/ {
+  __pyx_t_1 = __Pyx_PyDict_Keys(__pyx_v_self->var); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":971
- *          baseptr = NULL
- *      else:
- *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<
- *          baseptr = <PyObject*>base
- *      Py_XDECREF(arr.base)
+  /* "adios.pyx":1345
+ *                  self.method_params,
+ *                  self.var.keys(),
+ *                  self.attr.keys())             # <<<<<<<<<<<<<<
+ * 
+ * cdef class attrinfo:
  */
-    Py_INCREF(__pyx_v_base);
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_2 = __Pyx_PyDict_Keys(__pyx_v_self->attr); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":972
- *      else:
- *          Py_INCREF(base) # important to do this before decref below!
- *          baseptr = <PyObject*>base             # <<<<<<<<<<<<<<
- *      Py_XDECREF(arr.base)
- *      arr.base = baseptr
+  /* "adios.pyx":1340
+ *         return ("AdiosWriter (fname=%r, gname=%r, "
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \
+ *                 (self.fname,             # <<<<<<<<<<<<<<
+ *                  self.gname,
+ *                  self.method,
  */
-    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);
-  }
-  __pyx_L3:;
+  __pyx_t_3 = PyTuple_New(6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1340; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_INCREF(__pyx_v_self->fname);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->fname);
+  __Pyx_GIVEREF(__pyx_v_self->fname);
+  __Pyx_INCREF(__pyx_v_self->gname);
+  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->gname);
+  __Pyx_GIVEREF(__pyx_v_self->gname);
+  __Pyx_INCREF(__pyx_v_self->method);
+  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_self->method);
+  __Pyx_GIVEREF(__pyx_v_self->method);
+  __Pyx_INCREF(__pyx_v_self->method_params);
+  PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_v_self->method_params);
+  __Pyx_GIVEREF(__pyx_v_self->method_params);
+  PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":973
- *          Py_INCREF(base) # important to do this before decref below!
- *          baseptr = <PyObject*>base
- *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<
- *      arr.base = baseptr
- * 
+  /* "adios.pyx":1339
+ *     def __repr__(self):
+ *         return ("AdiosWriter (fname=%r, gname=%r, "
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.fname,
+ *                  self.gname,
  */
-  Py_XDECREF(__pyx_v_arr->base);
+  __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_AdiosWriter_fname_r_gname_r_meth, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":974
- *          baseptr = <PyObject*>base
- *      Py_XDECREF(arr.base)
- *      arr.base = baseptr             # <<<<<<<<<<<<<<
+  /* "adios.pyx":1337
+ *         close(fd)
  * 
- * cdef inline object get_array_base(ndarray arr):
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosWriter (fname=%r, gname=%r, "
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \
  */
-  __pyx_v_arr->base = __pyx_v_baseptr;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":966
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios.writer.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1354
  * 
+ *     property name:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
- * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
- *      cdef PyObject* baseptr
- *      if base is None:
  */
 
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_8attrinfo_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_8attrinfo_4name_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_8attrinfo_4name___get__(((struct __pyx_obj_5adios_attrinfo *)__pyx_v_self));
+
   /* function exit code */
   __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976
- *      arr.base = baseptr
- * 
- * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
- *     if arr.base is NULL:
- *         return None
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {
+static PyObject *__pyx_pf_5adios_8attrinfo_4name___get__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("get_array_base", 0);
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977
+  /* "adios.pyx":1355
+ *     property name:
+ *         def __get__(self):
+ *             return self.name             # <<<<<<<<<<<<<<
  * 
- * cdef inline object get_array_base(ndarray arr):
- *     if arr.base is NULL:             # <<<<<<<<<<<<<<
- *         return None
- *     else:
- */
-  __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0);
-  if (__pyx_t_1) {
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":978
- * cdef inline object get_array_base(ndarray arr):
- *     if arr.base is NULL:
- *         return None             # <<<<<<<<<<<<<<
- *     else:
- *         return <object>arr.base
- */
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_INCREF(Py_None);
-    __pyx_r = Py_None;
-    goto __pyx_L0;
-  }
-  /*else*/ {
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":980
- *         return None
- *     else:
- *         return <object>arr.base             # <<<<<<<<<<<<<<
+ *     property is_static:
  */
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));
-    __pyx_r = ((PyObject *)__pyx_v_arr->base);
-    goto __pyx_L0;
-  }
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->name);
+  __pyx_r = __pyx_v_self->name;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976
- *      arr.base = baseptr
+  /* "adios.pyx":1354
+ * 
+ *     property name:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
- * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
- *     if arr.base is NULL:
- *         return None
  */
 
   /* function exit code */
@@ -12970,474 +18238,5830 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static struct __pyx_vtabstruct_5adios_file __pyx_vtable_5adios_file;
-
-static PyObject *__pyx_tp_new_5adios_file(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
-  struct __pyx_obj_5adios_file *p;
-  PyObject *o;
-  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
-    o = (*t->tp_alloc)(t, 0);
-  } else {
-    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
-  }
-  if (unlikely(!o)) return 0;
-  p = ((struct __pyx_obj_5adios_file *)o);
-  p->__pyx_vtab = __pyx_vtabptr_5adios_file;
-  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  return o;
-}
 
-static void __pyx_tp_dealloc_5adios_file(PyObject *o) {
-  struct __pyx_obj_5adios_file *p = (struct __pyx_obj_5adios_file *)o;
-  #if PY_VERSION_HEX >= 0x030400a1
-  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
-    if (PyObject_CallFinalizerFromDealloc(o)) return;
-  }
-  #endif
-  PyObject_GC_UnTrack(o);
-  Py_CLEAR(p->name);
-  Py_CLEAR(p->var);
-  Py_CLEAR(p->attr);
-  (*Py_TYPE(o)->tp_free)(o);
-}
+/* "adios.pyx":1358
+ * 
+ *     property is_static:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_static
+ * 
+ */
 
-static int __pyx_tp_traverse_5adios_file(PyObject *o, visitproc v, void *a) {
-  int e;
-  struct __pyx_obj_5adios_file *p = (struct __pyx_obj_5adios_file *)o;
-  if (p->var) {
-    e = (*v)(p->var, a); if (e) return e;
-  }
-  if (p->attr) {
-    e = (*v)(p->attr, a); if (e) return e;
-  }
-  return 0;
-}
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_8attrinfo_9is_static_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_8attrinfo_9is_static_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_8attrinfo_9is_static___get__(((struct __pyx_obj_5adios_attrinfo *)__pyx_v_self));
 
-static int __pyx_tp_clear_5adios_file(PyObject *o) {
-  PyObject* tmp;
-  struct __pyx_obj_5adios_file *p = (struct __pyx_obj_5adios_file *)o;
-  tmp = ((PyObject*)p->var);
-  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->attr);
-  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  return 0;
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static PyObject *__pyx_getprop_5adios_4file_name(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_4name_1__get__(o);
-}
+static PyObject *__pyx_pf_5adios_8attrinfo_9is_static___get__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-static int __pyx_setprop_5adios_4file_name(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_4name_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_5adios_4file_4name_5__del__(o);
-  }
-}
+  /* "adios.pyx":1359
+ *     property is_static:
+ *         def __get__(self):
+ *             return self.is_static             # <<<<<<<<<<<<<<
+ * 
+ *     property dtype:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_static); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-static PyObject *__pyx_getprop_5adios_4file_nvars(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_5nvars_1__get__(o);
-}
+  /* "adios.pyx":1358
+ * 
+ *     property is_static:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_static
+ * 
+ */
 
-static int __pyx_setprop_5adios_4file_nvars(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_5nvars_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.attrinfo.is_static.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static PyObject *__pyx_getprop_5adios_4file_nattrs(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_6nattrs_1__get__(o);
-}
+/* "adios.pyx":1362
+ * 
+ *     property dtype:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
 
-static int __pyx_setprop_5adios_4file_nattrs(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_6nattrs_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_8attrinfo_5dtype_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_8attrinfo_5dtype_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_8attrinfo_5dtype___get__(((struct __pyx_obj_5adios_attrinfo *)__pyx_v_self));
 
-static PyObject *__pyx_getprop_5adios_4file_current_step(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_12current_step_1__get__(o);
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static int __pyx_setprop_5adios_4file_current_step(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_12current_step_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
+static PyObject *__pyx_pf_5adios_8attrinfo_5dtype___get__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-static PyObject *__pyx_getprop_5adios_4file_last_step(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_9last_step_1__get__(o);
-}
+  /* "adios.pyx":1363
+ *     property dtype:
+ *         def __get__(self):
+ *             return self.dtype             # <<<<<<<<<<<<<<
+ * 
+ *     property value:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->dtype);
+  __pyx_r = __pyx_v_self->dtype;
+  goto __pyx_L0;
 
-static int __pyx_setprop_5adios_4file_last_step(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_9last_step_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
+  /* "adios.pyx":1362
+ * 
+ *     property dtype:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
 
-static PyObject *__pyx_getprop_5adios_4file_endianness(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_10endianness_1__get__(o);
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static int __pyx_setprop_5adios_4file_endianness(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_10endianness_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
+/* "adios.pyx":1366
+ * 
+ *     property value:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.value
+ * 
+ */
 
-static PyObject *__pyx_getprop_5adios_4file_version(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_7version_1__get__(o);
-}
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_8attrinfo_5value_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_8attrinfo_5value_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_8attrinfo_5value___get__(((struct __pyx_obj_5adios_attrinfo *)__pyx_v_self));
 
-static int __pyx_setprop_5adios_4file_version(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_7version_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static PyObject *__pyx_getprop_5adios_4file_file_size(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_9file_size_1__get__(o);
-}
+static PyObject *__pyx_pf_5adios_8attrinfo_5value___get__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-static int __pyx_setprop_5adios_4file_file_size(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_9file_size_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
+  /* "adios.pyx":1367
+ *     property value:
+ *         def __get__(self):
+ *             return self.value             # <<<<<<<<<<<<<<
+ * 
+ *         def __set__(self, value):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->value);
+  __pyx_r = __pyx_v_self->value;
+  goto __pyx_L0;
 
-static PyObject *__pyx_getprop_5adios_4file_var(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_3var_1__get__(o);
+  /* "adios.pyx":1366
+ * 
+ *     property value:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.value
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static int __pyx_setprop_5adios_4file_var(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_3var_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_5adios_4file_3var_5__del__(o);
-  }
+/* "adios.pyx":1369
+ *             return self.value
+ * 
+ *         def __set__(self, value):             # <<<<<<<<<<<<<<
+ *             self.value = value
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_5adios_8attrinfo_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_5adios_8attrinfo_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_8attrinfo_5value_2__set__(((struct __pyx_obj_5adios_attrinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static PyObject *__pyx_getprop_5adios_4file_attr(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_4attr_1__get__(o);
+static int __pyx_pf_5adios_8attrinfo_5value_2__set__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+
+  /* "adios.pyx":1370
+ * 
+ *         def __set__(self, value):
+ *             self.value = value             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, char * name,
+ */
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->value);
+  __Pyx_DECREF(__pyx_v_self->value);
+  __pyx_v_self->value = __pyx_v_value;
+
+  /* "adios.pyx":1369
+ *             return self.value
+ * 
+ *         def __set__(self, value):             # <<<<<<<<<<<<<<
+ *             self.value = value
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static int __pyx_setprop_5adios_4file_attr(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_4attr_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_5adios_4file_4attr_5__del__(o);
+/* "adios.pyx":1372
+ *             self.value = value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  value = None,
+ *                  dtype = None,
+ */
+
+/* Python wrapper */
+static int __pyx_pw_5adios_8attrinfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_5adios_8attrinfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_name;
+  PyObject *__pyx_v_value = 0;
+  PyObject *__pyx_v_dtype = 0;
+  int __pyx_v_is_static;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,&__pyx_n_s_value,&__pyx_n_s_dtype,&__pyx_n_s_is_static,0};
+    PyObject* values[4] = {0,0,0,0};
+
+    /* "adios.pyx":1373
+ * 
+ *     def __init__(self, char * name,
+ *                  value = None,             # <<<<<<<<<<<<<<
+ *                  dtype = None,
+ *                  bint is_static = True):
+ */
+    values[1] = ((PyObject *)Py_None);
+
+    /* "adios.pyx":1374
+ *     def __init__(self, char * name,
+ *                  value = None,
+ *                  dtype = None,             # <<<<<<<<<<<<<<
+ *                  bint is_static = True):
+ *         self.name = name
+ */
+    values[2] = ((PyObject *)Py_None);
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dtype);
+          if (value) { values[2] = value; kw_args--; }
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_is_static);
+          if (value) { values[3] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1372; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1372; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_value = values[1];
+    __pyx_v_dtype = values[2];
+    if (values[3]) {
+      __pyx_v_is_static = __Pyx_PyObject_IsTrue(values[3]); if (unlikely((__pyx_v_is_static == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+
+      /* "adios.pyx":1375
+ *                  value = None,
+ *                  dtype = None,
+ *                  bint is_static = True):             # <<<<<<<<<<<<<<
+ *         self.name = name
+ *         self.value = value
+ */
+      __pyx_v_is_static = ((int)1);
+    }
   }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1372; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.attrinfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_8attrinfo___init__(((struct __pyx_obj_5adios_attrinfo *)__pyx_v_self), __pyx_v_name, __pyx_v_value, __pyx_v_dtype, __pyx_v_is_static);
+
+  /* "adios.pyx":1372
+ *             self.value = value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  value = None,
+ *                  dtype = None,
+ */
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static PyObject *__pyx_getprop_5adios_4file_is_stream(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_4file_9is_stream_1__get__(o);
+static int __pyx_pf_5adios_8attrinfo___init__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self, char *__pyx_v_name, PyObject *__pyx_v_value, PyObject *__pyx_v_dtype, int __pyx_v_is_static) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__init__", 0);
+
+  /* "adios.pyx":1376
+ *                  dtype = None,
+ *                  bint is_static = True):
+ *         self.name = name             # <<<<<<<<<<<<<<
+ *         self.value = value
+ *         self.dtype = dtype
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->name);
+  __Pyx_DECREF(__pyx_v_self->name);
+  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1377
+ *                  bint is_static = True):
+ *         self.name = name
+ *         self.value = value             # <<<<<<<<<<<<<<
+ *         self.dtype = dtype
+ *         self.is_static = is_static
+ */
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->value);
+  __Pyx_DECREF(__pyx_v_self->value);
+  __pyx_v_self->value = __pyx_v_value;
+
+  /* "adios.pyx":1378
+ *         self.name = name
+ *         self.value = value
+ *         self.dtype = dtype             # <<<<<<<<<<<<<<
+ *         self.is_static = is_static
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_dtype);
+  __Pyx_GIVEREF(__pyx_v_dtype);
+  __Pyx_GOTREF(__pyx_v_self->dtype);
+  __Pyx_DECREF(__pyx_v_self->dtype);
+  __pyx_v_self->dtype = __pyx_v_dtype;
+
+  /* "adios.pyx":1379
+ *         self.value = value
+ *         self.dtype = dtype
+ *         self.is_static = is_static             # <<<<<<<<<<<<<<
+ * 
+ *     def define(self, int64_t gid):
+ */
+  __pyx_v_self->is_static = __pyx_v_is_static;
+
+  /* "adios.pyx":1372
+ *             self.value = value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  value = None,
+ *                  dtype = None,
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.attrinfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static int __pyx_setprop_5adios_4file_is_stream(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_4file_9is_stream_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
+/* "adios.pyx":1381
+ *         self.is_static = is_static
+ * 
+ *     def define(self, int64_t gid):             # <<<<<<<<<<<<<<
+ *         if self.is_static:
+ *             if self.value is None:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_8attrinfo_3define(PyObject *__pyx_v_self, PyObject *__pyx_arg_gid); /*proto*/
+static char __pyx_doc_5adios_8attrinfo_2define[] = "attrinfo.define(self, int64_t gid)";
+static PyObject *__pyx_pw_5adios_8attrinfo_3define(PyObject *__pyx_v_self, PyObject *__pyx_arg_gid) {
+  int64_t __pyx_v_gid;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define (wrapper)", 0);
+  assert(__pyx_arg_gid); {
+    __pyx_v_gid = __Pyx_PyInt_As_int64_t(__pyx_arg_gid); if (unlikely((__pyx_v_gid == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.attrinfo.define", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_8attrinfo_2define(((struct __pyx_obj_5adios_attrinfo *)__pyx_v_self), ((int64_t)__pyx_v_gid));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static PyMethodDef __pyx_methods_5adios_file[] = {
-  {"__del__", (PyCFunction)__pyx_pw_5adios_4file_3__del__, METH_NOARGS, 0},
-  {"close", (PyCFunction)__pyx_pw_5adios_4file_5close, METH_NOARGS, 0},
-  {"printself", (PyCFunction)__pyx_pw_5adios_4file_7printself, METH_NOARGS, 0},
-  {"advance", (PyCFunction)__pyx_pw_5adios_4file_9advance, METH_VARARGS|METH_KEYWORDS, 0},
-  {0, 0, 0, 0}
-};
+static PyObject *__pyx_pf_5adios_8attrinfo_2define(struct __pyx_obj_5adios_attrinfo *__pyx_v_self, int64_t __pyx_v_gid) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  char *__pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define", 0);
 
-static struct PyGetSetDef __pyx_getsets_5adios_file[] = {
-  {(char *)"name", __pyx_getprop_5adios_4file_name, __pyx_setprop_5adios_4file_name, 0, 0},
-  {(char *)"nvars", __pyx_getprop_5adios_4file_nvars, __pyx_setprop_5adios_4file_nvars, 0, 0},
-  {(char *)"nattrs", __pyx_getprop_5adios_4file_nattrs, __pyx_setprop_5adios_4file_nattrs, 0, 0},
-  {(char *)"current_step", __pyx_getprop_5adios_4file_current_step, __pyx_setprop_5adios_4file_current_step, 0, 0},
-  {(char *)"last_step", __pyx_getprop_5adios_4file_last_step, __pyx_setprop_5adios_4file_last_step, 0, 0},
-  {(char *)"endianness", __pyx_getprop_5adios_4file_endianness, __pyx_setprop_5adios_4file_endianness, 0, 0},
-  {(char *)"version", __pyx_getprop_5adios_4file_version, __pyx_setprop_5adios_4file_version, 0, 0},
-  {(char *)"file_size", __pyx_getprop_5adios_4file_file_size, __pyx_setprop_5adios_4file_file_size, 0, 0},
-  {(char *)"var", __pyx_getprop_5adios_4file_var, __pyx_setprop_5adios_4file_var, 0, 0},
-  {(char *)"attr", __pyx_getprop_5adios_4file_attr, __pyx_setprop_5adios_4file_attr, 0, 0},
-  {(char *)"is_stream", __pyx_getprop_5adios_4file_is_stream, __pyx_setprop_5adios_4file_is_stream, 0, 0},
-  {0, 0, 0, 0, 0}
-};
+  /* "adios.pyx":1382
+ * 
+ *     def define(self, int64_t gid):
+ *         if self.is_static:             # <<<<<<<<<<<<<<
+ *             if self.value is None:
+ *                 raise TypeError("Value is none")
+ */
+  __pyx_t_1 = (__pyx_v_self->is_static != 0);
+  if (__pyx_t_1) {
 
-static PyTypeObject __pyx_type_5adios_file = {
-  PyVarObject_HEAD_INIT(0, 0)
-  "adios.file", /*tp_name*/
-  sizeof(struct __pyx_obj_5adios_file), /*tp_basicsize*/
-  0, /*tp_itemsize*/
-  __pyx_tp_dealloc_5adios_file, /*tp_dealloc*/
-  0, /*tp_print*/
-  0, /*tp_getattr*/
-  0, /*tp_setattr*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*tp_compare*/
-  #else
-  0, /*reserved*/
-  #endif
-  0, /*tp_repr*/
-  0, /*tp_as_number*/
-  0, /*tp_as_sequence*/
-  0, /*tp_as_mapping*/
-  0, /*tp_hash*/
-  0, /*tp_call*/
-  0, /*tp_str*/
-  0, /*tp_getattro*/
-  0, /*tp_setattro*/
-  0, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  " Private Memeber ", /*tp_doc*/
-  __pyx_tp_traverse_5adios_file, /*tp_traverse*/
-  __pyx_tp_clear_5adios_file, /*tp_clear*/
-  0, /*tp_richcompare*/
-  0, /*tp_weaklistoffset*/
-  0, /*tp_iter*/
-  0, /*tp_iternext*/
-  __pyx_methods_5adios_file, /*tp_methods*/
-  0, /*tp_members*/
-  __pyx_getsets_5adios_file, /*tp_getset*/
-  0, /*tp_base*/
-  0, /*tp_dict*/
-  0, /*tp_descr_get*/
-  0, /*tp_descr_set*/
-  0, /*tp_dictoffset*/
-  __pyx_pw_5adios_4file_1__init__, /*tp_init*/
-  0, /*tp_alloc*/
-  __pyx_tp_new_5adios_file, /*tp_new*/
-  0, /*tp_free*/
-  0, /*tp_is_gc*/
-  0, /*tp_bases*/
-  0, /*tp_mro*/
-  0, /*tp_cache*/
-  0, /*tp_subclasses*/
-  0, /*tp_weaklist*/
-  0, /*tp_del*/
-  0, /*tp_version_tag*/
-  #if PY_VERSION_HEX >= 0x030400a1
-  0, /*tp_finalize*/
-  #endif
-};
-static struct __pyx_vtabstruct_5adios_var __pyx_vtable_5adios_var;
+    /* "adios.pyx":1383
+ *     def define(self, int64_t gid):
+ *         if self.is_static:
+ *             if self.value is None:             # <<<<<<<<<<<<<<
+ *                 raise TypeError("Value is none")
+ * 
+ */
+    __pyx_t_1 = (__pyx_v_self->value == Py_None);
+    __pyx_t_2 = (__pyx_t_1 != 0);
+    if (__pyx_t_2) {
 
-static PyObject *__pyx_tp_new_5adios_var(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
-  struct __pyx_obj_5adios_var *p;
-  PyObject *o;
-  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
-    o = (*t->tp_alloc)(t, 0);
-  } else {
-    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
-  }
-  if (unlikely(!o)) return 0;
-  p = ((struct __pyx_obj_5adios_var *)o);
-  p->__pyx_vtab = __pyx_vtabptr_5adios_var;
-  p->file = ((struct __pyx_obj_5adios_file *)Py_None); Py_INCREF(Py_None);
-  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  p->type = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  p->dims = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  return o;
-}
+      /* "adios.pyx":1384
+ *         if self.is_static:
+ *             if self.value is None:
+ *                 raise TypeError("Value is none")             # <<<<<<<<<<<<<<
+ * 
+ *             define_attribute_byvalue(gid, self.name, "", self.value)
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
 
-static void __pyx_tp_dealloc_5adios_var(PyObject *o) {
-  struct __pyx_obj_5adios_var *p = (struct __pyx_obj_5adios_var *)o;
-  #if PY_VERSION_HEX >= 0x030400a1
-  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
-    if (PyObject_CallFinalizerFromDealloc(o)) return;
+    /* "adios.pyx":1386
+ *                 raise TypeError("Value is none")
+ * 
+ *             define_attribute_byvalue(gid, self.name, "", self.value)             # <<<<<<<<<<<<<<
+ *         else:
+ *             ##atype = np2adiostype(np.dtype(self.dtype))
+ */
+    __pyx_t_4 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __pyx_v_self->value;
+    __Pyx_INCREF(__pyx_t_3);
+    __pyx_f_5adios_define_attribute_byvalue(__pyx_v_gid, __pyx_t_4, __pyx_k__7, __pyx_t_3, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    goto __pyx_L3;
   }
-  #endif
-  PyObject_GC_UnTrack(o);
-  Py_CLEAR(p->file);
-  Py_CLEAR(p->name);
-  Py_CLEAR(p->type);
-  Py_CLEAR(p->dims);
-  (*Py_TYPE(o)->tp_free)(o);
-}
+  /*else*/ {
 
-static int __pyx_tp_traverse_5adios_var(PyObject *o, visitproc v, void *a) {
-  int e;
-  struct __pyx_obj_5adios_var *p = (struct __pyx_obj_5adios_var *)o;
-  if (p->file) {
-    e = (*v)(((PyObject*)p->file), a); if (e) return e;
-  }
-  if (p->type) {
-    e = (*v)(p->type, a); if (e) return e;
-  }
-  if (p->dims) {
-    e = (*v)(p->dims, a); if (e) return e;
+    /* "adios.pyx":1391
+ *             ##define_attribute(gid, self.name, "",
+ *             ##                 atype, "", str(self.value))
+ *             raise NotImplementedError             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
+ */
+    __Pyx_Raise(__pyx_builtin_NotImplementedError, 0, 0, 0);
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  return 0;
-}
-
-static int __pyx_tp_clear_5adios_var(PyObject *o) {
-  PyObject* tmp;
-  struct __pyx_obj_5adios_var *p = (struct __pyx_obj_5adios_var *)o;
-  tmp = ((PyObject*)p->file);
-  p->file = ((struct __pyx_obj_5adios_file *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->type);
-  p->type = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->dims);
-  p->dims = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  return 0;
-}
+  __pyx_L3:;
 
-static PyObject *__pyx_getprop_5adios_3var_name(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_3var_4name_1__get__(o);
-}
+  /* "adios.pyx":1381
+ *         self.is_static = is_static
+ * 
+ *     def define(self, int64_t gid):             # <<<<<<<<<<<<<<
+ *         if self.is_static:
+ *             if self.value is None:
+ */
 
-static int __pyx_setprop_5adios_3var_name(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_3var_4name_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_5adios_3var_4name_5__del__(o);
-  }
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios.attrinfo.define", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static PyObject *__pyx_getprop_5adios_3var_varid(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_3var_5varid_1__get__(o);
-}
+/* "adios.pyx":1393
+ *             raise NotImplementedError
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+ *                 (self.name,
+ */
 
-static int __pyx_setprop_5adios_3var_varid(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_3var_5varid_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_8attrinfo_5__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_8attrinfo_5__repr__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_8attrinfo_4__repr__(((struct __pyx_obj_5adios_attrinfo *)__pyx_v_self));
 
-static PyObject *__pyx_getprop_5adios_3var_type(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_3var_4type_1__get__(o);
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static int __pyx_setprop_5adios_3var_type(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_3var_4type_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_5adios_3var_4type_5__del__(o);
-  }
-}
+static PyObject *__pyx_pf_5adios_8attrinfo_4__repr__(struct __pyx_obj_5adios_attrinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__repr__", 0);
 
-static PyObject *__pyx_getprop_5adios_3var_ndim(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_3var_4ndim_1__get__(o);
-}
+  /* "adios.pyx":1394
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.name,
+ *                  self.is_static,
+ */
+  __Pyx_XDECREF(__pyx_r);
 
-static int __pyx_setprop_5adios_3var_ndim(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_3var_4ndim_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
+  /* "adios.pyx":1396
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+ *                 (self.name,
+ *                  self.is_static,             # <<<<<<<<<<<<<<
+ *                  self.value,
+ *                  self.dtype)
+ */
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_static); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
 
-static PyObject *__pyx_getprop_5adios_3var_dims(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_3var_4dims_1__get__(o);
-}
+  /* "adios.pyx":1395
+ *     def __repr__(self):
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+ *                 (self.name,             # <<<<<<<<<<<<<<
+ *                  self.is_static,
+ *                  self.value,
+ */
+  __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_self->name);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->name);
+  __Pyx_GIVEREF(__pyx_v_self->name);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_self->value);
+  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->value);
+  __Pyx_GIVEREF(__pyx_v_self->value);
+  __Pyx_INCREF(__pyx_v_self->dtype);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->dtype);
+  __Pyx_GIVEREF(__pyx_v_self->dtype);
+  __pyx_t_1 = 0;
 
-static int __pyx_setprop_5adios_3var_dims(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_3var_4dims_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_5adios_3var_4dims_5__del__(o);
-  }
-}
+  /* "adios.pyx":1394
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.name,
+ *                  self.is_static,
+ */
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_AdiosAttrinfo_name_r_is_static_r, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-static PyObject *__pyx_getprop_5adios_3var_nsteps(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_5adios_3var_6nsteps_1__get__(o);
-}
+  /* "adios.pyx":1393
+ *             raise NotImplementedError
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+ *                 (self.name,
+ */
 
-static int __pyx_setprop_5adios_3var_nsteps(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_5adios_3var_6nsteps_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("adios.attrinfo.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-static PyMethodDef __pyx_methods_5adios_var[] = {
-  {"__del__", (PyCFunction)__pyx_pw_5adios_3var_3__del__, METH_NOARGS, 0},
-  {"close", (PyCFunction)__pyx_pw_5adios_3var_5close, METH_NOARGS, 0},
-  {"read", (PyCFunction)__pyx_pw_5adios_3var_7read, METH_VARARGS|METH_KEYWORDS, 0},
-  {"printself", (PyCFunction)__pyx_pw_5adios_3var_9printself, METH_NOARGS, 0},
-  {0, 0, 0, 0}
-};
-
-static struct PyGetSetDef __pyx_getsets_5adios_var[] = {
-  {(char *)"name", __pyx_getprop_5adios_3var_name, __pyx_setprop_5adios_3var_name, 0, 0},
-  {(char *)"varid", __pyx_getprop_5adios_3var_varid, __pyx_setprop_5adios_3var_varid, 0, 0},
-  {(char *)"type", __pyx_getprop_5adios_3var_type, __pyx_setprop_5adios_3var_type, 0, 0},
-  {(char *)"ndim", __pyx_getprop_5adios_3var_ndim, __pyx_setprop_5adios_3var_ndim, 0, 0},
-  {(char *)"dims", __pyx_getprop_5adios_3var_dims, __pyx_setprop_5adios_3var_dims, 0, 0},
-  {(char *)"nsteps", __pyx_getprop_5adios_3var_nsteps, __pyx_setprop_5adios_3var_nsteps, 0, 0},
-  {0, 0, 0, 0, 0}
-};
+/* "adios.pyx":1407
+ *     cdef public value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  ldim = tuple(),
+ *                  gdim = tuple(),
+ */
 
-static PyTypeObject __pyx_type_5adios_var = {
-  PyVarObject_HEAD_INIT(0, 0)
-  "adios.var", /*tp_name*/
-  sizeof(struct __pyx_obj_5adios_var), /*tp_basicsize*/
-  0, /*tp_itemsize*/
-  __pyx_tp_dealloc_5adios_var, /*tp_dealloc*/
-  0, /*tp_print*/
-  0, /*tp_getattr*/
-  0, /*tp_setattr*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*tp_compare*/
-  #else
-  0, /*reserved*/
-  #endif
-  0, /*tp_repr*/
-  0, /*tp_as_number*/
-  0, /*tp_as_sequence*/
+/* Python wrapper */
+static int __pyx_pw_5adios_7varinfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_5adios_7varinfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_name;
+  PyObject *__pyx_v_ldim = 0;
+  PyObject *__pyx_v_gdim = 0;
+  PyObject *__pyx_v_offset = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,&__pyx_n_s_ldim,&__pyx_n_s_gdim,&__pyx_n_s_offset,0};
+    PyObject* values[4] = {0,0,0,0};
+    values[1] = __pyx_k__27;
+    values[2] = __pyx_k__28;
+    values[3] = __pyx_k__29;
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ldim);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gdim);
+          if (value) { values[2] = value; kw_args--; }
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_offset);
+          if (value) { values[3] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_ldim = values[1];
+    __pyx_v_gdim = values[2];
+    __pyx_v_offset = values[3];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.varinfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_7varinfo___init__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self), __pyx_v_name, __pyx_v_ldim, __pyx_v_gdim, __pyx_v_offset);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_7varinfo___init__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, char *__pyx_v_name, PyObject *__pyx_v_ldim, PyObject *__pyx_v_gdim, PyObject *__pyx_v_offset) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__init__", 0);
+
+  /* "adios.pyx":1411
+ *                  gdim = tuple(),
+ *                  offset = tuple()):
+ *         self.name = name             # <<<<<<<<<<<<<<
+ *         self.ldim = ldim
+ *         self.gdim = gdim
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->name);
+  __Pyx_DECREF(__pyx_v_self->name);
+  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1412
+ *                  offset = tuple()):
+ *         self.name = name
+ *         self.ldim = ldim             # <<<<<<<<<<<<<<
+ *         self.gdim = gdim
+ *         self.offset = offset
+ */
+  __Pyx_INCREF(__pyx_v_ldim);
+  __Pyx_GIVEREF(__pyx_v_ldim);
+  __Pyx_GOTREF(__pyx_v_self->ldim);
+  __Pyx_DECREF(__pyx_v_self->ldim);
+  __pyx_v_self->ldim = __pyx_v_ldim;
+
+  /* "adios.pyx":1413
+ *         self.name = name
+ *         self.ldim = ldim
+ *         self.gdim = gdim             # <<<<<<<<<<<<<<
+ *         self.offset = offset
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_gdim);
+  __Pyx_GIVEREF(__pyx_v_gdim);
+  __Pyx_GOTREF(__pyx_v_self->gdim);
+  __Pyx_DECREF(__pyx_v_self->gdim);
+  __pyx_v_self->gdim = __pyx_v_gdim;
+
+  /* "adios.pyx":1414
+ *         self.ldim = ldim
+ *         self.gdim = gdim
+ *         self.offset = offset             # <<<<<<<<<<<<<<
+ * 
+ *     def define(self, int64_t gid):
+ */
+  __Pyx_INCREF(__pyx_v_offset);
+  __Pyx_GIVEREF(__pyx_v_offset);
+  __Pyx_GOTREF(__pyx_v_self->offset);
+  __Pyx_DECREF(__pyx_v_self->offset);
+  __pyx_v_self->offset = __pyx_v_offset;
+
+  /* "adios.pyx":1407
+ *     cdef public value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  ldim = tuple(),
+ *                  gdim = tuple(),
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios.varinfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1416
+ *         self.offset = offset
+ * 
+ *     def define(self, int64_t gid):             # <<<<<<<<<<<<<<
+ *         if self.value is None:
+ *             raise TypeError("Value is none")
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_7varinfo_3define(PyObject *__pyx_v_self, PyObject *__pyx_arg_gid); /*proto*/
+static char __pyx_doc_5adios_7varinfo_2define[] = "varinfo.define(self, int64_t gid)";
+static PyObject *__pyx_pw_5adios_7varinfo_3define(PyObject *__pyx_v_self, PyObject *__pyx_arg_gid) {
+  int64_t __pyx_v_gid;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define (wrapper)", 0);
+  assert(__pyx_arg_gid); {
+    __pyx_v_gid = __Pyx_PyInt_As_int64_t(__pyx_arg_gid); if (unlikely((__pyx_v_gid == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1416; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.varinfo.define", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_7varinfo_2define(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self), ((int64_t)__pyx_v_gid));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_7varinfo_2define(struct __pyx_obj_5adios_varinfo *__pyx_v_self, int64_t __pyx_v_gid) {
+  PyObject *__pyx_v_ldim_ = NULL;
+  PyObject *__pyx_v_gdim_ = NULL;
+  PyObject *__pyx_v_offset_ = NULL;
+  PyObject *__pyx_v_val_ = NULL;
+  PyObject *__pyx_v_atype = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  char *__pyx_t_8;
+  int __pyx_t_9;
+  char *__pyx_t_10;
+  char *__pyx_t_11;
+  char *__pyx_t_12;
+  struct __pyx_opt_args_5adios_define_var __pyx_t_13;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define", 0);
+
+  /* "adios.pyx":1417
+ * 
+ *     def define(self, int64_t gid):
+ *         if self.value is None:             # <<<<<<<<<<<<<<
+ *             raise TypeError("Value is none")
+ * 
+ */
+  __pyx_t_1 = (__pyx_v_self->value == Py_None);
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
+
+    /* "adios.pyx":1418
+ *     def define(self, int64_t gid):
+ *         if self.value is None:
+ *             raise TypeError("Value is none")             # <<<<<<<<<<<<<<
+ * 
+ *         ldim_ = self.ldim
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__30, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "adios.pyx":1420
+ *             raise TypeError("Value is none")
+ * 
+ *         ldim_ = self.ldim             # <<<<<<<<<<<<<<
+ *         if isinstance(self.ldim, (tuple, list)):
+ *             ldim_ = tuple(self.ldim)
+ */
+  __pyx_t_3 = __pyx_v_self->ldim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_ldim_ = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":1421
+ * 
+ *         ldim_ = self.ldim
+ *         if isinstance(self.ldim, (tuple, list)):             # <<<<<<<<<<<<<<
+ *             ldim_ = tuple(self.ldim)
+ * 
+ */
+  __pyx_t_3 = __pyx_v_self->ldim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_1 = PyTuple_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_4 = (__pyx_t_1 != 0);
+  if (!__pyx_t_4) {
+  } else {
+    __pyx_t_2 = __pyx_t_4;
+    goto __pyx_L5_bool_binop_done;
+  }
+  __pyx_t_3 = __pyx_v_self->ldim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_4 = PyList_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_1 = (__pyx_t_4 != 0);
+  __pyx_t_2 = __pyx_t_1;
+  __pyx_L5_bool_binop_done:;
+  __pyx_t_1 = (__pyx_t_2 != 0);
+  if (__pyx_t_1) {
+
+    /* "adios.pyx":1422
+ *         ldim_ = self.ldim
+ *         if isinstance(self.ldim, (tuple, list)):
+ *             ldim_ = tuple(self.ldim)             # <<<<<<<<<<<<<<
+ * 
+ *         gdim_ = self.gdim
+ */
+    __pyx_t_3 = PySequence_Tuple(__pyx_v_self->ldim); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF_SET(__pyx_v_ldim_, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L4;
+  }
+  __pyx_L4:;
+
+  /* "adios.pyx":1424
+ *             ldim_ = tuple(self.ldim)
+ * 
+ *         gdim_ = self.gdim             # <<<<<<<<<<<<<<
+ *         if isinstance(self.gdim, (tuple, list)):
+ *             gdim_ = tuple(self.gdim)
+ */
+  __pyx_t_3 = __pyx_v_self->gdim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_gdim_ = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":1425
+ * 
+ *         gdim_ = self.gdim
+ *         if isinstance(self.gdim, (tuple, list)):             # <<<<<<<<<<<<<<
+ *             gdim_ = tuple(self.gdim)
+ * 
+ */
+  __pyx_t_3 = __pyx_v_self->gdim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_2 = PyTuple_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_4 = (__pyx_t_2 != 0);
+  if (!__pyx_t_4) {
+  } else {
+    __pyx_t_1 = __pyx_t_4;
+    goto __pyx_L8_bool_binop_done;
+  }
+  __pyx_t_3 = __pyx_v_self->gdim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_4 = PyList_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_2 = (__pyx_t_4 != 0);
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L8_bool_binop_done:;
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
+
+    /* "adios.pyx":1426
+ *         gdim_ = self.gdim
+ *         if isinstance(self.gdim, (tuple, list)):
+ *             gdim_ = tuple(self.gdim)             # <<<<<<<<<<<<<<
+ * 
+ *         offset_ = self.offset
+ */
+    __pyx_t_3 = PySequence_Tuple(__pyx_v_self->gdim); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF_SET(__pyx_v_gdim_, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L7;
+  }
+  __pyx_L7:;
+
+  /* "adios.pyx":1428
+ *             gdim_ = tuple(self.gdim)
+ * 
+ *         offset_ = self.offset             # <<<<<<<<<<<<<<
+ *         if isinstance(self.offset, (tuple, list)):
+ *             offset_ = tuple(self.offset)
+ */
+  __pyx_t_3 = __pyx_v_self->offset;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_offset_ = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":1429
+ * 
+ *         offset_ = self.offset
+ *         if isinstance(self.offset, (tuple, list)):             # <<<<<<<<<<<<<<
+ *             offset_ = tuple(self.offset)
+ * 
+ */
+  __pyx_t_3 = __pyx_v_self->offset;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_1 = PyTuple_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_4 = (__pyx_t_1 != 0);
+  if (!__pyx_t_4) {
+  } else {
+    __pyx_t_2 = __pyx_t_4;
+    goto __pyx_L11_bool_binop_done;
+  }
+  __pyx_t_3 = __pyx_v_self->offset;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_4 = PyList_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_1 = (__pyx_t_4 != 0);
+  __pyx_t_2 = __pyx_t_1;
+  __pyx_L11_bool_binop_done:;
+  __pyx_t_1 = (__pyx_t_2 != 0);
+  if (__pyx_t_1) {
+
+    /* "adios.pyx":1430
+ *         offset_ = self.offset
+ *         if isinstance(self.offset, (tuple, list)):
+ *             offset_ = tuple(self.offset)             # <<<<<<<<<<<<<<
+ * 
+ *         val_ = self.value
+ */
+    __pyx_t_3 = PySequence_Tuple(__pyx_v_self->offset); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF_SET(__pyx_v_offset_, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L10;
+  }
+  __pyx_L10:;
+
+  /* "adios.pyx":1432
+ *             offset_ = tuple(self.offset)
+ * 
+ *         val_ = self.value             # <<<<<<<<<<<<<<
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)
+ */
+  __pyx_t_3 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_val_ = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":1433
+ * 
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *             val_ = np.array(self.value)
+ * 
+ */
+  __pyx_t_3 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_1 = __Pyx_TypeCheck(__pyx_t_3, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
+  if (__pyx_t_2) {
+
+    /* "adios.pyx":1434
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)             # <<<<<<<<<<<<<<
+ * 
+ *         atype = np2adiostype(val_.dtype)
+ */
+    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_array); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_6))) {
+      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6);
+      if (likely(__pyx_t_5)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+        __Pyx_INCREF(__pyx_t_5);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_6, function);
+      }
+    }
+    if (!__pyx_t_5) {
+      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_v_self->value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+    } else {
+      __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
+      __Pyx_INCREF(__pyx_v_self->value);
+      PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_v_self->value);
+      __Pyx_GIVEREF(__pyx_v_self->value);
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_DECREF_SET(__pyx_v_val_, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L13;
+  }
+  __pyx_L13:;
+
+  /* "adios.pyx":1436
+ *             val_ = np.array(self.value)
+ * 
+ *         atype = np2adiostype(val_.dtype)             # <<<<<<<<<<<<<<
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_val_, __pyx_n_s_dtype); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __pyx_f_5adios_np2adiostype(((PyArray_Descr *)__pyx_t_3), 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_atype = __pyx_t_6;
+  __pyx_t_6 = 0;
+
+  /* "adios.pyx":1438
+ *         atype = np2adiostype(val_.dtype)
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,             # <<<<<<<<<<<<<<
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ */
+  __pyx_t_8 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_atype); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":1439
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,
+ *                    str(ldim_).replace(' ', '').strip('(,)'),             # <<<<<<<<<<<<<<
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ */
+  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_v_ldim_);
+  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_ldim_);
+  __Pyx_GIVEREF(__pyx_v_ldim_);
+  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_replace); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__32, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_strip); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__34, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_10 = __Pyx_PyObject_AsString(__pyx_t_3); if (unlikely((!__pyx_t_10) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":1440
+ *         define_var(gid, self.name, "", atype,
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),             # <<<<<<<<<<<<<<
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ * 
+ */
+  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_v_gdim_);
+  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_gdim_);
+  __Pyx_GIVEREF(__pyx_v_gdim_);
+  __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_6, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_replace); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_strip); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__36, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_11 = __Pyx_PyObject_AsString(__pyx_t_7); if (unlikely((!__pyx_t_11) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":1441
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ *                    str(offset_).replace(' ', '').strip('(,)'))             # <<<<<<<<<<<<<<
+ * 
+ *     def bytes(self):
+ */
+  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_v_offset_);
+  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_offset_);
+  __Pyx_GIVEREF(__pyx_v_offset_);
+  __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_replace); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__37, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_strip); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_12 = __Pyx_PyObject_AsString(__pyx_t_5); if (unlikely((!__pyx_t_12) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":1438
+ *         atype = np2adiostype(val_.dtype)
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,             # <<<<<<<<<<<<<<
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ */
+  __pyx_t_13.__pyx_n = 3;
+  __pyx_t_13.dimensions = __pyx_t_10;
+  __pyx_t_13.global_dimensions = __pyx_t_11;
+  __pyx_t_13.local_offsets = __pyx_t_12;
+  __pyx_f_5adios_define_var(__pyx_v_gid, __pyx_t_8, __pyx_k__7, __pyx_t_9, 0, &__pyx_t_13); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+  /* "adios.pyx":1416
+ *         self.offset = offset
+ * 
+ *     def define(self, int64_t gid):             # <<<<<<<<<<<<<<
+ *         if self.value is None:
+ *             raise TypeError("Value is none")
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("adios.varinfo.define", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_ldim_);
+  __Pyx_XDECREF(__pyx_v_gdim_);
+  __Pyx_XDECREF(__pyx_v_offset_);
+  __Pyx_XDECREF(__pyx_v_val_);
+  __Pyx_XDECREF(__pyx_v_atype);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1443
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ * 
+ *     def bytes(self):             # <<<<<<<<<<<<<<
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_7varinfo_5bytes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_5adios_7varinfo_4bytes[] = "varinfo.bytes(self)";
+static PyObject *__pyx_pw_5adios_7varinfo_5bytes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("bytes (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_4bytes(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_7varinfo_4bytes(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  PyObject *__pyx_v_val_ = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("bytes", 0);
+
+  /* "adios.pyx":1444
+ * 
+ *     def bytes(self):
+ *         val_ = self.value             # <<<<<<<<<<<<<<
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)
+ */
+  __pyx_t_1 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_v_val_ = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1445
+ *     def bytes(self):
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *             val_ = np.array(self.value)
+ * 
+ */
+  __pyx_t_1 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_TypeCheck(__pyx_t_1, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0);
+  if (__pyx_t_3) {
+
+    /* "adios.pyx":1446
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)             # <<<<<<<<<<<<<<
+ * 
+ *         return val_.size * val_.itemsize
+ */
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_5, function);
+      }
+    }
+    if (!__pyx_t_4) {
+      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_self->value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+    } else {
+      __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = NULL;
+      __Pyx_INCREF(__pyx_v_self->value);
+      PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_v_self->value);
+      __Pyx_GIVEREF(__pyx_v_self->value);
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF_SET(__pyx_v_val_, __pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios.pyx":1448
+ *             val_ = np.array(self.value)
+ * 
+ *         return val_.size * val_.itemsize             # <<<<<<<<<<<<<<
+ * 
+ *     def write(self, int64_t fd):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_val_, __pyx_n_s_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_val_, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_6 = PyNumber_Multiply(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_r = __pyx_t_6;
+  __pyx_t_6 = 0;
+  goto __pyx_L0;
+
+  /* "adios.pyx":1443
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ * 
+ *     def bytes(self):             # <<<<<<<<<<<<<<
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("adios.varinfo.bytes", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_val_);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1450
+ *         return val_.size * val_.itemsize
+ * 
+ *     def write(self, int64_t fd):             # <<<<<<<<<<<<<<
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_7varinfo_7write(PyObject *__pyx_v_self, PyObject *__pyx_arg_fd); /*proto*/
+static char __pyx_doc_5adios_7varinfo_6write[] = "varinfo.write(self, int64_t fd)";
+static PyObject *__pyx_pw_5adios_7varinfo_7write(PyObject *__pyx_v_self, PyObject *__pyx_arg_fd) {
+  int64_t __pyx_v_fd;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write (wrapper)", 0);
+  assert(__pyx_arg_fd); {
+    __pyx_v_fd = __Pyx_PyInt_As_int64_t(__pyx_arg_fd); if (unlikely((__pyx_v_fd == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1450; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.varinfo.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_7varinfo_6write(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self), ((int64_t)__pyx_v_fd));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_7varinfo_6write(struct __pyx_obj_5adios_varinfo *__pyx_v_self, int64_t __pyx_v_fd) {
+  PyObject *__pyx_v_val_ = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  char *__pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write", 0);
+
+  /* "adios.pyx":1451
+ * 
+ *     def write(self, int64_t fd):
+ *         val_ = self.value             # <<<<<<<<<<<<<<
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)
+ */
+  __pyx_t_1 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_v_val_ = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1452
+ *     def write(self, int64_t fd):
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *             val_ = np.array(self.value)
+ * 
+ */
+  __pyx_t_1 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_TypeCheck(__pyx_t_1, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0);
+  if (__pyx_t_3) {
+
+    /* "adios.pyx":1453
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)             # <<<<<<<<<<<<<<
+ * 
+ *         write(fd, self.name, val_)
+ */
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_5, function);
+      }
+    }
+    if (!__pyx_t_4) {
+      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_self->value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+    } else {
+      __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = NULL;
+      __Pyx_INCREF(__pyx_v_self->value);
+      PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_v_self->value);
+      __Pyx_GIVEREF(__pyx_v_self->value);
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF_SET(__pyx_v_val_, __pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios.pyx":1455
+ *             val_ = np.array(self.value)
+ * 
+ *         write(fd, self.name, val_)             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
+ */
+  __pyx_t_7 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_f_5adios_write(__pyx_v_fd, __pyx_t_7, __pyx_v_val_, 0, NULL);
+
+  /* "adios.pyx":1450
+ *         return val_.size * val_.itemsize
+ * 
+ *     def write(self, int64_t fd):             # <<<<<<<<<<<<<<
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("adios.varinfo.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_val_);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1457
+ *         write(fd, self.name, val_)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_7varinfo_9__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_7varinfo_9__repr__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_8__repr__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_7varinfo_8__repr__(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__repr__", 0);
+
+  /* "adios.pyx":1458
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "adios.pyx":1459
+ *     def __repr__(self):
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)             # <<<<<<<<<<<<<<
+ * 
+ * ## ====================
+ */
+  __pyx_t_1 = PyTuple_New(5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_self->name);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name);
+  __Pyx_GIVEREF(__pyx_v_self->name);
+  __Pyx_INCREF(__pyx_v_self->ldim);
+  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->ldim);
+  __Pyx_GIVEREF(__pyx_v_self->ldim);
+  __Pyx_INCREF(__pyx_v_self->gdim);
+  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_self->gdim);
+  __Pyx_GIVEREF(__pyx_v_self->gdim);
+  __Pyx_INCREF(__pyx_v_self->offset);
+  PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_self->offset);
+  __Pyx_GIVEREF(__pyx_v_self->offset);
+  __Pyx_INCREF(__pyx_v_self->value);
+  PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_self->value);
+  __Pyx_GIVEREF(__pyx_v_self->value);
+
+  /* "adios.pyx":1458
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_AdiosVarinfo_name_r_ldim_r_gdim, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "adios.pyx":1457
+ *         write(fd, self.name, val_)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("adios.varinfo.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1402
+ * cdef class varinfo:
+ *     cdef bytes name
+ *     cdef public ldim             # <<<<<<<<<<<<<<
+ *     cdef public gdim
+ *     cdef public offset
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_7varinfo_4ldim_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_7varinfo_4ldim_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_4ldim___get__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_7varinfo_4ldim___get__(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->ldim);
+  __pyx_r = __pyx_v_self->ldim;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_5adios_7varinfo_4ldim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_5adios_7varinfo_4ldim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_4ldim_2__set__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_7varinfo_4ldim_2__set__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->ldim);
+  __Pyx_DECREF(__pyx_v_self->ldim);
+  __pyx_v_self->ldim = __pyx_v_value;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_5adios_7varinfo_4ldim_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_5adios_7varinfo_4ldim_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_4ldim_4__del__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_7varinfo_4ldim_4__del__(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->ldim);
+  __Pyx_DECREF(__pyx_v_self->ldim);
+  __pyx_v_self->ldim = Py_None;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1403
+ *     cdef bytes name
+ *     cdef public ldim
+ *     cdef public gdim             # <<<<<<<<<<<<<<
+ *     cdef public offset
+ *     cdef public value
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_7varinfo_4gdim_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_7varinfo_4gdim_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_4gdim___get__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_7varinfo_4gdim___get__(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->gdim);
+  __pyx_r = __pyx_v_self->gdim;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_5adios_7varinfo_4gdim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_5adios_7varinfo_4gdim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_4gdim_2__set__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_7varinfo_4gdim_2__set__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->gdim);
+  __Pyx_DECREF(__pyx_v_self->gdim);
+  __pyx_v_self->gdim = __pyx_v_value;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_5adios_7varinfo_4gdim_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_5adios_7varinfo_4gdim_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_4gdim_4__del__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_7varinfo_4gdim_4__del__(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->gdim);
+  __Pyx_DECREF(__pyx_v_self->gdim);
+  __pyx_v_self->gdim = Py_None;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1404
+ *     cdef public ldim
+ *     cdef public gdim
+ *     cdef public offset             # <<<<<<<<<<<<<<
+ *     cdef public value
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_7varinfo_6offset_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_7varinfo_6offset_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_6offset___get__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_7varinfo_6offset___get__(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->offset);
+  __pyx_r = __pyx_v_self->offset;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_5adios_7varinfo_6offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_5adios_7varinfo_6offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_6offset_2__set__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_7varinfo_6offset_2__set__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->offset);
+  __Pyx_DECREF(__pyx_v_self->offset);
+  __pyx_v_self->offset = __pyx_v_value;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_5adios_7varinfo_6offset_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_5adios_7varinfo_6offset_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_6offset_4__del__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_7varinfo_6offset_4__del__(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->offset);
+  __Pyx_DECREF(__pyx_v_self->offset);
+  __pyx_v_self->offset = Py_None;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1405
+ *     cdef public gdim
+ *     cdef public offset
+ *     cdef public value             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, char * name,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_7varinfo_5value_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_5adios_7varinfo_5value_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_5value___get__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_7varinfo_5value___get__(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->value);
+  __pyx_r = __pyx_v_self->value;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_5adios_7varinfo_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_5adios_7varinfo_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_5value_2__set__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_7varinfo_5value_2__set__(struct __pyx_obj_5adios_varinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->value);
+  __Pyx_DECREF(__pyx_v_self->value);
+  __pyx_v_self->value = __pyx_v_value;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_5adios_7varinfo_5value_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_5adios_7varinfo_5value_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_7varinfo_5value_4__del__(((struct __pyx_obj_5adios_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5adios_7varinfo_5value_4__del__(struct __pyx_obj_5adios_varinfo *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->value);
+  __Pyx_DECREF(__pyx_v_self->value);
+  __pyx_v_self->value = Py_None;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1465
+ * ## ====================
+ * 
+ * def readvar(fname, varname):             # <<<<<<<<<<<<<<
+ *     """ Retrieve a variable value from an Adios file.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_49readvar(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_5adios_48readvar[] = "readvar(fname, varname)\n Retrieve a variable value from an Adios file.\n\n    Args:\n        fname (str): Adios file name\n        varname (str): Variable name to retrieve\n\n    Returns:\n        NumPy ndarray: variable value\n    ";
+static PyMethodDef __pyx_mdef_5adios_49readvar = {"readvar", (PyCFunction)__pyx_pw_5adios_49readvar, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_48readvar};
+static PyObject *__pyx_pw_5adios_49readvar(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_fname = 0;
+  PyObject *__pyx_v_varname = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("readvar (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_varname,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_varname)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("readvar", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "readvar") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_fname = values[0];
+    __pyx_v_varname = values[1];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("readvar", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios.readvar", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5adios_48readvar(__pyx_self, __pyx_v_fname, __pyx_v_varname);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_48readvar(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname, PyObject *__pyx_v_varname) {
+  struct __pyx_obj_5adios_file *__pyx_v_f = NULL;
+  PyObject *__pyx_v_v = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("readvar", 0);
+
+  /* "adios.pyx":1475
+ *         NumPy ndarray: variable value
+ *     """
+ *     f = file(fname, comm=MPI_COMM_SELF)             # <<<<<<<<<<<<<<
+ *     if not f.var.has_key(varname):
+ *         print "No valid variable"
+ */
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_fname);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fname);
+  __Pyx_GIVEREF(__pyx_v_fname);
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyInt_From_int(MPI_COMM_SELF); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_comm, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_file)), __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_f = ((struct __pyx_obj_5adios_file *)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":1476
+ *     """
+ *     f = file(fname, comm=MPI_COMM_SELF)
+ *     if not f.var.has_key(varname):             # <<<<<<<<<<<<<<
+ *         print "No valid variable"
+ *         return
+ */
+  if (unlikely(__pyx_v_f->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_4 = PyDict_Contains(__pyx_v_f->var, __pyx_v_varname); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = ((!(__pyx_t_4 != 0)) != 0);
+  if (__pyx_t_5) {
+
+    /* "adios.pyx":1477
+ *     f = file(fname, comm=MPI_COMM_SELF)
+ *     if not f.var.has_key(varname):
+ *         print "No valid variable"             # <<<<<<<<<<<<<<
+ *         return
+ * 
+ */
+    if (__Pyx_PrintOne(0, __pyx_kp_s_No_valid_variable) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "adios.pyx":1478
+ *     if not f.var.has_key(varname):
+ *         print "No valid variable"
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ *     v = f.var[varname]
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+  }
+
+  /* "adios.pyx":1480
+ *         return
+ * 
+ *     v = f.var[varname]             # <<<<<<<<<<<<<<
+ *     return v.read(from_steps=0, nsteps=v.nsteps)
+ * 
+ */
+  if (unlikely(__pyx_v_f->var == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_f->var, __pyx_v_varname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1480; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_v = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":1481
+ * 
+ *     v = f.var[varname]
+ *     return v.read(from_steps=0, nsteps=v.nsteps)             # <<<<<<<<<<<<<<
+ * 
+ * def bpls(fname):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_read); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_from_steps, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_nsteps, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "adios.pyx":1465
+ * ## ====================
+ * 
+ * def readvar(fname, varname):             # <<<<<<<<<<<<<<
+ *     """ Retrieve a variable value from an Adios file.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios.readvar", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_f);
+  __Pyx_XDECREF(__pyx_v_v);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios.pyx":1483
+ *     return v.read(from_steps=0, nsteps=v.nsteps)
+ * 
+ * def bpls(fname):             # <<<<<<<<<<<<<<
+ *     """ Return meta data of an Adios file as a Python dictionary object.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5adios_51bpls(PyObject *__pyx_self, PyObject *__pyx_v_fname); /*proto*/
+static char __pyx_doc_5adios_50bpls[] = "bpls(fname)\n Return meta data of an Adios file as a Python dictionary object.\n\n    Args:\n        fname (str): Adios file name\n\n    Returns:\n        dict: Adios file meta data\n    ";
+static PyMethodDef __pyx_mdef_5adios_51bpls = {"bpls", (PyCFunction)__pyx_pw_5adios_51bpls, METH_O, __pyx_doc_5adios_50bpls};
+static PyObject *__pyx_pw_5adios_51bpls(PyObject *__pyx_self, PyObject *__pyx_v_fname) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("bpls (wrapper)", 0);
+  __pyx_r = __pyx_pf_5adios_50bpls(__pyx_self, ((PyObject *)__pyx_v_fname));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5adios_50bpls(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname) {
+  struct __pyx_obj_5adios_file *__pyx_v_f = NULL;
+  PyObject *__pyx_v_k = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  Py_ssize_t __pyx_t_5;
+  int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("bpls", 0);
+
+  /* "adios.pyx":1492
+ *         dict: Adios file meta data
+ *     """
+ *     f = file(fname, comm=MPI_COMM_SELF)             # <<<<<<<<<<<<<<
+ *     return {'nvars': f.nvars,
+ *             'nattrs': f.nattrs,
+ */
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_fname);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fname);
+  __Pyx_GIVEREF(__pyx_v_fname);
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyInt_From_int(MPI_COMM_SELF); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_comm, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5adios_file)), __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_f = ((struct __pyx_obj_5adios_file *)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "adios.pyx":1493
+ *     """
+ *     f = file(fname, comm=MPI_COMM_SELF)
+ *     return {'nvars': f.nvars,             # <<<<<<<<<<<<<<
+ *             'nattrs': f.nattrs,
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->nvars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_nvars, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "adios.pyx":1494
+ *     f = file(fname, comm=MPI_COMM_SELF)
+ *     return {'nvars': f.nvars,
+ *             'nattrs': f.nattrs,             # <<<<<<<<<<<<<<
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->nattrs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_nattrs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "adios.pyx":1495
+ *     return {'nvars': f.nvars,
+ *             'nattrs': f.nattrs,
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),             # <<<<<<<<<<<<<<
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
+ *             'time_steps': (f.current_step, f.last_step),
+ */
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_4 = 0;
+  if (unlikely(__pyx_v_f->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iterkeys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_f->var, 1, __pyx_n_s_iterkeys, (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_1);
+  __pyx_t_1 = __pyx_t_7;
+  __pyx_t_7 = 0;
+  while (1) {
+    __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_5, &__pyx_t_4, &__pyx_t_7, NULL, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_8 == 0)) break;
+    if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_7);
+    __pyx_t_7 = 0;
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_v_k))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_vars, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "adios.pyx":1496
+ *             'nattrs': f.nattrs,
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),             # <<<<<<<<<<<<<<
+ *             'time_steps': (f.current_step, f.last_step),
+ *             'file_size': f.file_size}
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = 0;
+  if (unlikely(__pyx_v_f->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iterkeys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_f->attr, 1, __pyx_n_s_iterkeys, (&__pyx_t_4), (&__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_2);
+  __pyx_t_2 = __pyx_t_7;
+  __pyx_t_7 = 0;
+  while (1) {
+    __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_2, __pyx_t_4, &__pyx_t_5, &__pyx_t_7, NULL, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_8 == 0)) break;
+    if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_7);
+    __pyx_t_7 = 0;
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_v_k))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_attrs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "adios.pyx":1497
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
+ *             'time_steps': (f.current_step, f.last_step),             # <<<<<<<<<<<<<<
+ *             'file_size': f.file_size}
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->current_step); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_2 = 0;
+  __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_time_steps, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "adios.pyx":1498
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
+ *             'time_steps': (f.current_step, f.last_step),
+ *             'file_size': f.file_size}             # <<<<<<<<<<<<<<
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_f->file_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_file_size, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
+  goto __pyx_L0;
+
+  /* "adios.pyx":1483
+ *     return v.read(from_steps=0, nsteps=v.nsteps)
+ * 
+ * def bpls(fname):             # <<<<<<<<<<<<<<
+ *     """ Return meta data of an Adios file as a Python dictionary object.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("adios.bpls", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_f);
+  __Pyx_XDECREF(__pyx_v_k);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197
+ *         # experimental exception made for __getbuffer__ and __releasebuffer__
+ *         # -- the details of this may change.
+ *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
+ *             # This implementation of getbuffer is geared towards Cython
+ *             # requirements, and does not yet fullfill the PEP.
+ */
+
+/* Python wrapper */
+static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
+static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
+  int __pyx_v_copy_shape;
+  int __pyx_v_i;
+  int __pyx_v_ndim;
+  int __pyx_v_endian_detector;
+  int __pyx_v_little_endian;
+  int __pyx_v_t;
+  char *__pyx_v_f;
+  PyArray_Descr *__pyx_v_descr = 0;
+  int __pyx_v_offset;
+  int __pyx_v_hasfields;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  char *__pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__getbuffer__", 0);
+  if (__pyx_v_info != NULL) {
+    __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(__pyx_v_info->obj);
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":203
+ *             # of flags
+ * 
+ *             if info == NULL: return             # <<<<<<<<<<<<<<
+ * 
+ *             cdef int copy_shape, i, ndim
+ */
+  __pyx_t_1 = ((__pyx_v_info == NULL) != 0);
+  if (__pyx_t_1) {
+    __pyx_r = 0;
+    goto __pyx_L0;
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":206
+ * 
+ *             cdef int copy_shape, i, ndim
+ *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<
+ *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+ * 
+ */
+  __pyx_v_endian_detector = 1;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":207
+ *             cdef int copy_shape, i, ndim
+ *             cdef int endian_detector = 1
+ *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
+ * 
+ *             ndim = PyArray_NDIM(self)
+ */
+  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":209
+ *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+ * 
+ *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<
+ * 
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ */
+  __pyx_v_ndim = PyArray_NDIM(__pyx_v_self);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211
+ *             ndim = PyArray_NDIM(self)
+ * 
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
+ *                 copy_shape = 1
+ *             else:
+ */
+  __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":212
+ * 
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *                 copy_shape = 1             # <<<<<<<<<<<<<<
+ *             else:
+ *                 copy_shape = 0
+ */
+    __pyx_v_copy_shape = 1;
+    goto __pyx_L4;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":214
+ *                 copy_shape = 1
+ *             else:
+ *                 copy_shape = 0             # <<<<<<<<<<<<<<
+ * 
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ */
+    __pyx_v_copy_shape = 0;
+  }
+  __pyx_L4:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216
+ *                 copy_shape = 0
+ * 
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not C contiguous")
+ */
+  __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0);
+  if (__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L6_bool_binop_done;
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":217
+ * 
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<
+ *                 raise ValueError(u"ndarray is not C contiguous")
+ * 
+ */
+  __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0);
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L6_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__39, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220
+ *                 raise ValueError(u"ndarray is not C contiguous")
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<
+ *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ */
+  __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0);
+  if (__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L9_bool_binop_done;
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":221
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ * 
+ */
+  __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0);
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L9_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
+ * 
+ *             info.buf = PyArray_DATA(self)
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__40, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":224
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ * 
+ *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<
+ *             info.ndim = ndim
+ *             if copy_shape:
+ */
+  __pyx_v_info->buf = PyArray_DATA(__pyx_v_self);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":225
+ * 
+ *             info.buf = PyArray_DATA(self)
+ *             info.ndim = ndim             # <<<<<<<<<<<<<<
+ *             if copy_shape:
+ *                 # Allocate new buffer for strides and shape info.
+ */
+  __pyx_v_info->ndim = __pyx_v_ndim;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226
+ *             info.buf = PyArray_DATA(self)
+ *             info.ndim = ndim
+ *             if copy_shape:             # <<<<<<<<<<<<<<
+ *                 # Allocate new buffer for strides and shape info.
+ *                 # This is allocated as one block, strides first.
+ */
+  __pyx_t_1 = (__pyx_v_copy_shape != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":229
+ *                 # Allocate new buffer for strides and shape info.
+ *                 # This is allocated as one block, strides first.
+ *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)             # <<<<<<<<<<<<<<
+ *                 info.shape = info.strides + ndim
+ *                 for i in range(ndim):
+ */
+    __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2)));
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":230
+ *                 # This is allocated as one block, strides first.
+ *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)
+ *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<
+ *                 for i in range(ndim):
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]
+ */
+    __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":231
+ *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)
+ *                 info.shape = info.strides + ndim
+ *                 for i in range(ndim):             # <<<<<<<<<<<<<<
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]
+ *                     info.shape[i] = PyArray_DIMS(self)[i]
+ */
+    __pyx_t_4 = __pyx_v_ndim;
+    for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
+      __pyx_v_i = __pyx_t_5;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":232
+ *                 info.shape = info.strides + ndim
+ *                 for i in range(ndim):
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<
+ *                     info.shape[i] = PyArray_DIMS(self)[i]
+ *             else:
+ */
+      (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]);
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":233
+ *                 for i in range(ndim):
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]
+ *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<
+ *             else:
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+ */
+      (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]);
+    }
+    goto __pyx_L11;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":235
+ *                     info.shape[i] = PyArray_DIMS(self)[i]
+ *             else:
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
+ *             info.suboffsets = NULL
+ */
+    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self));
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":236
+ *             else:
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)             # <<<<<<<<<<<<<<
+ *             info.suboffsets = NULL
+ *             info.itemsize = PyArray_ITEMSIZE(self)
+ */
+    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self));
+  }
+  __pyx_L11:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":237
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
+ *             info.suboffsets = NULL             # <<<<<<<<<<<<<<
+ *             info.itemsize = PyArray_ITEMSIZE(self)
+ *             info.readonly = not PyArray_ISWRITEABLE(self)
+ */
+  __pyx_v_info->suboffsets = NULL;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":238
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
+ *             info.suboffsets = NULL
+ *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<
+ *             info.readonly = not PyArray_ISWRITEABLE(self)
+ * 
+ */
+  __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":239
+ *             info.suboffsets = NULL
+ *             info.itemsize = PyArray_ITEMSIZE(self)
+ *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<
+ * 
+ *             cdef int t
+ */
+  __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0));
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":242
+ * 
+ *             cdef int t
+ *             cdef char* f = NULL             # <<<<<<<<<<<<<<
+ *             cdef dtype descr = self.descr
+ *             cdef list stack
+ */
+  __pyx_v_f = NULL;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":243
+ *             cdef int t
+ *             cdef char* f = NULL
+ *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<
+ *             cdef list stack
+ *             cdef int offset
+ */
+  __pyx_t_3 = ((PyObject *)__pyx_v_self->descr);
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":247
+ *             cdef int offset
+ * 
+ *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<
+ * 
+ *             if not hasfields and not copy_shape:
+ */
+  __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":249
+ *             cdef bint hasfields = PyDataType_HASFIELDS(descr)
+ * 
+ *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<
+ *                 # do not call releasebuffer
+ *                 info.obj = None
+ */
+  __pyx_t_2 = ((!(__pyx_v_hasfields != 0)) != 0);
+  if (__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L15_bool_binop_done;
+  }
+  __pyx_t_2 = ((!(__pyx_v_copy_shape != 0)) != 0);
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L15_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":251
+ *             if not hasfields and not copy_shape:
+ *                 # do not call releasebuffer
+ *                 info.obj = None             # <<<<<<<<<<<<<<
+ *             else:
+ *                 # need to call releasebuffer
+ */
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj);
+    __pyx_v_info->obj = Py_None;
+    goto __pyx_L14;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":254
+ *             else:
+ *                 # need to call releasebuffer
+ *                 info.obj = self             # <<<<<<<<<<<<<<
+ * 
+ *             if not hasfields:
+ */
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj);
+    __pyx_v_info->obj = ((PyObject *)__pyx_v_self);
+  }
+  __pyx_L14:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":256
+ *                 info.obj = self
+ * 
+ *             if not hasfields:             # <<<<<<<<<<<<<<
+ *                 t = descr.type_num
+ *                 if ((descr.byteorder == c'>' and little_endian) or
+ */
+  __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257
+ * 
+ *             if not hasfields:
+ *                 t = descr.type_num             # <<<<<<<<<<<<<<
+ *                 if ((descr.byteorder == c'>' and little_endian) or
+ *                     (descr.byteorder == c'<' and not little_endian)):
+ */
+    __pyx_t_4 = __pyx_v_descr->type_num;
+    __pyx_v_t = __pyx_t_4;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":258
+ *             if not hasfields:
+ *                 t = descr.type_num
+ *                 if ((descr.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
+ *                     (descr.byteorder == c'<' and not little_endian)):
+ *                     raise ValueError(u"Non-native byte order not supported")
+ */
+    __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0);
+    if (!__pyx_t_2) {
+      goto __pyx_L20_next_or;
+    } else {
+    }
+    __pyx_t_2 = (__pyx_v_little_endian != 0);
+    if (!__pyx_t_2) {
+    } else {
+      __pyx_t_1 = __pyx_t_2;
+      goto __pyx_L19_bool_binop_done;
+    }
+    __pyx_L20_next_or:;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259
+ *                 t = descr.type_num
+ *                 if ((descr.byteorder == c'>' and little_endian) or
+ *                     (descr.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
+ *                     raise ValueError(u"Non-native byte order not supported")
+ *                 if   t == NPY_BYTE:        f = "b"
+ */
+    __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0);
+    if (__pyx_t_2) {
+    } else {
+      __pyx_t_1 = __pyx_t_2;
+      goto __pyx_L19_bool_binop_done;
+    }
+    __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0);
+    __pyx_t_1 = __pyx_t_2;
+    __pyx_L19_bool_binop_done:;
+    if (__pyx_t_1) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260
+ *                 if ((descr.byteorder == c'>' and little_endian) or
+ *                     (descr.byteorder == c'<' and not little_endian)):
+ *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *                 if   t == NPY_BYTE:        f = "b"
+ *                 elif t == NPY_UBYTE:       f = "B"
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__41, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ */
+    switch (__pyx_v_t) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":261
+ *                     (descr.byteorder == c'<' and not little_endian)):
+ *                     raise ValueError(u"Non-native byte order not supported")
+ *                 if   t == NPY_BYTE:        f = "b"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_UBYTE:       f = "B"
+ *                 elif t == NPY_SHORT:       f = "h"
+ */
+      case NPY_BYTE:
+      __pyx_v_f = __pyx_k_b;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":262
+ *                     raise ValueError(u"Non-native byte order not supported")
+ *                 if   t == NPY_BYTE:        f = "b"
+ *                 elif t == NPY_UBYTE:       f = "B"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_SHORT:       f = "h"
+ *                 elif t == NPY_USHORT:      f = "H"
+ */
+      case NPY_UBYTE:
+      __pyx_v_f = __pyx_k_B;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":263
+ *                 if   t == NPY_BYTE:        f = "b"
+ *                 elif t == NPY_UBYTE:       f = "B"
+ *                 elif t == NPY_SHORT:       f = "h"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_USHORT:      f = "H"
+ *                 elif t == NPY_INT:         f = "i"
+ */
+      case NPY_SHORT:
+      __pyx_v_f = __pyx_k_h;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":264
+ *                 elif t == NPY_UBYTE:       f = "B"
+ *                 elif t == NPY_SHORT:       f = "h"
+ *                 elif t == NPY_USHORT:      f = "H"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_INT:         f = "i"
+ *                 elif t == NPY_UINT:        f = "I"
+ */
+      case NPY_USHORT:
+      __pyx_v_f = __pyx_k_H;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":265
+ *                 elif t == NPY_SHORT:       f = "h"
+ *                 elif t == NPY_USHORT:      f = "H"
+ *                 elif t == NPY_INT:         f = "i"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_UINT:        f = "I"
+ *                 elif t == NPY_LONG:        f = "l"
+ */
+      case NPY_INT:
+      __pyx_v_f = __pyx_k_i;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":266
+ *                 elif t == NPY_USHORT:      f = "H"
+ *                 elif t == NPY_INT:         f = "i"
+ *                 elif t == NPY_UINT:        f = "I"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_LONG:        f = "l"
+ *                 elif t == NPY_ULONG:       f = "L"
+ */
+      case NPY_UINT:
+      __pyx_v_f = __pyx_k_I;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":267
+ *                 elif t == NPY_INT:         f = "i"
+ *                 elif t == NPY_UINT:        f = "I"
+ *                 elif t == NPY_LONG:        f = "l"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_ULONG:       f = "L"
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ */
+      case NPY_LONG:
+      __pyx_v_f = __pyx_k_l;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":268
+ *                 elif t == NPY_UINT:        f = "I"
+ *                 elif t == NPY_LONG:        f = "l"
+ *                 elif t == NPY_ULONG:       f = "L"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ */
+      case NPY_ULONG:
+      __pyx_v_f = __pyx_k_L;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":269
+ *                 elif t == NPY_LONG:        f = "l"
+ *                 elif t == NPY_ULONG:       f = "L"
+ *                 elif t == NPY_LONGLONG:    f = "q"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ *                 elif t == NPY_FLOAT:       f = "f"
+ */
+      case NPY_LONGLONG:
+      __pyx_v_f = __pyx_k_q;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":270
+ *                 elif t == NPY_ULONG:       f = "L"
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ *                 elif t == NPY_ULONGLONG:   f = "Q"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_FLOAT:       f = "f"
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ */
+      case NPY_ULONGLONG:
+      __pyx_v_f = __pyx_k_Q;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":271
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ *                 elif t == NPY_FLOAT:       f = "f"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ */
+      case NPY_FLOAT:
+      __pyx_v_f = __pyx_k_f;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":272
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ *                 elif t == NPY_FLOAT:       f = "f"
+ *                 elif t == NPY_DOUBLE:      f = "d"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ */
+      case NPY_DOUBLE:
+      __pyx_v_f = __pyx_k_d;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":273
+ *                 elif t == NPY_FLOAT:       f = "f"
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ */
+      case NPY_LONGDOUBLE:
+      __pyx_v_f = __pyx_k_g;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ *                 elif t == NPY_CFLOAT:      f = "Zf"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ */
+      case NPY_CFLOAT:
+      __pyx_v_f = __pyx_k_Zf;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":275
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ *                 elif t == NPY_OBJECT:      f = "O"
+ */
+      case NPY_CDOUBLE:
+      __pyx_v_f = __pyx_k_Zd;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":276
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_OBJECT:      f = "O"
+ *                 else:
+ */
+      case NPY_CLONGDOUBLE:
+      __pyx_v_f = __pyx_k_Zg;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ */
+      case NPY_OBJECT:
+      __pyx_v_f = __pyx_k_O;
+      break;
+      default:
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":279
+ *                 elif t == NPY_OBJECT:      f = "O"
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *                 info.format = f
+ *                 return
+ */
+      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6);
+      __Pyx_GIVEREF(__pyx_t_6);
+      __pyx_t_6 = 0;
+      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_Raise(__pyx_t_6, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      break;
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":280
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                 info.format = f             # <<<<<<<<<<<<<<
+ *                 return
+ *             else:
+ */
+    __pyx_v_info->format = __pyx_v_f;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":281
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                 info.format = f
+ *                 return             # <<<<<<<<<<<<<<
+ *             else:
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+ */
+    __pyx_r = 0;
+    goto __pyx_L0;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":283
+ *                 return
+ *             else:
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<
+ *                 info.format[0] = c'^' # Native data types, manual alignment
+ *                 offset = 0
+ */
+    __pyx_v_info->format = ((char *)malloc(255));
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":284
+ *             else:
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+ *                 info.format[0] = c'^' # Native data types, manual alignment             # <<<<<<<<<<<<<<
+ *                 offset = 0
+ *                 f = _util_dtypestring(descr, info.format + 1,
+ */
+    (__pyx_v_info->format[0]) = '^';
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":285
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+ *                 info.format[0] = c'^' # Native data types, manual alignment
+ *                 offset = 0             # <<<<<<<<<<<<<<
+ *                 f = _util_dtypestring(descr, info.format + 1,
+ *                                       info.format + _buffer_format_string_len,
+ */
+    __pyx_v_offset = 0;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":286
+ *                 info.format[0] = c'^' # Native data types, manual alignment
+ *                 offset = 0
+ *                 f = _util_dtypestring(descr, info.format + 1,             # <<<<<<<<<<<<<<
+ *                                       info.format + _buffer_format_string_len,
+ *                                       &offset)
+ */
+    __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_f = __pyx_t_7;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":289
+ *                                       info.format + _buffer_format_string_len,
+ *                                       &offset)
+ *                 f[0] = c'\0' # Terminate format string             # <<<<<<<<<<<<<<
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ */
+    (__pyx_v_f[0]) = '\x00';
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197
+ *         # experimental exception made for __getbuffer__ and __releasebuffer__
+ *         # -- the details of this may change.
+ *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
+ *             # This implementation of getbuffer is geared towards Cython
+ *             # requirements, and does not yet fullfill the PEP.
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) {
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;
+  }
+  goto __pyx_L2;
+  __pyx_L0:;
+  if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) {
+    __Pyx_GOTREF(Py_None);
+    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;
+  }
+  __pyx_L2:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_descr);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291
+ *                 f[0] = c'\0' # Terminate format string
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)
+ */
+
+/* Python wrapper */
+static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
+static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0);
+  __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__releasebuffer__", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":292
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<
+ *                 stdlib.free(info.format)
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ */
+  __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":293
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *                 stdlib.free(info.strides)
+ */
+    free(__pyx_v_info->format);
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":294
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
+ *                 stdlib.free(info.strides)
+ *                 # info.shape was stored after info.strides in the same block
+ */
+  __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":295
+ *                 stdlib.free(info.format)
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<
+ *                 # info.shape was stored after info.strides in the same block
+ * 
+ */
+    free(__pyx_v_info->strides);
+    goto __pyx_L4;
+  }
+  __pyx_L4:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291
+ *                 f[0] = c'\0' # Terminate format string
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)
+ */
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771
+ * ctypedef npy_cdouble     complex_t
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":772
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):
+ *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771
+ * ctypedef npy_cdouble     complex_t
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":775
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":778
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":781
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":784
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":786
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
+ *     # Recursive utility function used in __getbuffer__ to get format
+ *     # string. The new location in the format string is returned.
+ */
+
+static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
+  PyArray_Descr *__pyx_v_child = 0;
+  int __pyx_v_endian_detector;
+  int __pyx_v_little_endian;
+  PyObject *__pyx_v_fields = 0;
+  PyObject *__pyx_v_childname = NULL;
+  PyObject *__pyx_v_new_offset = NULL;
+  PyObject *__pyx_v_t = NULL;
+  char *__pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  long __pyx_t_8;
+  char *__pyx_t_9;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_util_dtypestring", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":793
+ *     cdef int delta_offset
+ *     cdef tuple i
+ *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
+ *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+ *     cdef tuple fields
+ */
+  __pyx_v_endian_detector = 1;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794
+ *     cdef tuple i
+ *     cdef int endian_detector = 1
+ *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
+ *     cdef tuple fields
+ * 
+ */
+  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":797
+ *     cdef tuple fields
+ * 
+ *     for childname in descr.names:             # <<<<<<<<<<<<<<
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields
+ */
+  if (unlikely(__pyx_v_descr->names == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  for (;;) {
+    if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+    #if CYTHON_COMPILING_IN_CPYTHON
+    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #else
+    __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798
+ * 
+ *     for childname in descr.names:
+ *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
+ *         child, new_offset = fields
+ * 
+ */
+    if (unlikely(__pyx_v_descr->fields == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3));
+    __pyx_t_3 = 0;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799
+ *     for childname in descr.names:
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields             # <<<<<<<<<<<<<<
+ * 
+ *         if (end - f) - <int>(new_offset - offset[0]) < 15:
+ */
+    if (likely(__pyx_v_fields != Py_None)) {
+      PyObject* sequence = __pyx_v_fields;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 2)) {
+        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      #else
+      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      #endif
+    } else {
+      __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3));
+    __pyx_t_3 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801
+ *         child, new_offset = fields
+ * 
+ *         if (end - f) - <int>(new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+ * 
+ */
+    __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0);
+    if (__pyx_t_6) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802
+ * 
+ *         if (end - f) - <int>(new_offset - offset[0]) < 15:
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
+ * 
+ *         if ((child.byteorder == c'>' and little_endian) or
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__42, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":804
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+ * 
+ *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
+ *             (child.byteorder == c'<' and not little_endian)):
+ *             raise ValueError(u"Non-native byte order not supported")
+ */
+    __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0);
+    if (!__pyx_t_7) {
+      goto __pyx_L8_next_or;
+    } else {
+    }
+    __pyx_t_7 = (__pyx_v_little_endian != 0);
+    if (!__pyx_t_7) {
+    } else {
+      __pyx_t_6 = __pyx_t_7;
+      goto __pyx_L7_bool_binop_done;
+    }
+    __pyx_L8_next_or:;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":805
+ * 
+ *         if ((child.byteorder == c'>' and little_endian) or
+ *             (child.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
+ *             raise ValueError(u"Non-native byte order not supported")
+ *             # One could encode it in the format string and have Cython
+ */
+    __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0);
+    if (__pyx_t_7) {
+    } else {
+      __pyx_t_6 = __pyx_t_7;
+      goto __pyx_L7_bool_binop_done;
+    }
+    __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0);
+    __pyx_t_6 = __pyx_t_7;
+    __pyx_L7_bool_binop_done:;
+    if (__pyx_t_6) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":806
+ *         if ((child.byteorder == c'>' and little_endian) or
+ *             (child.byteorder == c'<' and not little_endian)):
+ *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *             # One could encode it in the format string and have Cython
+ *             # complain instead, BUT: < and > in format strings also imply
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__43, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":816
+ * 
+ *         # Output padding bytes
+ *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
+ *             f[0] = 120 # "x"; pad byte
+ *             f += 1
+ */
+    while (1) {
+      __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (!__pyx_t_6) break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":817
+ *         # Output padding bytes
+ *         while offset[0] < new_offset:
+ *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
+ *             f += 1
+ *             offset[0] += 1
+ */
+      (__pyx_v_f[0]) = 120;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":818
+ *         while offset[0] < new_offset:
+ *             f[0] = 120 # "x"; pad byte
+ *             f += 1             # <<<<<<<<<<<<<<
+ *             offset[0] += 1
+ * 
+ */
+      __pyx_v_f = (__pyx_v_f + 1);
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":819
+ *             f[0] = 120 # "x"; pad byte
+ *             f += 1
+ *             offset[0] += 1             # <<<<<<<<<<<<<<
+ * 
+ *         offset[0] += child.itemsize
+ */
+      __pyx_t_8 = 0;
+      (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1);
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":821
+ *             offset[0] += 1
+ * 
+ *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
+ * 
+ *         if not PyDataType_HASFIELDS(child):
+ */
+    __pyx_t_8 = 0;
+    (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize);
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823
+ *         offset[0] += child.itemsize
+ * 
+ *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
+ *             t = child.type_num
+ *             if end - f < 5:
+ */
+    __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0);
+    if (__pyx_t_6) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":824
+ * 
+ *         if not PyDataType_HASFIELDS(child):
+ *             t = child.type_num             # <<<<<<<<<<<<<<
+ *             if end - f < 5:
+ *                 raise RuntimeError(u"Format string allocated too short.")
+ */
+      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4);
+      __pyx_t_4 = 0;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":825
+ *         if not PyDataType_HASFIELDS(child):
+ *             t = child.type_num
+ *             if end - f < 5:             # <<<<<<<<<<<<<<
+ *                 raise RuntimeError(u"Format string allocated too short.")
+ * 
+ */
+      __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0);
+      if (__pyx_t_6) {
+
+        /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826
+ *             t = child.type_num
+ *             if end - f < 5:
+ *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
+ * 
+ *             # Until ticket #99 is fixed, use integers to avoid warnings
+ */
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__44, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":829
+ * 
+ *             # Until ticket #99 is fixed, use integers to avoid warnings
+ *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 98;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":830
+ *             # Until ticket #99 is fixed, use integers to avoid warnings
+ *             if   t == NPY_BYTE:        f[0] =  98 #"b"
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 66;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":831
+ *             if   t == NPY_BYTE:        f[0] =  98 #"b"
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 104;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":832
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 72;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":833
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 105;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":834
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 73;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":835
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 108;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":836
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 76;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":837
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 113;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":838
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 81;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":839
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 102;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":840
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 100;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":841
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 103;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":842
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 90;
+        (__pyx_v_f[1]) = 102;
+        __pyx_v_f = (__pyx_v_f + 1);
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":843
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 90;
+        (__pyx_v_f[1]) = 100;
+        __pyx_v_f = (__pyx_v_f + 1);
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":844
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+ *             else:
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 90;
+        (__pyx_v_f[1]) = 103;
+        __pyx_v_f = (__pyx_v_f + 1);
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":845
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
+ *             else:
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 79;
+        goto __pyx_L15;
+      }
+      /*else*/ {
+
+        /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":847
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+ *             else:
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *             f += 1
+ *         else:
+ */
+        __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
+        __Pyx_GIVEREF(__pyx_t_3);
+        __pyx_t_3 = 0;
+        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_L15:;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":848
+ *             else:
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *             f += 1             # <<<<<<<<<<<<<<
+ *         else:
+ *             # Cython ignores struct boundary information ("T{...}"),
+ */
+      __pyx_v_f = (__pyx_v_f + 1);
+      goto __pyx_L13;
+    }
+    /*else*/ {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":852
+ *             # Cython ignores struct boundary information ("T{...}"),
+ *             # so don't output it
+ *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
+ *     return f
+ * 
+ */
+      __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_f = __pyx_t_9;
+    }
+    __pyx_L13:;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":797
+ *     cdef tuple fields
+ * 
+ *     for childname in descr.names:             # <<<<<<<<<<<<<<
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields
+ */
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":853
+ *             # so don't output it
+ *             f = _util_dtypestring(child, f, end, offset)
+ *     return f             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_f;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":786
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
+ *     # Recursive utility function used in __getbuffer__ to get format
+ *     # string. The new location in the format string is returned.
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_child);
+  __Pyx_XDECREF(__pyx_v_fields);
+  __Pyx_XDECREF(__pyx_v_childname);
+  __Pyx_XDECREF(__pyx_v_new_offset);
+  __Pyx_XDECREF(__pyx_v_t);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969
+ * 
+ * 
+ * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ */
+
+static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
+  PyObject *__pyx_v_baseptr;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  __Pyx_RefNannySetupContext("set_array_base", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":971
+ * cdef inline void set_array_base(ndarray arr, object base):
+ *      cdef PyObject* baseptr
+ *      if base is None:             # <<<<<<<<<<<<<<
+ *          baseptr = NULL
+ *      else:
+ */
+  __pyx_t_1 = (__pyx_v_base == Py_None);
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":972
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ *          baseptr = NULL             # <<<<<<<<<<<<<<
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!
+ */
+    __pyx_v_baseptr = NULL;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":974
+ *          baseptr = NULL
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<
+ *          baseptr = <PyObject*>base
+ *      Py_XDECREF(arr.base)
+ */
+    Py_INCREF(__pyx_v_base);
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":975
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!
+ *          baseptr = <PyObject*>base             # <<<<<<<<<<<<<<
+ *      Py_XDECREF(arr.base)
+ *      arr.base = baseptr
+ */
+    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);
+  }
+  __pyx_L3:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976
+ *          Py_INCREF(base) # important to do this before decref below!
+ *          baseptr = <PyObject*>base
+ *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<
+ *      arr.base = baseptr
+ * 
+ */
+  Py_XDECREF(__pyx_v_arr->base);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977
+ *          baseptr = <PyObject*>base
+ *      Py_XDECREF(arr.base)
+ *      arr.base = baseptr             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object get_array_base(ndarray arr):
+ */
+  __pyx_v_arr->base = __pyx_v_baseptr;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969
+ * 
+ * 
+ * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ */
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979
+ *      arr.base = baseptr
+ * 
+ * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
+ *     if arr.base is NULL:
+ *         return None
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("get_array_base", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":980
+ * 
+ * cdef inline object get_array_base(ndarray arr):
+ *     if arr.base is NULL:             # <<<<<<<<<<<<<<
+ *         return None
+ *     else:
+ */
+  __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":981
+ * cdef inline object get_array_base(ndarray arr):
+ *     if arr.base is NULL:
+ *         return None             # <<<<<<<<<<<<<<
+ *     else:
+ *         return <object>arr.base
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(Py_None);
+    __pyx_r = Py_None;
+    goto __pyx_L0;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":983
+ *         return None
+ *     else:
+ *         return <object>arr.base             # <<<<<<<<<<<<<<
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));
+    __pyx_r = ((PyObject *)__pyx_v_arr->base);
+    goto __pyx_L0;
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979
+ *      arr.base = baseptr
+ * 
+ * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
+ *     if arr.base is NULL:
+ *         return None
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static struct __pyx_vtabstruct_5adios_file __pyx_vtable_5adios_file;
+
+static PyObject *__pyx_tp_new_5adios_file(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_5adios_file *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_5adios_file *)o);
+  p->__pyx_vtab = __pyx_vtabptr_5adios_file;
+  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios_file(PyObject *o) {
+  struct __pyx_obj_5adios_file *p = (struct __pyx_obj_5adios_file *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->name);
+  Py_CLEAR(p->var);
+  Py_CLEAR(p->attr);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_5adios_file(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios_file *p = (struct __pyx_obj_5adios_file *)o;
+  if (p->var) {
+    e = (*v)(p->var, a); if (e) return e;
+  }
+  if (p->attr) {
+    e = (*v)(p->attr, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios_file(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios_file *p = (struct __pyx_obj_5adios_file *)o;
+  tmp = ((PyObject*)p->var);
+  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->attr);
+  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+static PyObject *__pyx_sq_item_5adios_file(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static PyObject *__pyx_getprop_5adios_4file_name(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_4name_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4file_nvars(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_5nvars_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4file_nattrs(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_6nattrs_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4file_current_step(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_12current_step_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4file_last_step(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_9last_step_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4file_endianness(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_10endianness_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4file_version(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_7version_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4file_file_sizec(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_10file_sizec_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4file_is_stream(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_9is_stream_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4file_var(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_3var_1__get__(o);
+}
+
+static int __pyx_setprop_5adios_4file_var(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_5adios_4file_3var_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_5adios_4file_3var_5__del__(o);
+  }
+}
+
+static PyObject *__pyx_getprop_5adios_4file_attr(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4file_4attr_1__get__(o);
+}
+
+static int __pyx_setprop_5adios_4file_attr(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_5adios_4file_4attr_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_5adios_4file_4attr_5__del__(o);
+  }
+}
+
+static PyMethodDef __pyx_methods_5adios_file[] = {
+  {"__del__", (PyCFunction)__pyx_pw_5adios_4file_3__del__, METH_NOARGS, __pyx_doc_5adios_4file_2__del__},
+  {"close", (PyCFunction)__pyx_pw_5adios_4file_5close, METH_NOARGS, __pyx_doc_5adios_4file_4close},
+  {"printself", (PyCFunction)__pyx_pw_5adios_4file_7printself, METH_NOARGS, __pyx_doc_5adios_4file_6printself},
+  {"advance", (PyCFunction)__pyx_pw_5adios_4file_9advance, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_4file_8advance},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_5adios_file[] = {
+  {(char *)"name", __pyx_getprop_5adios_4file_name, 0, __pyx_k_The_filename_or_stream_name_ass, 0},
+  {(char *)"nvars", __pyx_getprop_5adios_4file_nvars, 0, __pyx_k_The_number_of_variables, 0},
+  {(char *)"nattrs", __pyx_getprop_5adios_4file_nattrs, 0, __pyx_k_The_number_of_attributes, 0},
+  {(char *)"current_step", __pyx_getprop_5adios_4file_current_step, 0, __pyx_k_The_current_timestep_index, 0},
+  {(char *)"last_step", __pyx_getprop_5adios_4file_last_step, 0, __pyx_k_The_last_timestep_index, 0},
+  {(char *)"endianness", __pyx_getprop_5adios_4file_endianness, 0, __pyx_k_The_endianness_of_the_stored_da, 0},
+  {(char *)"version", __pyx_getprop_5adios_4file_version, 0, __pyx_k_The_version_of_Adios, 0},
+  {(char *)"file_sizec", __pyx_getprop_5adios_4file_file_sizec, 0, __pyx_k_The_size_of_Adios_file, 0},
+  {(char *)"is_stream", __pyx_getprop_5adios_4file_is_stream, 0, __pyx_k_Indicating_reader_type_file_rea, 0},
+  {(char *)"var", __pyx_getprop_5adios_4file_var, __pyx_setprop_5adios_4file_var, __pyx_k_var_dict, 0},
+  {(char *)"attr", __pyx_getprop_5adios_4file_attr, __pyx_setprop_5adios_4file_attr, __pyx_k_attr_dict, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_file = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  __pyx_sq_item_5adios_file, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_file = {
+  0, /*mp_length*/
+  __pyx_pw_5adios_4file_11__getitem__, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyTypeObject __pyx_type_5adios_file = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.file", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios_file), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios_file, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_5adios_4file_13__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  &__pyx_tp_as_sequence_file, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_file, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "file(char *fname, char *method_name='BP', MPI_Comm comm=MPI_COMM_WORLD, is_stream=False, ADIOS_LOCKMODE lock_mode=ADIOS_LOCKMODE_ALL, float timeout_sec=0.0)\n\n    file class for Adios file read and write.\n\n    Args:\n        fname (str): filename.\n        method_name (str, optional): Adios read method (default: 'BP').\n        comm (MPI_Comm, optional): MPI_comm for parallel read/write (default: MPI_COMM_WORLD).\n        is_stream (bool, optional): Set True if use stream reader (d [...]
+  __pyx_tp_traverse_5adios_file, /*tp_traverse*/
+  __pyx_tp_clear_5adios_file, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_5adios_file, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_5adios_file, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_5adios_4file_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_5adios_file, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+static struct __pyx_vtabstruct_5adios_var __pyx_vtable_5adios_var;
+
+static PyObject *__pyx_tp_new_5adios_var(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_5adios_var *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_5adios_var *)o);
+  p->__pyx_vtab = __pyx_vtabptr_5adios_var;
+  p->file = ((struct __pyx_obj_5adios_file *)Py_None); Py_INCREF(Py_None);
+  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->dtype = ((PyArray_Descr *)Py_None); Py_INCREF(Py_None);
+  p->dims = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios_var(PyObject *o) {
+  struct __pyx_obj_5adios_var *p = (struct __pyx_obj_5adios_var *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->file);
+  Py_CLEAR(p->name);
+  Py_CLEAR(p->dtype);
+  Py_CLEAR(p->dims);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_5adios_var(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios_var *p = (struct __pyx_obj_5adios_var *)o;
+  if (p->file) {
+    e = (*v)(((PyObject*)p->file), a); if (e) return e;
+  }
+  if (p->dtype) {
+    e = (*v)(((PyObject*)p->dtype), a); if (e) return e;
+  }
+  if (p->dims) {
+    e = (*v)(p->dims, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios_var(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios_var *p = (struct __pyx_obj_5adios_var *)o;
+  tmp = ((PyObject*)p->file);
+  p->file = ((struct __pyx_obj_5adios_file *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->dtype);
+  p->dtype = ((PyArray_Descr *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->dims);
+  p->dims = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+static PyObject *__pyx_sq_item_5adios_var(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static PyObject *__pyx_getprop_5adios_3var_name(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_3var_4name_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_3var_varid(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_3var_5varid_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_3var_dtype(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_3var_5dtype_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_3var_ndim(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_3var_4ndim_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_3var_dims(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_3var_4dims_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_3var_nsteps(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_3var_6nsteps_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_5adios_var[] = {
+  {"__del__", (PyCFunction)__pyx_pw_5adios_3var_3__del__, METH_NOARGS, __pyx_doc_5adios_3var_2__del__},
+  {"close", (PyCFunction)__pyx_pw_5adios_3var_5close, METH_NOARGS, __pyx_doc_5adios_3var_4close},
+  {"advance", (PyCFunction)__pyx_pw_5adios_3var_7advance, METH_NOARGS, __pyx_doc_5adios_3var_6advance},
+  {"read", (PyCFunction)__pyx_pw_5adios_3var_9read, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_3var_8read},
+  {"printself", (PyCFunction)__pyx_pw_5adios_3var_11printself, METH_NOARGS, __pyx_doc_5adios_3var_10printself},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_5adios_var[] = {
+  {(char *)"name", __pyx_getprop_5adios_3var_name, 0, __pyx_k_The_variable_name, 0},
+  {(char *)"varid", __pyx_getprop_5adios_3var_varid, 0, __pyx_k_Internal_variable_id, 0},
+  {(char *)"dtype", __pyx_getprop_5adios_3var_dtype, 0, __pyx_k_Variable_type_as_in_numpy_dtype, 0},
+  {(char *)"ndim", __pyx_getprop_5adios_3var_ndim, 0, __pyx_k_The_number_of_dimensions_of_the, 0},
+  {(char *)"dims", __pyx_getprop_5adios_3var_dims, 0, __pyx_k_The_shape_of_the_variable, 0},
+  {(char *)"nsteps", __pyx_getprop_5adios_3var_nsteps, 0, __pyx_k_The_number_of_time_steps_of_the, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_var = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  __pyx_sq_item_5adios_var, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_var = {
+  0, /*mp_length*/
+  __pyx_pw_5adios_3var_15__getitem__, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyTypeObject __pyx_type_5adios_var = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.var", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios_var), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios_var, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_5adios_3var_13__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  &__pyx_tp_as_sequence_var, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_var, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "var(file file, char *name)\n\n    Adios variable class.\n\n    Unlike attributes whose values are populated on initialization,\n    variable's values will be returned by explicitly calling read() or\n    array access interface ([]).  \n\n    Args:\n        file (file): Associated file class\n        name (str): variable name\n\n    Note:\n        Users do not need to create this class manually.\n    ", /*tp_doc*/
+  __pyx_tp_traverse_5adios_var, /*tp_traverse*/
+  __pyx_tp_clear_5adios_var, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_5adios_var, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_5adios_var, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_5adios_3var_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_5adios_var, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_5adios_attr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_5adios_attr *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_5adios_attr *)o);
+  p->file = ((struct __pyx_obj_5adios_file *)Py_None); Py_INCREF(Py_None);
+  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->dtype = ((PyArray_Descr *)Py_None); Py_INCREF(Py_None);
+  p->value = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios_attr(PyObject *o) {
+  struct __pyx_obj_5adios_attr *p = (struct __pyx_obj_5adios_attr *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->file);
+  Py_CLEAR(p->name);
+  Py_CLEAR(p->dtype);
+  Py_CLEAR(p->value);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_5adios_attr(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios_attr *p = (struct __pyx_obj_5adios_attr *)o;
+  if (p->file) {
+    e = (*v)(((PyObject*)p->file), a); if (e) return e;
+  }
+  if (p->dtype) {
+    e = (*v)(((PyObject*)p->dtype), a); if (e) return e;
+  }
+  if (p->value) {
+    e = (*v)(((PyObject*)p->value), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios_attr(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios_attr *p = (struct __pyx_obj_5adios_attr *)o;
+  tmp = ((PyObject*)p->file);
+  p->file = ((struct __pyx_obj_5adios_file *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->dtype);
+  p->dtype = ((PyArray_Descr *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->value);
+  p->value = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_5adios_4attr_name(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4attr_4name_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4attr_dtype(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4attr_5dtype_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_4attr_value(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_4attr_5value_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_5adios_attr[] = {
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_5adios_attr[] = {
+  {(char *)"name", __pyx_getprop_5adios_4attr_name, 0, __pyx_k_The_attribute_name, 0},
+  {(char *)"dtype", __pyx_getprop_5adios_4attr_dtype, 0, __pyx_k_The_attribute_type_as_in_numpy, 0},
+  {(char *)"value", __pyx_getprop_5adios_4attr_value, 0, __pyx_k_The_attribute_s_value, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyTypeObject __pyx_type_5adios_attr = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.attr", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios_attr), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios_attr, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_5adios_4attr_3__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "attr(file file, char *name)\n\n    Adios attribute class.\n    \n    Attribute values are loaded on initialization.\n\n    Args:\n        attr_name (str): attribute name\n\n    Raises:\n        KeyError: If no attribute name exists.\n\n    Note:\n        Users do not need to create this class manually.        \n    ", /*tp_doc*/
+  __pyx_tp_traverse_5adios_attr, /*tp_traverse*/
+  __pyx_tp_clear_5adios_attr, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_5adios_attr, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_5adios_attr, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_5adios_4attr_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_5adios_attr, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_5adios_smartdict(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_5adios_smartdict *p;
+  PyObject *o = (&PyDict_Type)->tp_new(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_5adios_smartdict *)o);
+  p->factory = Py_None; Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios_smartdict(PyObject *o) {
+  struct __pyx_obj_5adios_smartdict *p = (struct __pyx_obj_5adios_smartdict *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->factory);
+  PyObject_GC_Track(o);
+  (&PyDict_Type)->tp_dealloc(o);
+}
+
+static int __pyx_tp_traverse_5adios_smartdict(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios_smartdict *p = (struct __pyx_obj_5adios_smartdict *)o;
+  if (!(&PyDict_Type)->tp_traverse); else { e = (&PyDict_Type)->tp_traverse(o,v,a); if (e) return e; }
+  if (p->factory) {
+    e = (*v)(p->factory, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios_smartdict(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios_smartdict *p = (struct __pyx_obj_5adios_smartdict *)o;
+  if (!(&PyDict_Type)->tp_clear); else (&PyDict_Type)->tp_clear(o);
+  tmp = ((PyObject*)p->factory);
+  p->factory = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static int __pyx_mp_ass_subscript_5adios_smartdict(PyObject *o, PyObject *i, PyObject *v) {
+  if (v) {
+    return __pyx_pw_5adios_9smartdict_3__setitem__(o, i, v);
+  }
+  else {
+    if ((&PyDict_Type)->tp_as_mapping && (&PyDict_Type)->tp_as_mapping->mp_ass_subscript)
+      return (&PyDict_Type)->tp_as_mapping->mp_ass_subscript(o, i, v);
+    PyErr_Format(PyExc_NotImplementedError,
+      "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name);
+    return -1;
+  }
+}
+
+static PyMethodDef __pyx_methods_5adios_smartdict[] = {
+  {0, 0, 0, 0}
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_smartdict = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  __pyx_mp_ass_subscript_5adios_smartdict, /*mp_ass_subscript*/
+};
+
+static PyTypeObject __pyx_type_5adios_smartdict = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.smartdict", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios_smartdict), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios_smartdict, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_smartdict, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "smartdict(factory)", /*tp_doc*/
+  __pyx_tp_traverse_5adios_smartdict, /*tp_traverse*/
+  __pyx_tp_clear_5adios_smartdict, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_5adios_smartdict, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_5adios_9smartdict_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_5adios_smartdict, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_5adios_writer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_5adios_writer *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_5adios_writer *)o);
+  p->fname = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->gname = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->method = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->method_params = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios_writer(PyObject *o) {
+  struct __pyx_obj_5adios_writer *p = (struct __pyx_obj_5adios_writer *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->fname);
+  Py_CLEAR(p->gname);
+  Py_CLEAR(p->method);
+  Py_CLEAR(p->method_params);
+  Py_CLEAR(p->var);
+  Py_CLEAR(p->attr);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_5adios_writer(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios_writer *p = (struct __pyx_obj_5adios_writer *)o;
+  if (p->var) {
+    e = (*v)(p->var, a); if (e) return e;
+  }
+  if (p->attr) {
+    e = (*v)(p->attr, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios_writer(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios_writer *p = (struct __pyx_obj_5adios_writer *)o;
+  tmp = ((PyObject*)p->var);
+  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->attr);
+  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+static PyObject *__pyx_sq_item_5adios_writer(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static int __pyx_mp_ass_subscript_5adios_writer(PyObject *o, PyObject *i, PyObject *v) {
+  if (v) {
+    return __pyx_pw_5adios_6writer_11__setitem__(o, i, v);
+  }
+  else {
+    PyErr_Format(PyExc_NotImplementedError,
+      "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name);
+    return -1;
+  }
+}
+
+static PyObject *__pyx_getprop_5adios_6writer_fname(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_6writer_5fname_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_6writer_gname(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_6writer_5gname_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_6writer_is_noxml(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_6writer_8is_noxml_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_6writer_var(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_6writer_3var_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_6writer_attr(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_6writer_4attr_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_5adios_writer[] = {
+  {"declare_group", (PyCFunction)__pyx_pw_5adios_6writer_3declare_group, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_6writer_2declare_group},
+  {"define_var", (PyCFunction)__pyx_pw_5adios_6writer_5define_var, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_6writer_4define_var},
+  {"define_attr", (PyCFunction)__pyx_pw_5adios_6writer_7define_attr, METH_O, __pyx_doc_5adios_6writer_6define_attr},
+  {"define_dynamic_attr", (PyCFunction)__pyx_pw_5adios_6writer_9define_dynamic_attr, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_6writer_8define_dynamic_attr},
+  {"close", (PyCFunction)__pyx_pw_5adios_6writer_15close, METH_NOARGS, __pyx_doc_5adios_6writer_14close},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_5adios_writer[] = {
+  {(char *)"fname", __pyx_getprop_5adios_6writer_fname, 0, __pyx_k_The_filename_to_write, 0},
+  {(char *)"gname", __pyx_getprop_5adios_6writer_gname, 0, __pyx_k_The_groupname_associated_with_t, 0},
+  {(char *)"is_noxml", __pyx_getprop_5adios_6writer_is_noxml, 0, __pyx_k_Boolean_to_indicate_using_No_XM, 0},
+  {(char *)"var", __pyx_getprop_5adios_6writer_var, 0, __pyx_k_Dictionary_of_variables_to_writ, 0},
+  {(char *)"attr", __pyx_getprop_5adios_6writer_attr, 0, __pyx_k_Dictionary_of_attributes_to_wri, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_writer = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  __pyx_sq_item_5adios_writer, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_writer = {
+  0, /*mp_length*/
+  __pyx_pw_5adios_6writer_13__getitem__, /*mp_subscript*/
+  __pyx_mp_ass_subscript_5adios_writer, /*mp_ass_subscript*/
+};
+
+static PyTypeObject __pyx_type_5adios_writer = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.writer", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios_writer), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios_writer, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_5adios_6writer_17__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  &__pyx_tp_as_sequence_writer, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_writer, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "writer(char *fname, bool is_noxml=True, MPI_Comm comm=MPI_COMM_WORLD)\n\n    writer class for Adios write.\n\n    Args:\n        fname (str): filename.\n        is_noxml (bool, optional): Set True if use noxml APIs (default: True).\n        comm (MPI_Comm, optional): MPI_comm for parallel read/write (default: MPI_COMM_WORLD).\n\n    Example:\n    \n    >>> import adios as ad\n    >>> f = ad.writer('adiosfile.bp')\n    \n    ", /*tp_doc*/
+  __pyx_tp_traverse_5adios_writer, /*tp_traverse*/
+  __pyx_tp_clear_5adios_writer, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_5adios_writer, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_5adios_writer, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_5adios_6writer_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_5adios_writer, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_5adios_attrinfo(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_5adios_attrinfo *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_5adios_attrinfo *)o);
+  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->dtype = Py_None; Py_INCREF(Py_None);
+  p->value = Py_None; Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios_attrinfo(PyObject *o) {
+  struct __pyx_obj_5adios_attrinfo *p = (struct __pyx_obj_5adios_attrinfo *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->name);
+  Py_CLEAR(p->dtype);
+  Py_CLEAR(p->value);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_5adios_attrinfo(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios_attrinfo *p = (struct __pyx_obj_5adios_attrinfo *)o;
+  if (p->dtype) {
+    e = (*v)(p->dtype, a); if (e) return e;
+  }
+  if (p->value) {
+    e = (*v)(p->value, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios_attrinfo(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios_attrinfo *p = (struct __pyx_obj_5adios_attrinfo *)o;
+  tmp = ((PyObject*)p->dtype);
+  p->dtype = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->value);
+  p->value = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_5adios_8attrinfo_name(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_8attrinfo_4name_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_8attrinfo_is_static(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_8attrinfo_9is_static_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_8attrinfo_dtype(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_8attrinfo_5dtype_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_5adios_8attrinfo_value(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_8attrinfo_5value_1__get__(o);
+}
+
+static int __pyx_setprop_5adios_8attrinfo_value(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_5adios_8attrinfo_5value_3__set__(o, v);
+  }
+  else {
+    PyErr_SetString(PyExc_NotImplementedError, "__del__");
+    return -1;
+  }
+}
+
+static PyMethodDef __pyx_methods_5adios_attrinfo[] = {
+  {"define", (PyCFunction)__pyx_pw_5adios_8attrinfo_3define, METH_O, __pyx_doc_5adios_8attrinfo_2define},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_5adios_attrinfo[] = {
+  {(char *)"name", __pyx_getprop_5adios_8attrinfo_name, 0, 0, 0},
+  {(char *)"is_static", __pyx_getprop_5adios_8attrinfo_is_static, 0, 0, 0},
+  {(char *)"dtype", __pyx_getprop_5adios_8attrinfo_dtype, 0, 0, 0},
+  {(char *)"value", __pyx_getprop_5adios_8attrinfo_value, __pyx_setprop_5adios_8attrinfo_value, 0, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyTypeObject __pyx_type_5adios_attrinfo = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.attrinfo", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios_attrinfo), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios_attrinfo, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_5adios_8attrinfo_5__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "attrinfo(char *name, value=None, dtype=None, bool is_static=True)", /*tp_doc*/
+  __pyx_tp_traverse_5adios_attrinfo, /*tp_traverse*/
+  __pyx_tp_clear_5adios_attrinfo, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_5adios_attrinfo, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_5adios_attrinfo, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_5adios_8attrinfo_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_5adios_attrinfo, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_5adios_varinfo(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_5adios_varinfo *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_5adios_varinfo *)o);
+  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->ldim = Py_None; Py_INCREF(Py_None);
+  p->gdim = Py_None; Py_INCREF(Py_None);
+  p->offset = Py_None; Py_INCREF(Py_None);
+  p->value = Py_None; Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios_varinfo(PyObject *o) {
+  struct __pyx_obj_5adios_varinfo *p = (struct __pyx_obj_5adios_varinfo *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->name);
+  Py_CLEAR(p->ldim);
+  Py_CLEAR(p->gdim);
+  Py_CLEAR(p->offset);
+  Py_CLEAR(p->value);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_5adios_varinfo(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios_varinfo *p = (struct __pyx_obj_5adios_varinfo *)o;
+  if (p->ldim) {
+    e = (*v)(p->ldim, a); if (e) return e;
+  }
+  if (p->gdim) {
+    e = (*v)(p->gdim, a); if (e) return e;
+  }
+  if (p->offset) {
+    e = (*v)(p->offset, a); if (e) return e;
+  }
+  if (p->value) {
+    e = (*v)(p->value, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios_varinfo(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios_varinfo *p = (struct __pyx_obj_5adios_varinfo *)o;
+  tmp = ((PyObject*)p->ldim);
+  p->ldim = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->gdim);
+  p->gdim = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->offset);
+  p->offset = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->value);
+  p->value = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_5adios_7varinfo_ldim(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_7varinfo_4ldim_1__get__(o);
+}
+
+static int __pyx_setprop_5adios_7varinfo_ldim(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_5adios_7varinfo_4ldim_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_5adios_7varinfo_4ldim_5__del__(o);
+  }
+}
+
+static PyObject *__pyx_getprop_5adios_7varinfo_gdim(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_7varinfo_4gdim_1__get__(o);
+}
+
+static int __pyx_setprop_5adios_7varinfo_gdim(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_5adios_7varinfo_4gdim_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_5adios_7varinfo_4gdim_5__del__(o);
+  }
+}
+
+static PyObject *__pyx_getprop_5adios_7varinfo_offset(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_7varinfo_6offset_1__get__(o);
+}
+
+static int __pyx_setprop_5adios_7varinfo_offset(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_5adios_7varinfo_6offset_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_5adios_7varinfo_6offset_5__del__(o);
+  }
+}
+
+static PyObject *__pyx_getprop_5adios_7varinfo_value(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_5adios_7varinfo_5value_1__get__(o);
+}
+
+static int __pyx_setprop_5adios_7varinfo_value(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_5adios_7varinfo_5value_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_5adios_7varinfo_5value_5__del__(o);
+  }
+}
+
+static PyMethodDef __pyx_methods_5adios_varinfo[] = {
+  {"define", (PyCFunction)__pyx_pw_5adios_7varinfo_3define, METH_O, __pyx_doc_5adios_7varinfo_2define},
+  {"bytes", (PyCFunction)__pyx_pw_5adios_7varinfo_5bytes, METH_NOARGS, __pyx_doc_5adios_7varinfo_4bytes},
+  {"write", (PyCFunction)__pyx_pw_5adios_7varinfo_7write, METH_O, __pyx_doc_5adios_7varinfo_6write},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_5adios_varinfo[] = {
+  {(char *)"ldim", __pyx_getprop_5adios_7varinfo_ldim, __pyx_setprop_5adios_7varinfo_ldim, __pyx_k_ldim_object, 0},
+  {(char *)"gdim", __pyx_getprop_5adios_7varinfo_gdim, __pyx_setprop_5adios_7varinfo_gdim, __pyx_k_gdim_object, 0},
+  {(char *)"offset", __pyx_getprop_5adios_7varinfo_offset, __pyx_setprop_5adios_7varinfo_offset, __pyx_k_offset_object, 0},
+  {(char *)"value", __pyx_getprop_5adios_7varinfo_value, __pyx_setprop_5adios_7varinfo_value, __pyx_k_value_object, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyTypeObject __pyx_type_5adios_varinfo = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.varinfo", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios_varinfo), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios_varinfo, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_5adios_7varinfo_9__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "varinfo(char *name, ldim=<\077\077?>, gdim=<\077\077?>, offset=<\077\077?>)", /*tp_doc*/
+  __pyx_tp_traverse_5adios_varinfo, /*tp_traverse*/
+  __pyx_tp_clear_5adios_varinfo, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_5adios_varinfo, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_5adios_varinfo, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_5adios_7varinfo_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_5adios_varinfo, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *__pyx_freelist_5adios___pyx_scope_struct____getitem__[8];
+static int __pyx_freecount_5adios___pyx_scope_struct____getitem__ = 0;
+
+static PyObject *__pyx_tp_new_5adios___pyx_scope_struct____getitem__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5adios___pyx_scope_struct____getitem__ > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5adios___pyx_scope_struct____getitem__)))) {
+    o = (PyObject*)__pyx_freelist_5adios___pyx_scope_struct____getitem__[--__pyx_freecount_5adios___pyx_scope_struct____getitem__];
+    memset(o, 0, sizeof(struct __pyx_obj_5adios___pyx_scope_struct____getitem__));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios___pyx_scope_struct____getitem__(PyObject *o) {
+  struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *p = (struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *)o;
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_dims_);
+  Py_CLEAR(p->__pyx_v_index_);
+  Py_CLEAR(p->__pyx_v_self);
+  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5adios___pyx_scope_struct____getitem__ < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5adios___pyx_scope_struct____getitem__)))) {
+    __pyx_freelist_5adios___pyx_scope_struct____getitem__[__pyx_freecount_5adios___pyx_scope_struct____getitem__++] = ((struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *)o);
+  } else {
+    (*Py_TYPE(o)->tp_free)(o);
+  }
+}
+
+static int __pyx_tp_traverse_5adios___pyx_scope_struct____getitem__(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *p = (struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *)o;
+  if (p->__pyx_v_dims_) {
+    e = (*v)(p->__pyx_v_dims_, a); if (e) return e;
+  }
+  if (p->__pyx_v_index_) {
+    e = (*v)(p->__pyx_v_index_, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios___pyx_scope_struct____getitem__(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *p = (struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *)o;
+  tmp = ((PyObject*)p->__pyx_v_dims_);
+  p->__pyx_v_dims_ = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_index_);
+  p->__pyx_v_index_ = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_self);
+  p->__pyx_v_self = ((struct __pyx_obj_5adios_var *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyTypeObject __pyx_type_5adios___pyx_scope_struct____getitem__ = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.__pyx_scope_struct____getitem__", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios___pyx_scope_struct____getitem__), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios___pyx_scope_struct____getitem__, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
   0, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
@@ -13445,25 +24069,259 @@ static PyTypeObject __pyx_type_5adios_var = {
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   0, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  " Private Memeber ", /*tp_doc*/
-  __pyx_tp_traverse_5adios_var, /*tp_traverse*/
-  __pyx_tp_clear_5adios_var, /*tp_clear*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_5adios___pyx_scope_struct____getitem__, /*tp_traverse*/
+  __pyx_tp_clear_5adios___pyx_scope_struct____getitem__, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_5adios_var, /*tp_methods*/
+  0, /*tp_methods*/
   0, /*tp_members*/
-  __pyx_getsets_5adios_var, /*tp_getset*/
+  0, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pw_5adios_3var_1__init__, /*tp_init*/
+  0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_5adios_var, /*tp_new*/
+  __pyx_tp_new_5adios___pyx_scope_struct____getitem__, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *__pyx_freelist_5adios___pyx_scope_struct_1_genexpr[8];
+static int __pyx_freecount_5adios___pyx_scope_struct_1_genexpr = 0;
+
+static PyObject *__pyx_tp_new_5adios___pyx_scope_struct_1_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5adios___pyx_scope_struct_1_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr)))) {
+    o = (PyObject*)__pyx_freelist_5adios___pyx_scope_struct_1_genexpr[--__pyx_freecount_5adios___pyx_scope_struct_1_genexpr];
+    memset(o, 0, sizeof(struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios___pyx_scope_struct_1_genexpr(PyObject *o) {
+  struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *)o;
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_x);
+  Py_CLEAR(p->__pyx_t_0);
+  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5adios___pyx_scope_struct_1_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr)))) {
+    __pyx_freelist_5adios___pyx_scope_struct_1_genexpr[__pyx_freecount_5adios___pyx_scope_struct_1_genexpr++] = ((struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *)o);
+  } else {
+    (*Py_TYPE(o)->tp_free)(o);
+  }
+}
+
+static int __pyx_tp_traverse_5adios___pyx_scope_struct_1_genexpr(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
+  }
+  if (p->__pyx_v_x) {
+    e = (*v)(p->__pyx_v_x, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios___pyx_scope_struct_1_genexpr(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr *)o;
+  tmp = ((PyObject*)p->__pyx_outer_scope);
+  p->__pyx_outer_scope = ((struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_x);
+  p->__pyx_v_x = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_0);
+  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyTypeObject __pyx_type_5adios___pyx_scope_struct_1_genexpr = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.__pyx_scope_struct_1_genexpr", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios___pyx_scope_struct_1_genexpr), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios___pyx_scope_struct_1_genexpr, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_5adios___pyx_scope_struct_1_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_5adios___pyx_scope_struct_1_genexpr, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  0, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_5adios___pyx_scope_struct_1_genexpr, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *__pyx_freelist_5adios___pyx_scope_struct_2_genexpr[8];
+static int __pyx_freecount_5adios___pyx_scope_struct_2_genexpr = 0;
+
+static PyObject *__pyx_tp_new_5adios___pyx_scope_struct_2_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5adios___pyx_scope_struct_2_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr)))) {
+    o = (PyObject*)__pyx_freelist_5adios___pyx_scope_struct_2_genexpr[--__pyx_freecount_5adios___pyx_scope_struct_2_genexpr];
+    memset(o, 0, sizeof(struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  return o;
+}
+
+static void __pyx_tp_dealloc_5adios___pyx_scope_struct_2_genexpr(PyObject *o) {
+  struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *)o;
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_x);
+  Py_CLEAR(p->__pyx_t_0);
+  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5adios___pyx_scope_struct_2_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr)))) {
+    __pyx_freelist_5adios___pyx_scope_struct_2_genexpr[__pyx_freecount_5adios___pyx_scope_struct_2_genexpr++] = ((struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *)o);
+  } else {
+    (*Py_TYPE(o)->tp_free)(o);
+  }
+}
+
+static int __pyx_tp_traverse_5adios___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
+  }
+  if (p->__pyx_v_x) {
+    e = (*v)(p->__pyx_v_x, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_5adios___pyx_scope_struct_2_genexpr(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr *)o;
+  tmp = ((PyObject*)p->__pyx_outer_scope);
+  p->__pyx_outer_scope = ((struct __pyx_obj_5adios___pyx_scope_struct____getitem__ *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_x);
+  p->__pyx_v_x = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_0);
+  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyTypeObject __pyx_type_5adios___pyx_scope_struct_2_genexpr = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios.__pyx_scope_struct_2_genexpr", /*tp_name*/
+  sizeof(struct __pyx_obj_5adios___pyx_scope_struct_2_genexpr), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_5adios___pyx_scope_struct_2_genexpr, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_5adios___pyx_scope_struct_2_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_5adios___pyx_scope_struct_2_genexpr, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  0, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_5adios___pyx_scope_struct_2_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -13479,25 +24337,30 @@ static PyTypeObject __pyx_type_5adios_var = {
 };
 
 static PyMethodDef __pyx_methods[] = {
-  {"init", (PyCFunction)__pyx_pw_5adios_1init, METH_VARARGS|METH_KEYWORDS, 0},
-  {"open", (PyCFunction)__pyx_pw_5adios_3open, METH_VARARGS|METH_KEYWORDS, 0},
-  {"set_group_size", (PyCFunction)__pyx_pw_5adios_5set_group_size, METH_VARARGS|METH_KEYWORDS, 0},
-  {"write", (PyCFunction)__pyx_pw_5adios_7write, METH_VARARGS|METH_KEYWORDS, 0},
-  {"write_int", (PyCFunction)__pyx_pw_5adios_9write_int, METH_VARARGS|METH_KEYWORDS, 0},
-  {"write_long", (PyCFunction)__pyx_pw_5adios_11write_long, METH_VARARGS|METH_KEYWORDS, 0},
-  {"write_float", (PyCFunction)__pyx_pw_5adios_13write_float, METH_VARARGS|METH_KEYWORDS, 0},
-  {"read", (PyCFunction)__pyx_pw_5adios_15read, METH_VARARGS|METH_KEYWORDS, 0},
-  {"close", (PyCFunction)__pyx_pw_5adios_17close, METH_O, 0},
-  {"finalize", (PyCFunction)__pyx_pw_5adios_19finalize, METH_VARARGS|METH_KEYWORDS, 0},
-  {"init_noxml", (PyCFunction)__pyx_pw_5adios_21init_noxml, METH_VARARGS|METH_KEYWORDS, 0},
-  {"allocate_buffer", (PyCFunction)__pyx_pw_5adios_23allocate_buffer, METH_VARARGS|METH_KEYWORDS, 0},
-  {"declare_group", (PyCFunction)__pyx_pw_5adios_25declare_group, METH_VARARGS|METH_KEYWORDS, 0},
-  {"define_var", (PyCFunction)__pyx_pw_5adios_27define_var, METH_VARARGS|METH_KEYWORDS, 0},
-  {"define_attribute", (PyCFunction)__pyx_pw_5adios_29define_attribute, METH_VARARGS|METH_KEYWORDS, 0},
-  {"select_method", (PyCFunction)__pyx_pw_5adios_31select_method, METH_VARARGS|METH_KEYWORDS, 0},
-  {"np2adiostype", (PyCFunction)__pyx_pw_5adios_33np2adiostype, METH_O, __pyx_doc_5adios_32np2adiostype},
-  {"read_init", (PyCFunction)__pyx_pw_5adios_35read_init, METH_VARARGS|METH_KEYWORDS, 0},
-  {"read_finalize", (PyCFunction)__pyx_pw_5adios_37read_finalize, METH_VARARGS|METH_KEYWORDS, 0},
+  {"__parse_index", (PyCFunction)__pyx_pw_5adios_1__parse_index, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios___parse_index},
+  {"init", (PyCFunction)__pyx_pw_5adios_3init, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_2init},
+  {"open", (PyCFunction)__pyx_pw_5adios_5open, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_4open},
+  {"set_group_size", (PyCFunction)__pyx_pw_5adios_7set_group_size, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_6set_group_size},
+  {"write", (PyCFunction)__pyx_pw_5adios_9write, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_8write},
+  {"write_int", (PyCFunction)__pyx_pw_5adios_11write_int, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_10write_int},
+  {"write_long", (PyCFunction)__pyx_pw_5adios_13write_long, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_12write_long},
+  {"write_float", (PyCFunction)__pyx_pw_5adios_15write_float, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_14write_float},
+  {"write_double", (PyCFunction)__pyx_pw_5adios_17write_double, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_16write_double},
+  {"read", (PyCFunction)__pyx_pw_5adios_19read, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_18read},
+  {"close", (PyCFunction)__pyx_pw_5adios_21close, METH_O, __pyx_doc_5adios_20close},
+  {"finalize", (PyCFunction)__pyx_pw_5adios_23finalize, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_22finalize},
+  {"init_noxml", (PyCFunction)__pyx_pw_5adios_25init_noxml, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_24init_noxml},
+  {"allocate_buffer", (PyCFunction)__pyx_pw_5adios_27allocate_buffer, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_26allocate_buffer},
+  {"declare_group", (PyCFunction)__pyx_pw_5adios_29declare_group, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_28declare_group},
+  {"define_var", (PyCFunction)__pyx_pw_5adios_31define_var, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_30define_var},
+  {"define_attribute", (PyCFunction)__pyx_pw_5adios_33define_attribute, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_32define_attribute},
+  {"define_attribute_byvalue", (PyCFunction)__pyx_pw_5adios_35define_attribute_byvalue, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_34define_attribute_byvalue},
+  {"select_method", (PyCFunction)__pyx_pw_5adios_37select_method, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_36select_method},
+  {"adios2npdtype", (PyCFunction)__pyx_pw_5adios_39adios2npdtype, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_38adios2npdtype},
+  {"np2adiostype", (PyCFunction)__pyx_pw_5adios_41np2adiostype, METH_O, __pyx_doc_5adios_40np2adiostype},
+  {"adiostype2string", (PyCFunction)__pyx_pw_5adios_43adiostype2string, METH_O, __pyx_doc_5adios_42adiostype2string},
+  {"read_init", (PyCFunction)__pyx_pw_5adios_45read_init, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_44read_init},
+  {"read_finalize", (PyCFunction)__pyx_pw_5adios_47read_finalize, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5adios_46read_finalize},
   {0, 0, 0, 0}
 };
 
@@ -13509,7 +24372,7 @@ static struct PyModuleDef __pyx_moduledef = {
     PyModuleDef_HEAD_INIT,
   #endif
     "adios",
-    __pyx_k_ADIOS_is_freely_available_under, /* m_doc */
+    __pyx_k_ADIOS_ADIOS_python_module_module, /* m_doc */
     -1, /* m_size */
     __pyx_methods /* m_methods */,
     NULL, /* m_reload */
@@ -13523,55 +24386,85 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_15s_d, __pyx_k_15s_d, sizeof(__pyx_k_15s_d), 0, 0, 1, 0},
   {&__pyx_kp_s_15s_lu, __pyx_k_15s_lu, sizeof(__pyx_k_15s_lu), 0, 0, 1, 0},
   {&__pyx_kp_s_15s_s, __pyx_k_15s_s, sizeof(__pyx_k_15s_s), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosAttr_name_r_dtype_r_value_r, __pyx_k_AdiosAttr_name_r_dtype_r_value_r, sizeof(__pyx_k_AdiosAttr_name_r_dtype_r_value_r), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosAttrinfo_name_r_is_static_r, __pyx_k_AdiosAttrinfo_name_r_is_static_r, sizeof(__pyx_k_AdiosAttrinfo_name_r_is_static_r), 0, 0, 1, 0},
   {&__pyx_kp_s_AdiosFile, __pyx_k_AdiosFile, sizeof(__pyx_k_AdiosFile), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosFile_path_r_nvars_r_var_r_n, __pyx_k_AdiosFile_path_r_nvars_r_var_r_n, sizeof(__pyx_k_AdiosFile_path_r_nvars_r_var_r_n), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosVar_varid_r_dtype_r_ndim_r, __pyx_k_AdiosVar_varid_r_dtype_r_ndim_r, sizeof(__pyx_k_AdiosVar_varid_r_dtype_r_ndim_r), 0, 0, 1, 0},
   {&__pyx_kp_s_AdiosVariable, __pyx_k_AdiosVariable, sizeof(__pyx_k_AdiosVariable), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosVarinfo_name_r_ldim_r_gdim, __pyx_k_AdiosVarinfo_name_r_ldim_r_gdim, sizeof(__pyx_k_AdiosVarinfo_name_r_ldim_r_gdim), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosWriter_fname_r_gname_r_meth, __pyx_k_AdiosWriter_fname_r_gname_r_meth, sizeof(__pyx_k_AdiosWriter_fname_r_gname_r_meth), 0, 0, 1, 0},
   {&__pyx_n_s_BP, __pyx_k_BP, sizeof(__pyx_k_BP), 0, 0, 1, 1},
   {&__pyx_n_s_BP_AGGREGATE, __pyx_k_BP_AGGREGATE, sizeof(__pyx_k_BP_AGGREGATE), 0, 0, 1, 1},
   {&__pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_k_BUFFER_ALLOC_WHEN, sizeof(__pyx_k_BUFFER_ALLOC_WHEN), 0, 0, 1, 1},
-  {&__pyx_kp_s_Count_dimension_mismatch, __pyx_k_Count_dimension_mismatch, sizeof(__pyx_k_Count_dimension_mismatch), 0, 0, 1, 0},
-  {&__pyx_kp_s_Count_is_larger_than_shape, __pyx_k_Count_is_larger_than_shape, sizeof(__pyx_k_Count_is_larger_than_shape), 0, 0, 1, 0},
+  {&__pyx_kp_s_Count_dimension_mismatch_count_d, __pyx_k_Count_dimension_mismatch_count_d, sizeof(__pyx_k_Count_dimension_mismatch_count_d), 0, 0, 1, 0},
   {&__pyx_n_s_DATASPACES, __pyx_k_DATASPACES, sizeof(__pyx_k_DATASPACES), 0, 0, 1, 1},
   {&__pyx_n_s_DATATYPE, __pyx_k_DATATYPE, sizeof(__pyx_k_DATATYPE), 0, 0, 1, 1},
   {&__pyx_n_s_DIMES, __pyx_k_DIMES, sizeof(__pyx_k_DIMES), 0, 0, 1, 1},
   {&__pyx_kp_s_Data_type_is_not_supported_yet, __pyx_k_Data_type_is_not_supported_yet, sizeof(__pyx_k_Data_type_is_not_supported_yet), 0, 0, 1, 0},
+  {&__pyx_kp_u_Define_a_group_associated_with, __pyx_k_Define_a_group_associated_with, sizeof(__pyx_k_Define_a_group_associated_with), 0, 1, 0, 0},
+  {&__pyx_kp_u_Define_a_variable_associated_wi, __pyx_k_Define_a_variable_associated_wi, sizeof(__pyx_k_Define_a_variable_associated_wi), 0, 1, 0, 0},
+  {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1},
   {&__pyx_n_s_FLAG, __pyx_k_FLAG, sizeof(__pyx_k_FLAG), 0, 0, 1, 1},
   {&__pyx_n_s_FLEXPATH, __pyx_k_FLEXPATH, sizeof(__pyx_k_FLEXPATH), 0, 0, 1, 1},
   {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0},
   {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0},
   {&__pyx_n_s_ICEE, __pyx_k_ICEE, sizeof(__pyx_k_ICEE), 0, 0, 1, 1},
+  {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1},
+  {&__pyx_n_s_KeyError, __pyx_k_KeyError, sizeof(__pyx_k_KeyError), 0, 0, 1, 1},
   {&__pyx_n_s_LATER, __pyx_k_LATER, sizeof(__pyx_k_LATER), 0, 0, 1, 1},
   {&__pyx_n_s_NO, __pyx_k_NO, sizeof(__pyx_k_NO), 0, 0, 1, 1},
   {&__pyx_n_s_NOW, __pyx_k_NOW, sizeof(__pyx_k_NOW), 0, 0, 1, 1},
+  {&__pyx_kp_s_Name_index_r_is_not_supported, __pyx_k_Name_index_r_is_not_supported, sizeof(__pyx_k_Name_index_r_is_not_supported), 0, 0, 1, 0},
   {&__pyx_kp_s_No_valid_variable, __pyx_k_No_valid_variable, sizeof(__pyx_k_No_valid_variable), 0, 0, 1, 0},
   {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0},
+  {&__pyx_n_s_NotImplementedError, __pyx_k_NotImplementedError, sizeof(__pyx_k_NotImplementedError), 0, 0, 1, 1},
   {&__pyx_kp_s_Not_a_valid_var, __pyx_k_Not_a_valid_var, sizeof(__pyx_k_Not_a_valid_var), 0, 0, 1, 0},
   {&__pyx_kp_s_Not_an_open_file, __pyx_k_Not_an_open_file, sizeof(__pyx_k_Not_an_open_file), 0, 0, 1, 0},
   {&__pyx_kp_s_Not_an_open_var, __pyx_k_Not_an_open_var, sizeof(__pyx_k_Not_an_open_var), 0, 0, 1, 0},
   {&__pyx_kp_s_Not_an_open_variable, __pyx_k_Not_an_open_variable, sizeof(__pyx_k_Not_an_open_variable), 0, 0, 1, 0},
-  {&__pyx_kp_s_Offset_dimension_mismatch, __pyx_k_Offset_dimension_mismatch, sizeof(__pyx_k_Offset_dimension_mismatch), 0, 0, 1, 0},
+  {&__pyx_kp_s_Offset_dimension_mismatch_offset, __pyx_k_Offset_dimension_mismatch_offset, sizeof(__pyx_k_Offset_dimension_mismatch_offset), 0, 0, 1, 0},
   {&__pyx_kp_s_Only_contiguous_arrays_are_suppo, __pyx_k_Only_contiguous_arrays_are_suppo, sizeof(__pyx_k_Only_contiguous_arrays_are_suppo), 0, 0, 1, 0},
+  {&__pyx_kp_u_Perform_read_Read_data_from_an, __pyx_k_Perform_read_Read_data_from_an, sizeof(__pyx_k_Perform_read_Read_data_from_an), 0, 1, 0, 0},
+  {&__pyx_n_s_READ_METHOD, __pyx_k_READ_METHOD, sizeof(__pyx_k_READ_METHOD), 0, 0, 1, 1},
   {&__pyx_kp_s_Reading, __pyx_k_Reading, sizeof(__pyx_k_Reading), 0, 0, 1, 0},
+  {&__pyx_kp_s_Requested_is_larger_than_the_sha, __pyx_k_Requested_is_larger_than_the_sha, sizeof(__pyx_k_Requested_is_larger_than_the_sha), 0, 0, 1, 0},
   {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1},
-  {&__pyx_kp_s_Step_index_is_out_of_range, __pyx_k_Step_index_is_out_of_range, sizeof(__pyx_k_Step_index_is_out_of_range), 0, 0, 1, 0},
+  {&__pyx_n_s_S, __pyx_k_S, sizeof(__pyx_k_S), 0, 0, 1, 1},
+  {&__pyx_kp_s_Step_index_is_out_of_range_from, __pyx_k_Step_index_is_out_of_range_from, sizeof(__pyx_k_Step_index_is_out_of_range_from), 0, 0, 1, 0},
+  {&__pyx_kp_s_Step_size_d_is_not_supported, __pyx_k_Step_size_d_is_not_supported, sizeof(__pyx_k_Step_size_d_is_not_supported), 0, 0, 1, 0},
+  {&__pyx_kp_s_Too_many_indices_for_data, __pyx_k_Too_many_indices_for_data, sizeof(__pyx_k_Too_many_indices_for_data), 0, 0, 1, 0},
+  {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1},
   {&__pyx_n_s_UNKNOWN, __pyx_k_UNKNOWN, sizeof(__pyx_k_UNKNOWN), 0, 0, 1, 1},
+  {&__pyx_kp_s_Unhashable_type, __pyx_k_Unhashable_type, sizeof(__pyx_k_Unhashable_type), 0, 0, 1, 0},
   {&__pyx_kp_s_Use_default_BP_method, __pyx_k_Use_default_BP_method, sizeof(__pyx_k_Use_default_BP_method), 0, 0, 1, 0},
   {&__pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_k_Users_jyc_project_adios_devel_w, sizeof(__pyx_k_Users_jyc_project_adios_devel_w), 0, 0, 1, 0},
   {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
+  {&__pyx_kp_s_Value_is_none, __pyx_k_Value_is_none, sizeof(__pyx_k_Value_is_none), 0, 0, 1, 0},
   {&__pyx_kp_s_WARN_Invalid_read_method_name, __pyx_k_WARN_Invalid_read_method_name, sizeof(__pyx_k_WARN_Invalid_read_method_name), 0, 0, 1, 0},
+  {&__pyx_kp_s_Warning_No_support_yet_s_type_d, __pyx_k_Warning_No_support_yet_s_type_d, sizeof(__pyx_k_Warning_No_support_yet_s_type_d), 0, 0, 1, 0},
   {&__pyx_n_s_YES, __pyx_k_YES, sizeof(__pyx_k_YES), 0, 0, 1, 1},
-  {&__pyx_kp_s__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 0, 1, 0},
+  {&__pyx_kp_s__11, __pyx_k__11, sizeof(__pyx_k__11), 0, 0, 1, 0},
+  {&__pyx_kp_s__31, __pyx_k__31, sizeof(__pyx_k__31), 0, 0, 1, 0},
+  {&__pyx_kp_s__33, __pyx_k__33, sizeof(__pyx_k__33), 0, 0, 1, 0},
+  {&__pyx_kp_s__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 0, 1, 0},
   {&__pyx_n_s_adios, __pyx_k_adios, sizeof(__pyx_k_adios), 0, 0, 1, 1},
   {&__pyx_n_s_advance, __pyx_k_advance, sizeof(__pyx_k_advance), 0, 0, 1, 1},
-  {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1},
+  {&__pyx_n_s_any, __pyx_k_any, sizeof(__pyx_k_any), 0, 0, 1, 1},
+  {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1},
   {&__pyx_n_s_array, __pyx_k_array, sizeof(__pyx_k_array), 0, 0, 1, 1},
   {&__pyx_n_s_attr_namelist, __pyx_k_attr_namelist, sizeof(__pyx_k_attr_namelist), 0, 0, 1, 1},
+  {&__pyx_n_s_attrname, __pyx_k_attrname, sizeof(__pyx_k_attrname), 0, 0, 1, 1},
   {&__pyx_n_s_attrs, __pyx_k_attrs, sizeof(__pyx_k_attrs), 0, 0, 1, 1},
+  {&__pyx_n_s_atype, __pyx_k_atype, sizeof(__pyx_k_atype), 0, 0, 1, 1},
   {&__pyx_n_s_base_path, __pyx_k_base_path, sizeof(__pyx_k_base_path), 0, 0, 1, 1},
   {&__pyx_n_s_bool, __pyx_k_bool, sizeof(__pyx_k_bool), 0, 0, 1, 1},
   {&__pyx_n_s_bpls, __pyx_k_bpls, sizeof(__pyx_k_bpls), 0, 0, 1, 1},
   {&__pyx_n_s_buffer_size, __pyx_k_buffer_size, sizeof(__pyx_k_buffer_size), 0, 0, 1, 1},
   {&__pyx_n_s_byte, __pyx_k_byte, sizeof(__pyx_k_byte), 0, 0, 1, 1},
   {&__pyx_kp_s_bytes, __pyx_k_bytes, sizeof(__pyx_k_bytes), 0, 0, 1, 0},
+  {&__pyx_n_s_bytes_2, __pyx_k_bytes_2, sizeof(__pyx_k_bytes_2), 0, 0, 1, 1},
+  {&__pyx_n_s_char, __pyx_k_char, sizeof(__pyx_k_char), 0, 0, 1, 1},
   {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1},
   {&__pyx_n_s_comm, __pyx_k_comm, sizeof(__pyx_k_comm), 0, 0, 1, 1},
   {&__pyx_n_s_complex, __pyx_k_complex, sizeof(__pyx_k_complex), 0, 0, 1, 1},
@@ -13584,6 +24477,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1},
   {&__pyx_n_s_current_step, __pyx_k_current_step, sizeof(__pyx_k_current_step), 0, 0, 1, 1},
   {&__pyx_n_s_data_size, __pyx_k_data_size, sizeof(__pyx_k_data_size), 0, 0, 1, 1},
+  {&__pyx_n_s_define, __pyx_k_define, sizeof(__pyx_k_define), 0, 0, 1, 1},
   {&__pyx_n_s_dimensions, __pyx_k_dimensions, sizeof(__pyx_k_dimensions), 0, 0, 1, 1},
   {&__pyx_n_s_dims, __pyx_k_dims, sizeof(__pyx_k_dims), 0, 0, 1, 1},
   {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1},
@@ -13593,6 +24487,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_end, __pyx_k_end, sizeof(__pyx_k_end), 0, 0, 1, 1},
   {&__pyx_n_s_endianness, __pyx_k_endianness, sizeof(__pyx_k_endianness), 0, 0, 1, 1},
   {&__pyx_n_s_f, __pyx_k_f, sizeof(__pyx_k_f), 0, 0, 1, 1},
+  {&__pyx_n_s_factory, __pyx_k_factory, sizeof(__pyx_k_factory), 0, 0, 1, 1},
   {&__pyx_n_s_fd_p, __pyx_k_fd_p, sizeof(__pyx_k_fd_p), 0, 0, 1, 1},
   {&__pyx_n_s_fh, __pyx_k_fh, sizeof(__pyx_k_fh), 0, 0, 1, 1},
   {&__pyx_n_s_file, __pyx_k_file, sizeof(__pyx_k_file), 0, 0, 1, 1},
@@ -13607,22 +24502,35 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_fname, __pyx_k_fname, sizeof(__pyx_k_fname), 0, 0, 1, 1},
   {&__pyx_n_s_fp, __pyx_k_fp, sizeof(__pyx_k_fp), 0, 0, 1, 1},
   {&__pyx_n_s_from_steps, __pyx_k_from_steps, sizeof(__pyx_k_from_steps), 0, 0, 1, 1},
+  {&__pyx_n_s_gdim, __pyx_k_gdim, sizeof(__pyx_k_gdim), 0, 0, 1, 1},
+  {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1},
+  {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1},
+  {&__pyx_n_s_getitem___locals_genexpr, __pyx_k_getitem___locals_genexpr, sizeof(__pyx_k_getitem___locals_genexpr), 0, 0, 1, 1},
   {&__pyx_n_s_global_dimensions, __pyx_k_global_dimensions, sizeof(__pyx_k_global_dimensions), 0, 0, 1, 1},
+  {&__pyx_n_s_gname, __pyx_k_gname, sizeof(__pyx_k_gname), 0, 0, 1, 1},
   {&__pyx_n_s_group, __pyx_k_group, sizeof(__pyx_k_group), 0, 0, 1, 1},
   {&__pyx_n_s_group_id, __pyx_k_group_id, sizeof(__pyx_k_group_id), 0, 0, 1, 1},
   {&__pyx_n_s_group_name, __pyx_k_group_name, sizeof(__pyx_k_group_name), 0, 0, 1, 1},
   {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
+  {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1},
+  {&__pyx_n_s_indices, __pyx_k_indices, sizeof(__pyx_k_indices), 0, 0, 1, 1},
+  {&__pyx_n_s_init, __pyx_k_init, sizeof(__pyx_k_init), 0, 0, 1, 1},
   {&__pyx_n_s_int16, __pyx_k_int16, sizeof(__pyx_k_int16), 0, 0, 1, 1},
   {&__pyx_n_s_int32, __pyx_k_int32, sizeof(__pyx_k_int32), 0, 0, 1, 1},
   {&__pyx_n_s_int64, __pyx_k_int64, sizeof(__pyx_k_int64), 0, 0, 1, 1},
   {&__pyx_n_s_int8, __pyx_k_int8, sizeof(__pyx_k_int8), 0, 0, 1, 1},
   {&__pyx_n_s_integer, __pyx_k_integer, sizeof(__pyx_k_integer), 0, 0, 1, 1},
+  {&__pyx_n_s_is_noxml, __pyx_k_is_noxml, sizeof(__pyx_k_is_noxml), 0, 0, 1, 1},
+  {&__pyx_n_s_is_static, __pyx_k_is_static, sizeof(__pyx_k_is_static), 0, 0, 1, 1},
   {&__pyx_n_s_is_stream, __pyx_k_is_stream, sizeof(__pyx_k_is_stream), 0, 0, 1, 1},
   {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1},
+  {&__pyx_n_s_iteritems, __pyx_k_iteritems, sizeof(__pyx_k_iteritems), 0, 0, 1, 1},
   {&__pyx_n_s_iterkeys, __pyx_k_iterkeys, sizeof(__pyx_k_iterkeys), 0, 0, 1, 1},
   {&__pyx_n_s_k, __pyx_k_k, sizeof(__pyx_k_k), 0, 0, 1, 1},
+  {&__pyx_n_s_keys, __pyx_k_keys, sizeof(__pyx_k_keys), 0, 0, 1, 1},
   {&__pyx_n_s_last, __pyx_k_last, sizeof(__pyx_k_last), 0, 0, 1, 1},
   {&__pyx_n_s_last_step, __pyx_k_last_step, sizeof(__pyx_k_last_step), 0, 0, 1, 1},
+  {&__pyx_n_s_ldim, __pyx_k_ldim, sizeof(__pyx_k_ldim), 0, 0, 1, 1},
   {&__pyx_n_s_local_offsets, __pyx_k_local_offsets, sizeof(__pyx_k_local_offsets), 0, 0, 1, 1},
   {&__pyx_n_s_lock_mode, __pyx_k_lock_mode, sizeof(__pyx_k_lock_mode), 0, 0, 1, 1},
   {&__pyx_n_s_long, __pyx_k_long, sizeof(__pyx_k_long), 0, 0, 1, 1},
@@ -13631,6 +24539,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_metaclass, __pyx_k_metaclass, sizeof(__pyx_k_metaclass), 0, 0, 1, 1},
   {&__pyx_n_s_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 0, 1, 1},
   {&__pyx_n_s_method_name, __pyx_k_method_name, sizeof(__pyx_k_method_name), 0, 0, 1, 1},
+  {&__pyx_n_s_method_params, __pyx_k_method_params, sizeof(__pyx_k_method_params), 0, 0, 1, 1},
   {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1},
   {&__pyx_n_s_module, __pyx_k_module, sizeof(__pyx_k_module), 0, 0, 1, 1},
   {&__pyx_n_s_mype, __pyx_k_mype, sizeof(__pyx_k_mype), 0, 0, 1, 1},
@@ -13655,13 +24564,25 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_read, __pyx_k_read, sizeof(__pyx_k_read), 0, 0, 1, 1},
   {&__pyx_n_s_readvar, __pyx_k_readvar, sizeof(__pyx_k_readvar), 0, 0, 1, 1},
   {&__pyx_n_s_real, __pyx_k_real, sizeof(__pyx_k_real), 0, 0, 1, 1},
+  {&__pyx_n_s_replace, __pyx_k_replace, sizeof(__pyx_k_replace), 0, 0, 1, 1},
+  {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1},
+  {&__pyx_n_s_setitem, __pyx_k_setitem, sizeof(__pyx_k_setitem), 0, 0, 1, 1},
+  {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1},
   {&__pyx_n_s_short, __pyx_k_short, sizeof(__pyx_k_short), 0, 0, 1, 1},
   {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1},
   {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1},
+  {&__pyx_n_s_squeeze, __pyx_k_squeeze, sizeof(__pyx_k_squeeze), 0, 0, 1, 1},
   {&__pyx_n_s_stats, __pyx_k_stats, sizeof(__pyx_k_stats), 0, 0, 1, 1},
+  {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1},
   {&__pyx_n_s_str, __pyx_k_str, sizeof(__pyx_k_str), 0, 0, 1, 1},
   {&__pyx_n_s_string, __pyx_k_string, sizeof(__pyx_k_string), 0, 0, 1, 1},
+  {&__pyx_n_s_string_array, __pyx_k_string_array, sizeof(__pyx_k_string_array), 0, 0, 1, 1},
+  {&__pyx_n_s_strip, __pyx_k_strip, sizeof(__pyx_k_strip), 0, 0, 1, 1},
+  {&__pyx_n_s_strlen, __pyx_k_strlen, sizeof(__pyx_k_strlen), 0, 0, 1, 1},
+  {&__pyx_n_s_subtract, __pyx_k_subtract, sizeof(__pyx_k_subtract), 0, 0, 1, 1},
+  {&__pyx_n_s_t, __pyx_k_t, sizeof(__pyx_k_t), 0, 0, 1, 1},
   {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
+  {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1},
   {&__pyx_n_s_time_index, __pyx_k_time_index, sizeof(__pyx_k_time_index), 0, 0, 1, 1},
   {&__pyx_n_s_time_steps, __pyx_k_time_steps, sizeof(__pyx_k_time_steps), 0, 0, 1, 1},
   {&__pyx_n_s_timeout_sec, __pyx_k_timeout_sec, sizeof(__pyx_k_timeout_sec), 0, 0, 1, 1},
@@ -13679,21 +24600,39 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_v, __pyx_k_v, sizeof(__pyx_k_v), 0, 0, 1, 1},
   {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1},
   {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1},
+  {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1},
   {&__pyx_n_s_var, __pyx_k_var, sizeof(__pyx_k_var), 0, 0, 1, 1},
   {&__pyx_n_s_var_namelist, __pyx_k_var_namelist, sizeof(__pyx_k_var_namelist), 0, 0, 1, 1},
+  {&__pyx_kp_u_var_read_line_888, __pyx_k_var_read_line_888, sizeof(__pyx_k_var_read_line_888), 0, 1, 0, 0},
   {&__pyx_n_s_varid, __pyx_k_varid, sizeof(__pyx_k_varid), 0, 0, 1, 1},
   {&__pyx_n_s_varname, __pyx_k_varname, sizeof(__pyx_k_varname), 0, 0, 1, 1},
   {&__pyx_n_s_vars, __pyx_k_vars, sizeof(__pyx_k_vars), 0, 0, 1, 1},
   {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1},
   {&__pyx_n_s_vp, __pyx_k_vp, sizeof(__pyx_k_vp), 0, 0, 1, 1},
   {&__pyx_n_s_when, __pyx_k_when, sizeof(__pyx_k_when), 0, 0, 1, 1},
+  {&__pyx_n_s_write, __pyx_k_write, sizeof(__pyx_k_write), 0, 0, 1, 1},
+  {&__pyx_kp_u_writer_declare_group_line_1222, __pyx_k_writer_declare_group_line_1222, sizeof(__pyx_k_writer_declare_group_line_1222), 0, 1, 0, 0},
+  {&__pyx_kp_u_writer_define_var_line_1244, __pyx_k_writer_define_var_line_1244, sizeof(__pyx_k_writer_define_var_line_1244), 0, 1, 0, 0},
+  {&__pyx_n_s_xrange, __pyx_k_xrange, sizeof(__pyx_k_xrange), 0, 0, 1, 1},
   {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1},
+  {&__pyx_n_s_zip, __pyx_k_zip, sizeof(__pyx_k_zip), 0, 0, 1, 1},
   {0, 0, 0, 0, 0, 0, 0}
 };
 static int __Pyx_InitCachedBuiltins(void) {
-  __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #if PY_MAJOR_VERSION >= 3
+  __pyx_builtin_xrange = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #else
+  __pyx_builtin_xrange = __Pyx_GetBuiltinName(__pyx_n_s_xrange); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
+  __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_KeyError = __Pyx_GetBuiltinName(__pyx_n_s_KeyError); if (!__pyx_builtin_KeyError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 776; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_zip = __Pyx_GetBuiltinName(__pyx_n_s_zip); if (!__pyx_builtin_zip) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_NotImplementedError = __Pyx_GetBuiltinName(__pyx_n_s_NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -13703,117 +24642,289 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "adios.pyx":540
+  /* "adios.pyx":288
+ *     for slice_ in index:
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))             # <<<<<<<<<<<<<<
+ *         elif isinstance(slice_, (int, long)):
+ *             fixed.append(slice(slice_, slice_+1, None))
+ */
+  __pyx_slice_ = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice_);
+  __Pyx_GIVEREF(__pyx_slice_);
+
+  /* "adios.pyx":297
+ *     index = tuple(fixed)
+ *     if len(index) < ndim:
+ *         index += (slice(None),) * (ndim-len(index))             # <<<<<<<<<<<<<<
+ * 
+ *     return index
+ */
+  __pyx_slice__2 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__2);
+  __Pyx_GIVEREF(__pyx_slice__2);
+  __pyx_tuple__3 = PyTuple_New(1); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__3);
+  __Pyx_INCREF(__pyx_slice__2);
+  PyTuple_SET_ITEM(__pyx_tuple__3, 0, __pyx_slice__2);
+  __Pyx_GIVEREF(__pyx_slice__2);
+  __Pyx_GIVEREF(__pyx_tuple__3);
+
+  /* "adios.pyx":704
  *         assert self.fp != NULL, 'Not an open file'
  * 
  *         self.name = fname.split('/')[-1]  ## basename             # <<<<<<<<<<<<<<
  *         self.nvars = self.fp.nvars
  *         self.nattrs = self.fp.nattrs
  */
-  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s__8); if (unlikely(!__pyx_tuple__9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__9);
-  __Pyx_GIVEREF(__pyx_tuple__9);
+  __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s__11); if (unlikely(!__pyx_tuple__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 704; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__12);
+  __Pyx_GIVEREF(__pyx_tuple__12);
+
+  /* "adios.pyx":776
+ *         for key_ in varname:
+ *             if not isinstance(key_, str):
+ *                 raise TypeError("Unhashable type")             # <<<<<<<<<<<<<<
+ * 
+ *             if key_ in self.var.keys():
+ */
+  __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_Unhashable_type); if (unlikely(!__pyx_tuple__13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 776; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__13);
+  __Pyx_GIVEREF(__pyx_tuple__13);
 
-  /* "adios.pyx":622
+  /* "adios.pyx":951
  *         if len(offset) == 0:
  *             npoffset = npshape.copy()
  *             npoffset.fill(0)             # <<<<<<<<<<<<<<
  *         else:
  *             npoffset = np.array(offset, dtype=np.int64)
  */
-  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__10);
-  __Pyx_GIVEREF(__pyx_tuple__10);
+  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__14);
+  __Pyx_GIVEREF(__pyx_tuple__14);
+
+  /* "adios.pyx":968
+ * 
+ *         if (npshape < npcount + npoffset).any():
+ *             raise IndexError('Requested is larger than the shape.')             # <<<<<<<<<<<<<<
+ * 
+ *         shape = list(npcount)
+ */
+  __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_Requested_is_larger_than_the_sha); if (unlikely(!__pyx_tuple__15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__15);
+  __Pyx_GIVEREF(__pyx_tuple__15);
+
+  /* "adios.pyx":976
+ * 
+ *         if len(shape) > 0:
+ *             var[:] = fill             # <<<<<<<<<<<<<<
+ * 
+ *         cdef ADIOS_SELECTION * sel
+ */
+  __pyx_slice__16 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__16);
+  __Pyx_GIVEREF(__pyx_slice__16);
+
+  /* "adios.pyx":1017
+ * 
+ *         if (ndim_ > 0) and (len(index_) > ndim_):
+ *             raise IndexError("Too many indices for data")             # <<<<<<<<<<<<<<
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):
+ */
+  __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_Too_many_indices_for_data); if (unlikely(!__pyx_tuple__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__17);
+  __Pyx_GIVEREF(__pyx_tuple__17);
+
+  /* "adios.pyx":1020
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):
+ *             raise IndexError("Too many indices for data")             # <<<<<<<<<<<<<<
+ * 
+ *         for slice_ in index_:
+ */
+  __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_Too_many_indices_for_data); if (unlikely(!__pyx_tuple__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__18);
+  __Pyx_GIVEREF(__pyx_tuple__18);
+
+  /* "adios.pyx":1036
+ *             from_steps_ = z[0][0]
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]             # <<<<<<<<<<<<<<
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ */
+  __pyx_slice__19 = PySlice_New(__pyx_int_1, Py_None, Py_None); if (unlikely(!__pyx_slice__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__19);
+  __Pyx_GIVEREF(__pyx_slice__19);
+
+  /* "adios.pyx":1037
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)             # <<<<<<<<<<<<<<
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))
+ */
+  __pyx_slice__20 = PySlice_New(__pyx_int_1, Py_None, Py_None); if (unlikely(!__pyx_slice__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__20);
+  __Pyx_GIVEREF(__pyx_slice__20);
+  __pyx_slice__21 = PySlice_New(__pyx_int_1, Py_None, Py_None); if (unlikely(!__pyx_slice__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__21);
+  __Pyx_GIVEREF(__pyx_slice__21);
+
+  /* "adios.pyx":1384
+ *         if self.is_static:
+ *             if self.value is None:
+ *                 raise TypeError("Value is none")             # <<<<<<<<<<<<<<
+ * 
+ *             define_attribute_byvalue(gid, self.name, "", self.value)
+ */
+  __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_Value_is_none); if (unlikely(!__pyx_tuple__26)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__26);
+  __Pyx_GIVEREF(__pyx_tuple__26);
+
+  /* "adios.pyx":1418
+ *     def define(self, int64_t gid):
+ *         if self.value is None:
+ *             raise TypeError("Value is none")             # <<<<<<<<<<<<<<
+ * 
+ *         ldim_ = self.ldim
+ */
+  __pyx_tuple__30 = PyTuple_Pack(1, __pyx_kp_s_Value_is_none); if (unlikely(!__pyx_tuple__30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__30);
+  __Pyx_GIVEREF(__pyx_tuple__30);
+
+  /* "adios.pyx":1439
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,
+ *                    str(ldim_).replace(' ', '').strip('(,)'),             # <<<<<<<<<<<<<<
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ */
+  __pyx_tuple__32 = PyTuple_Pack(2, __pyx_kp_s__31, __pyx_kp_s__7); if (unlikely(!__pyx_tuple__32)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__32);
+  __Pyx_GIVEREF(__pyx_tuple__32);
+  __pyx_tuple__34 = PyTuple_Pack(1, __pyx_kp_s__33); if (unlikely(!__pyx_tuple__34)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__34);
+  __Pyx_GIVEREF(__pyx_tuple__34);
+
+  /* "adios.pyx":1440
+ *         define_var(gid, self.name, "", atype,
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),             # <<<<<<<<<<<<<<
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ * 
+ */
+  __pyx_tuple__35 = PyTuple_Pack(2, __pyx_kp_s__31, __pyx_kp_s__7); if (unlikely(!__pyx_tuple__35)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__35);
+  __Pyx_GIVEREF(__pyx_tuple__35);
+  __pyx_tuple__36 = PyTuple_Pack(1, __pyx_kp_s__33); if (unlikely(!__pyx_tuple__36)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__36);
+  __Pyx_GIVEREF(__pyx_tuple__36);
+
+  /* "adios.pyx":1441
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ *                    str(offset_).replace(' ', '').strip('(,)'))             # <<<<<<<<<<<<<<
+ * 
+ *     def bytes(self):
+ */
+  __pyx_tuple__37 = PyTuple_Pack(2, __pyx_kp_s__31, __pyx_kp_s__7); if (unlikely(!__pyx_tuple__37)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__37);
+  __Pyx_GIVEREF(__pyx_tuple__37);
+  __pyx_tuple__38 = PyTuple_Pack(1, __pyx_kp_s__33); if (unlikely(!__pyx_tuple__38)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__38);
+  __Pyx_GIVEREF(__pyx_tuple__38);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":215
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
  *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  */
-  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__11)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__11);
-  __Pyx_GIVEREF(__pyx_tuple__11);
+  __pyx_tuple__39 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__39)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__39);
+  __Pyx_GIVEREF(__pyx_tuple__39);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":219
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
  *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
  * 
  *             info.buf = PyArray_DATA(self)
  */
-  __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__12)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__12);
-  __Pyx_GIVEREF(__pyx_tuple__12);
+  __pyx_tuple__40 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__40)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__40);
+  __Pyx_GIVEREF(__pyx_tuple__40);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260
  *                 if ((descr.byteorder == c'>' and little_endian) or
  *                     (descr.byteorder == c'<' and not little_endian)):
  *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"
  */
-  __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__13)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__13);
-  __Pyx_GIVEREF(__pyx_tuple__13);
+  __pyx_tuple__41 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__41)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__41);
+  __Pyx_GIVEREF(__pyx_tuple__41);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802
  * 
  *         if (end - f) - <int>(new_offset - offset[0]) < 15:
  *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
  * 
  *         if ((child.byteorder == c'>' and little_endian) or
  */
-  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__14);
-  __Pyx_GIVEREF(__pyx_tuple__14);
+  __pyx_tuple__42 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__42)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__42);
+  __Pyx_GIVEREF(__pyx_tuple__42);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":803
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":806
  *         if ((child.byteorder == c'>' and little_endian) or
  *             (child.byteorder == c'<' and not little_endian)):
  *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *             # One could encode it in the format string and have Cython
  *             # complain instead, BUT: < and > in format strings also imply
  */
-  __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__15)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__15);
-  __Pyx_GIVEREF(__pyx_tuple__15);
+  __pyx_tuple__43 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__43)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__43);
+  __Pyx_GIVEREF(__pyx_tuple__43);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826
  *             t = child.type_num
  *             if end - f < 5:
  *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
  * 
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  */
-  __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__16)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__16);
-  __Pyx_GIVEREF(__pyx_tuple__16);
+  __pyx_tuple__44 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__44)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__44);
+  __Pyx_GIVEREF(__pyx_tuple__44);
 
-  /* "adios.pyx":661
+  /* "adios.pyx":1465
  * ## ====================
  * 
  * def readvar(fname, varname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     if not f.var.has_key(varname):
+ *     """ Retrieve a variable value from an Adios file.
+ * 
  */
-  __pyx_tuple__17 = PyTuple_Pack(4, __pyx_n_s_fname, __pyx_n_s_varname, __pyx_n_s_f, __pyx_n_s_v); if (unlikely(!__pyx_tuple__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__17);
-  __Pyx_GIVEREF(__pyx_tuple__17);
-  __pyx_codeobj__18 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_n_s_readvar, 661, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_tuple__45 = PyTuple_Pack(4, __pyx_n_s_fname, __pyx_n_s_varname, __pyx_n_s_f, __pyx_n_s_v); if (unlikely(!__pyx_tuple__45)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__45);
+  __Pyx_GIVEREF(__pyx_tuple__45);
+  __pyx_codeobj__46 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__45, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_n_s_readvar, 1465, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__46)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":670
+  /* "adios.pyx":1483
  *     return v.read(from_steps=0, nsteps=v.nsteps)
  * 
  * def bpls(fname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     return {'nvars': f.nvars,
+ *     """ Return meta data of an Adios file as a Python dictionary object.
+ * 
  */
-  __pyx_tuple__19 = PyTuple_Pack(3, __pyx_n_s_fname, __pyx_n_s_f, __pyx_n_s_k); if (unlikely(!__pyx_tuple__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__19);
-  __Pyx_GIVEREF(__pyx_tuple__19);
-  __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_n_s_bpls, 670, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_tuple__47 = PyTuple_Pack(3, __pyx_n_s_fname, __pyx_n_s_f, __pyx_n_s_k); if (unlikely(!__pyx_tuple__47)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__47);
+  __Pyx_GIVEREF(__pyx_tuple__47);
+  __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__47, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_n_s_bpls, 1483, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -13826,6 +24937,7 @@ static int __Pyx_InitGlobals(void) {
   __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_6 = PyInt_FromLong(6); if (unlikely(!__pyx_int_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -13833,6 +24945,7 @@ static int __Pyx_InitGlobals(void) {
   __pyx_int_9 = PyInt_FromLong(9); if (unlikely(!__pyx_int_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_10 = PyInt_FromLong(10); if (unlikely(!__pyx_int_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_11 = PyInt_FromLong(11); if (unlikely(!__pyx_int_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_int_12 = PyInt_FromLong(12); if (unlikely(!__pyx_int_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_50 = PyInt_FromLong(50); if (unlikely(!__pyx_int_50)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_51 = PyInt_FromLong(51); if (unlikely(!__pyx_int_51)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_52 = PyInt_FromLong(52); if (unlikely(!__pyx_int_52)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -13888,7 +25001,7 @@ PyMODINIT_FUNC PyInit_adios(void)
   #endif
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_m = Py_InitModule4("adios", __pyx_methods, __pyx_k_ADIOS_is_freely_available_under, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
+  __pyx_m = Py_InitModule4("adios", __pyx_methods, __pyx_k_ADIOS_ADIOS_python_module_module, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
   #else
   __pyx_m = PyModule_Create(&__pyx_moduledef);
   #endif
@@ -13928,20 +25041,71 @@ PyMODINIT_FUNC PyInit_adios(void)
   __pyx_vtable_5adios_file.close = (PyObject *(*)(struct __pyx_obj_5adios_file *, int __pyx_skip_dispatch))__pyx_f_5adios_4file_close;
   __pyx_vtable_5adios_file.printself = (PyObject *(*)(struct __pyx_obj_5adios_file *, int __pyx_skip_dispatch))__pyx_f_5adios_4file_printself;
   __pyx_vtable_5adios_file.advance = (PyObject *(*)(struct __pyx_obj_5adios_file *, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_4file_advance *__pyx_optional_args))__pyx_f_5adios_4file_advance;
-  if (PyType_Ready(&__pyx_type_5adios_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_5adios_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_type_5adios_file.tp_print = 0;
-  if (__Pyx_SetVtable(__pyx_type_5adios_file.tp_dict, __pyx_vtabptr_5adios_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (PyObject_SetAttrString(__pyx_m, "file", (PyObject *)&__pyx_type_5adios_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #if CYTHON_COMPILING_IN_CPYTHON
+  {
+    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_5adios_file, "__getitem__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
+      __pyx_wrapperbase_5adios_4file_10__getitem__ = *((PyWrapperDescrObject *)wrapper)->d_base;
+      __pyx_wrapperbase_5adios_4file_10__getitem__.doc = __pyx_doc_5adios_4file_10__getitem__;
+      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_5adios_4file_10__getitem__;
+    }
+  }
+  #endif
+  #if CYTHON_COMPILING_IN_CPYTHON
+  {
+    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_5adios_file, "__repr__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
+      __pyx_wrapperbase_5adios_4file_12__repr__ = *((PyWrapperDescrObject *)wrapper)->d_base;
+      __pyx_wrapperbase_5adios_4file_12__repr__.doc = __pyx_doc_5adios_4file_12__repr__;
+      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_5adios_4file_12__repr__;
+    }
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_type_5adios_file.tp_dict, __pyx_vtabptr_5adios_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttrString(__pyx_m, "file", (PyObject *)&__pyx_type_5adios_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_5adios_file = &__pyx_type_5adios_file;
   __pyx_vtabptr_5adios_var = &__pyx_vtable_5adios_var;
   __pyx_vtable_5adios_var.close = (PyObject *(*)(struct __pyx_obj_5adios_var *, int __pyx_skip_dispatch))__pyx_f_5adios_3var_close;
+  __pyx_vtable_5adios_var.advance = (PyObject *(*)(struct __pyx_obj_5adios_var *, int __pyx_skip_dispatch))__pyx_f_5adios_3var_advance;
   __pyx_vtable_5adios_var.read = (PyObject *(*)(struct __pyx_obj_5adios_var *, int __pyx_skip_dispatch, struct __pyx_opt_args_5adios_3var_read *__pyx_optional_args))__pyx_f_5adios_3var_read;
   __pyx_vtable_5adios_var.printself = (PyObject *(*)(struct __pyx_obj_5adios_var *, int __pyx_skip_dispatch))__pyx_f_5adios_3var_printself;
-  if (PyType_Ready(&__pyx_type_5adios_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_5adios_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_type_5adios_var.tp_print = 0;
-  if (__Pyx_SetVtable(__pyx_type_5adios_var.tp_dict, __pyx_vtabptr_5adios_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (PyObject_SetAttrString(__pyx_m, "var", (PyObject *)&__pyx_type_5adios_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_5adios_var.tp_dict, __pyx_vtabptr_5adios_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttrString(__pyx_m, "var", (PyObject *)&__pyx_type_5adios_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_5adios_var = &__pyx_type_5adios_var;
+  if (PyType_Ready(&__pyx_type_5adios_attr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5adios_attr.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "attr", (PyObject *)&__pyx_type_5adios_attr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5adios_attr = &__pyx_type_5adios_attr;
+  __pyx_type_5adios_smartdict.tp_base = (&PyDict_Type);
+  if (PyType_Ready(&__pyx_type_5adios_smartdict) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5adios_smartdict.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "smartdict", (PyObject *)&__pyx_type_5adios_smartdict) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5adios_smartdict = &__pyx_type_5adios_smartdict;
+  if (PyType_Ready(&__pyx_type_5adios_writer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5adios_writer.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "writer", (PyObject *)&__pyx_type_5adios_writer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5adios_writer = &__pyx_type_5adios_writer;
+  if (PyType_Ready(&__pyx_type_5adios_attrinfo) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5adios_attrinfo.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "attrinfo", (PyObject *)&__pyx_type_5adios_attrinfo) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5adios_attrinfo = &__pyx_type_5adios_attrinfo;
+  if (PyType_Ready(&__pyx_type_5adios_varinfo) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5adios_varinfo.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "varinfo", (PyObject *)&__pyx_type_5adios_varinfo) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5adios_varinfo = &__pyx_type_5adios_varinfo;
+  if (PyType_Ready(&__pyx_type_5adios___pyx_scope_struct____getitem__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5adios___pyx_scope_struct____getitem__.tp_print = 0;
+  __pyx_ptype_5adios___pyx_scope_struct____getitem__ = &__pyx_type_5adios___pyx_scope_struct____getitem__;
+  if (PyType_Ready(&__pyx_type_5adios___pyx_scope_struct_1_genexpr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5adios___pyx_scope_struct_1_genexpr.tp_print = 0;
+  __pyx_ptype_5adios___pyx_scope_struct_1_genexpr = &__pyx_type_5adios___pyx_scope_struct_1_genexpr;
+  if (PyType_Ready(&__pyx_type_5adios___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5adios___pyx_scope_struct_2_genexpr.tp_print = 0;
+  __pyx_ptype_5adios___pyx_scope_struct_2_genexpr = &__pyx_type_5adios___pyx_scope_struct_2_genexpr;
   /*--- Type import code ---*/
   __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", 
   #if CYTHON_COMPILING_IN_PYPY
@@ -13951,393 +25115,569 @@ PyMODINIT_FUNC PyInit_adios(void)
   #endif
   0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Variable import code ---*/
   /*--- Function import code ---*/
   /*--- Execution code ---*/
 
-  /* "adios.pyx":12
+  /* "adios.pyx":7
  * """
  * 
  * import numpy as np             # <<<<<<<<<<<<<<
  * cimport numpy as np
  * 
  */
-  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":228
+  /* "adios.pyx":241
  * ## ====================
  * 
  * class DATATYPE:             # <<<<<<<<<<<<<<
  *     unknown = -1
  *     byte = 0
  */
-  __pyx_t_1 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_DATATYPE, __pyx_n_s_DATATYPE, (PyObject *) NULL, __pyx_n_s_adios, (PyObject *) NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_DATATYPE, __pyx_n_s_DATATYPE, (PyObject *) NULL, __pyx_n_s_adios, (PyObject *) NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "adios.pyx":229
+  /* "adios.pyx":242
  * 
  * class DATATYPE:
  *     unknown = -1             # <<<<<<<<<<<<<<
  *     byte = 0
  *     short = 1
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unknown, __pyx_int_neg_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 229; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unknown, __pyx_int_neg_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":230
+  /* "adios.pyx":243
  * class DATATYPE:
  *     unknown = -1
  *     byte = 0             # <<<<<<<<<<<<<<
  *     short = 1
  *     integer = 2
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_byte, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_byte, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":231
+  /* "adios.pyx":244
  *     unknown = -1
  *     byte = 0
  *     short = 1             # <<<<<<<<<<<<<<
  *     integer = 2
  *     long = 4
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_short, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_short, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":232
+  /* "adios.pyx":245
  *     byte = 0
  *     short = 1
  *     integer = 2             # <<<<<<<<<<<<<<
  *     long = 4
  *     unsigned_byte = 50
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_integer, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_integer, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":233
+  /* "adios.pyx":246
  *     short = 1
  *     integer = 2
  *     long = 4             # <<<<<<<<<<<<<<
  *     unsigned_byte = 50
  *     unsigned_short = 51
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_long, __pyx_int_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_long, __pyx_int_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":234
+  /* "adios.pyx":247
  *     integer = 2
  *     long = 4
  *     unsigned_byte = 50             # <<<<<<<<<<<<<<
  *     unsigned_short = 51
  *     unsigned_integer = 52
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unsigned_byte, __pyx_int_50) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unsigned_byte, __pyx_int_50) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":235
+  /* "adios.pyx":248
  *     long = 4
  *     unsigned_byte = 50
  *     unsigned_short = 51             # <<<<<<<<<<<<<<
  *     unsigned_integer = 52
  *     unsigned_long = 54
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unsigned_short, __pyx_int_51) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unsigned_short, __pyx_int_51) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":236
+  /* "adios.pyx":249
  *     unsigned_byte = 50
  *     unsigned_short = 51
  *     unsigned_integer = 52             # <<<<<<<<<<<<<<
  *     unsigned_long = 54
  *     real = 5
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unsigned_integer, __pyx_int_52) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unsigned_integer, __pyx_int_52) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":237
+  /* "adios.pyx":250
  *     unsigned_short = 51
  *     unsigned_integer = 52
  *     unsigned_long = 54             # <<<<<<<<<<<<<<
  *     real = 5
  *     double = 6
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unsigned_long, __pyx_int_54) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_unsigned_long, __pyx_int_54) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":238
+  /* "adios.pyx":251
  *     unsigned_integer = 52
  *     unsigned_long = 54
  *     real = 5             # <<<<<<<<<<<<<<
  *     double = 6
  *     long_double = 7
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_real, __pyx_int_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_real, __pyx_int_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":239
+  /* "adios.pyx":252
  *     unsigned_long = 54
  *     real = 5
  *     double = 6             # <<<<<<<<<<<<<<
  *     long_double = 7
  *     string = 9
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_double, __pyx_int_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_double, __pyx_int_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":240
+  /* "adios.pyx":253
  *     real = 5
  *     double = 6
  *     long_double = 7             # <<<<<<<<<<<<<<
  *     string = 9
  *     complex = 10
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_long_double, __pyx_int_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_long_double, __pyx_int_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":241
+  /* "adios.pyx":254
  *     double = 6
  *     long_double = 7
  *     string = 9             # <<<<<<<<<<<<<<
  *     complex = 10
  *     double_complex = 11
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_string, __pyx_int_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_string, __pyx_int_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":242
+  /* "adios.pyx":255
  *     long_double = 7
  *     string = 9
  *     complex = 10             # <<<<<<<<<<<<<<
  *     double_complex = 11
- * 
+ *     string_array = 12
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_complex_2, __pyx_int_10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_complex_2, __pyx_int_10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":243
+  /* "adios.pyx":256
  *     string = 9
  *     complex = 10
  *     double_complex = 11             # <<<<<<<<<<<<<<
+ *     string_array = 12
+ * 
+ */
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_double_complex, __pyx_int_11) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":257
+ *     complex = 10
+ *     double_complex = 11
+ *     string_array = 12             # <<<<<<<<<<<<<<
  * 
  * class FLAG:
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_double_complex, __pyx_int_11) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_string_array, __pyx_int_12) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":228
+  /* "adios.pyx":241
  * ## ====================
  * 
  * class DATATYPE:             # <<<<<<<<<<<<<<
  *     unknown = -1
  *     byte = 0
  */
-  __pyx_t_2 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_DATATYPE, __pyx_empty_tuple, __pyx_t_1, NULL, 0, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_DATATYPE, __pyx_empty_tuple, __pyx_t_1, NULL, 0, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_DATATYPE, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_DATATYPE, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":245
- *     double_complex = 11
+  /* "adios.pyx":259
+ *     string_array = 12
  * 
  * class FLAG:             # <<<<<<<<<<<<<<
  *     UNKNOWN = 0
  *     YES = 1
  */
-  __pyx_t_1 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_FLAG, __pyx_n_s_FLAG, (PyObject *) NULL, __pyx_n_s_adios, (PyObject *) NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_FLAG, __pyx_n_s_FLAG, (PyObject *) NULL, __pyx_n_s_adios, (PyObject *) NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "adios.pyx":246
+  /* "adios.pyx":260
  * 
  * class FLAG:
  *     UNKNOWN = 0             # <<<<<<<<<<<<<<
  *     YES = 1
  *     NO = 2
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_UNKNOWN, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_UNKNOWN, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":247
+  /* "adios.pyx":261
  * class FLAG:
  *     UNKNOWN = 0
  *     YES = 1             # <<<<<<<<<<<<<<
  *     NO = 2
  * 
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_YES, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_YES, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":248
+  /* "adios.pyx":262
  *     UNKNOWN = 0
  *     YES = 1
  *     NO = 2             # <<<<<<<<<<<<<<
  * 
  * class BUFFER_ALLOC_WHEN:
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_NO, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_NO, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":245
- *     double_complex = 11
+  /* "adios.pyx":259
+ *     string_array = 12
  * 
  * class FLAG:             # <<<<<<<<<<<<<<
  *     UNKNOWN = 0
  *     YES = 1
  */
-  __pyx_t_2 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_FLAG, __pyx_empty_tuple, __pyx_t_1, NULL, 0, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_FLAG, __pyx_empty_tuple, __pyx_t_1, NULL, 0, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_FLAG, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_FLAG, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":250
+  /* "adios.pyx":264
  *     NO = 2
  * 
  * class BUFFER_ALLOC_WHEN:             # <<<<<<<<<<<<<<
  *     UNKNOWN = 0
  *     NOW = 1
  */
-  __pyx_t_1 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_n_s_BUFFER_ALLOC_WHEN, (PyObject *) NULL, __pyx_n_s_adios, (PyObject *) NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_n_s_BUFFER_ALLOC_WHEN, (PyObject *) NULL, __pyx_n_s_adios, (PyObject *) NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "adios.pyx":251
+  /* "adios.pyx":265
  * 
  * class BUFFER_ALLOC_WHEN:
  *     UNKNOWN = 0             # <<<<<<<<<<<<<<
  *     NOW = 1
  *     LATER = 2
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_UNKNOWN, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_UNKNOWN, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":252
+  /* "adios.pyx":266
  * class BUFFER_ALLOC_WHEN:
  *     UNKNOWN = 0
  *     NOW = 1             # <<<<<<<<<<<<<<
  *     LATER = 2
  * 
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_NOW, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_NOW, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":253
+  /* "adios.pyx":267
  *     UNKNOWN = 0
  *     NOW = 1
  *     LATER = 2             # <<<<<<<<<<<<<<
  * 
- * ## ====================
+ * class READ_METHOD:
  */
-  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_LATER, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_LATER, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios.pyx":250
+  /* "adios.pyx":264
  *     NO = 2
  * 
  * class BUFFER_ALLOC_WHEN:             # <<<<<<<<<<<<<<
  *     UNKNOWN = 0
  *     NOW = 1
  */
-  __pyx_t_2 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_empty_tuple, __pyx_t_1, NULL, 0, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_empty_tuple, __pyx_t_1, NULL, 0, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":259
+  /* "adios.pyx":269
+ *     LATER = 2
+ * 
+ * class READ_METHOD:             # <<<<<<<<<<<<<<
+ *     BP            = 0
+ *     BP_AGGREGATE  = 1
+ */
+  __pyx_t_1 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_READ_METHOD, __pyx_n_s_READ_METHOD, (PyObject *) NULL, __pyx_n_s_adios, (PyObject *) NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "adios.pyx":270
+ * 
+ * class READ_METHOD:
+ *     BP            = 0             # <<<<<<<<<<<<<<
+ *     BP_AGGREGATE  = 1
+ *     DATASPACES    = 3
+ */
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_BP, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":271
+ * class READ_METHOD:
+ *     BP            = 0
+ *     BP_AGGREGATE  = 1             # <<<<<<<<<<<<<<
+ *     DATASPACES    = 3
+ *     DIMES         = 4
+ */
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_BP_AGGREGATE, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":272
+ *     BP            = 0
+ *     BP_AGGREGATE  = 1
+ *     DATASPACES    = 3             # <<<<<<<<<<<<<<
+ *     DIMES         = 4
+ *     FLEXPATH      = 5
+ */
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_DATASPACES, __pyx_int_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":273
+ *     BP_AGGREGATE  = 1
+ *     DATASPACES    = 3
+ *     DIMES         = 4             # <<<<<<<<<<<<<<
+ *     FLEXPATH      = 5
+ *     ICEE          = 6
+ */
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_DIMES, __pyx_int_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":274
+ *     DATASPACES    = 3
+ *     DIMES         = 4
+ *     FLEXPATH      = 5             # <<<<<<<<<<<<<<
+ *     ICEE          = 6
+ * 
+ */
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_FLEXPATH, __pyx_int_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":275
+ *     DIMES         = 4
+ *     FLEXPATH      = 5
+ *     ICEE          = 6             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  if (PyObject_SetItem(__pyx_t_1, __pyx_n_s_ICEE, __pyx_int_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios.pyx":269
+ *     LATER = 2
+ * 
+ * class READ_METHOD:             # <<<<<<<<<<<<<<
+ *     BP            = 0
+ *     BP_AGGREGATE  = 1
+ */
+  __pyx_t_2 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_READ_METHOD, __pyx_empty_tuple, __pyx_t_1, NULL, 0, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_READ_METHOD, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "adios.pyx":305
  * ## ====================
  * 
  * cpdef init(char * config, MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
  *     return adios_init(config, comm)
  * 
  */
-  __pyx_k_ = MPI_COMM_WORLD;
-  __pyx_k_ = MPI_COMM_WORLD;
+  __pyx_k__4 = MPI_COMM_WORLD;
+  __pyx_k__4 = MPI_COMM_WORLD;
 
-  /* "adios.pyx":265
+  /* "adios.pyx":311
  *                    char * name,
  *                    char * mode,
  *                    MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
  *     cdef int64_t fd
  *     cdef int result
  */
-  __pyx_k__2 = MPI_COMM_WORLD;
+  __pyx_k__5 = MPI_COMM_WORLD;
 
-  /* "adios.pyx":262
+  /* "adios.pyx":308
  *     return adios_init(config, comm)
  * 
  * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
  *                    char * name,
  *                    char * mode,
  */
-  __pyx_k__2 = MPI_COMM_WORLD;
+  __pyx_k__5 = MPI_COMM_WORLD;
 
-  /* "adios.pyx":309
+  /* "adios.pyx":362
  * ## ADIOS No-XML API
  * ## ====================
  * cpdef int init_noxml(MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
  *     return adios_init_noxml(comm)
  * 
  */
-  __pyx_k__3 = MPI_COMM_WORLD;
-  __pyx_k__3 = MPI_COMM_WORLD;
+  __pyx_k__6 = MPI_COMM_WORLD;
+  __pyx_k__6 = MPI_COMM_WORLD;
 
-  /* "adios.pyx":488
+  /* "adios.pyx":593
  * """ Call adios_read_init_method """
  * cpdef int read_init(char * method_name = "BP",
  *                     MPI_Comm comm = MPI_COMM_WORLD,             # <<<<<<<<<<<<<<
  *                     char * parameters = ""):
  *     cdef method = str2adiosreadmethod(method_name)
  */
-  __pyx_k__5 = MPI_COMM_WORLD;
+  __pyx_k__8 = MPI_COMM_WORLD;
 
-  /* "adios.pyx":487
+  /* "adios.pyx":592
  * 
  * """ Call adios_read_init_method """
  * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
  *                     MPI_Comm comm = MPI_COMM_WORLD,
  *                     char * parameters = ""):
  */
-  __pyx_k__5 = MPI_COMM_WORLD;
+  __pyx_k__8 = MPI_COMM_WORLD;
 
-  /* "adios.pyx":522
+  /* "adios.pyx":686
  *     def __init__(self, char * fname,
- *                  char * method_name = "BP",
+ *                  char * method_name = 'BP',
  *                  MPI_Comm comm = MPI_COMM_WORLD,             # <<<<<<<<<<<<<<
  *                  is_stream = False,
  *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
  */
-  __pyx_k__6 = MPI_COMM_WORLD;
+  __pyx_k__9 = MPI_COMM_WORLD;
 
-  /* "adios.pyx":524
+  /* "adios.pyx":688
  *                  MPI_Comm comm = MPI_COMM_WORLD,
  *                  is_stream = False,
  *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,             # <<<<<<<<<<<<<<
  *                  float timeout_sec = 0.0):
  *         self.fp = NULL
  */
-  __pyx_k__7 = ADIOS_LOCKMODE_ALL;
+  __pyx_k__10 = ADIOS_LOCKMODE_ALL;
 
-  /* "adios.pyx":661
+  /* "adios.pyx":1207
+ *     def __init__(self,char * fname,
+ *                  bint is_noxml = True,
+ *                  MPI_Comm comm = MPI_COMM_WORLD):             # <<<<<<<<<<<<<<
+ *         self.fname = fname
+ *         self.method = <bytes>""
+ */
+  __pyx_k__22 = MPI_COMM_WORLD;
+
+  /* "adios.pyx":1245
+ * 
+ *     def define_var(self, char * varname,
+ *                    ldim = tuple(),             # <<<<<<<<<<<<<<
+ *                    gdim = tuple(),
+ *                    offset = tuple()):
+ */
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_k__23 = __pyx_t_1;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1246
+ *     def define_var(self, char * varname,
+ *                    ldim = tuple(),
+ *                    gdim = tuple(),             # <<<<<<<<<<<<<<
+ *                    offset = tuple()):
+ *         """
+ */
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_k__24 = __pyx_t_1;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1247
+ *                    ldim = tuple(),
+ *                    gdim = tuple(),
+ *                    offset = tuple()):             # <<<<<<<<<<<<<<
+ *         """
+ *         Define a variable associated with the file.
+ */
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_k__25 = __pyx_t_1;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1408
+ * 
+ *     def __init__(self, char * name,
+ *                  ldim = tuple(),             # <<<<<<<<<<<<<<
+ *                  gdim = tuple(),
+ *                  offset = tuple()):
+ */
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_k__27 = __pyx_t_1;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1409
+ *     def __init__(self, char * name,
+ *                  ldim = tuple(),
+ *                  gdim = tuple(),             # <<<<<<<<<<<<<<
+ *                  offset = tuple()):
+ *         self.name = name
+ */
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_k__28 = __pyx_t_1;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1410
+ *                  ldim = tuple(),
+ *                  gdim = tuple(),
+ *                  offset = tuple()):             # <<<<<<<<<<<<<<
+ *         self.name = name
+ *         self.ldim = ldim
+ */
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_k__29 = __pyx_t_1;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios.pyx":1465
  * ## ====================
  * 
  * def readvar(fname, varname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     if not f.var.has_key(varname):
+ *     """ Retrieve a variable value from an Adios file.
+ * 
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5adios_39readvar, NULL, __pyx_n_s_adios); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5adios_49readvar, NULL, __pyx_n_s_adios); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_readvar, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_readvar, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios.pyx":670
+  /* "adios.pyx":1483
  *     return v.read(from_steps=0, nsteps=v.nsteps)
  * 
  * def bpls(fname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI_COMM_SELF)
- *     return {'nvars': f.nvars,
+ *     """ Return meta data of an Adios file as a Python dictionary object.
+ * 
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5adios_41bpls, NULL, __pyx_n_s_adios); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5adios_51bpls, NULL, __pyx_n_s_adios); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_bpls, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_bpls, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* "adios.pyx":1
- * """             # <<<<<<<<<<<<<<
- *  ADIOS is freely available under the terms of the BSD license described
- *  in the COPYING file in the top level directory of this source distribution.
+ * # -*- coding: utf-8 -*-             # <<<<<<<<<<<<<<
+ * """ADIOS: ADIOS python module
+ * 
  */
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_var_read_line_888, __pyx_kp_u_Perform_read_Read_data_from_an) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_writer_declare_group_line_1222, __pyx_kp_u_Define_a_group_associated_with) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_writer_define_var_line_1244, __pyx_kp_u_Define_a_variable_associated_wi) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979
  *      arr.base = baseptr
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -14368,34 +25708,195 @@ PyMODINIT_FUNC PyInit_adios(void)
   #endif
 }
 
-/* Runtime support code */
-#if CYTHON_REFNANNY
-static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
-    PyObject *m = NULL, *p = NULL;
-    void *r = NULL;
-    m = PyImport_ImportModule((char *)modname);
-    if (!m) goto end;
-    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
-    if (!p) goto end;
-    r = PyLong_AsVoidPtr(p);
-end:
-    Py_XDECREF(p);
-    Py_XDECREF(m);
-    return (__Pyx_RefNannyAPIStruct *)r;
-}
+/* --- Runtime support code --- */
+#if CYTHON_REFNANNY
+static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
+    PyObject *m = NULL, *p = NULL;
+    void *r = NULL;
+    m = PyImport_ImportModule((char *)modname);
+    if (!m) goto end;
+    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
+    if (!p) goto end;
+    r = PyLong_AsVoidPtr(p);
+end:
+    Py_XDECREF(p);
+    Py_XDECREF(m);
+    return (__Pyx_RefNannyAPIStruct *)r;
+}
+#endif
+
+static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
+    PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
+    if (unlikely(!result)) {
+        PyErr_Format(PyExc_NameError,
+#if PY_MAJOR_VERSION >= 3
+            "name '%U' is not defined", name);
+#else
+            "name '%.200s' is not defined", PyString_AS_STRING(name));
+#endif
+    }
+    return result;
+}
+
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
+    PyObject *r;
+    if (!j) return NULL;
+    r = PyObject_GetItem(o, j);
+    Py_DECREF(j);
+    return r;
+}
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
+                                                              int wraparound, int boundscheck) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o);
+    if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        PyObject *r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
+}
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
+                                                              int wraparound, int boundscheck) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o);
+    if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        PyObject *r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
+}
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
+                                                     int is_list, int wraparound, int boundscheck) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (is_list || PyList_CheckExact(o)) {
+        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+        if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) {
+            PyObject *r = PyList_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
+    }
+    else if (PyTuple_CheckExact(o)) {
+        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
+        if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
+    } else {
+        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
+        if (likely(m && m->sq_item)) {
+            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
+                Py_ssize_t l = m->sq_length(o);
+                if (likely(l >= 0)) {
+                    i += l;
+                } else {
+                    if (PyErr_ExceptionMatches(PyExc_OverflowError))
+                        PyErr_Clear();
+                    else
+                        return NULL;
+                }
+            }
+            return m->sq_item(o, i);
+        }
+    }
+#else
+    if (is_list || PySequence_Check(o)) {
+        return PySequence_GetItem(o, i);
+    }
+#endif
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+}
+
+static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    PyThreadState *tstate = PyThreadState_GET();
+    tmp_type = tstate->curexc_type;
+    tmp_value = tstate->curexc_value;
+    tmp_tb = tstate->curexc_traceback;
+    tstate->curexc_type = type;
+    tstate->curexc_value = value;
+    tstate->curexc_traceback = tb;
+    Py_XDECREF(tmp_type);
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(tmp_tb);
+#else
+    PyErr_Restore(type, value, tb);
 #endif
-
-static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
-    PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
-    if (unlikely(!result)) {
-        PyErr_Format(PyExc_NameError,
-#if PY_MAJOR_VERSION >= 3
-            "name '%U' is not defined", name);
+}
+static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyThreadState *tstate = PyThreadState_GET();
+    *type = tstate->curexc_type;
+    *value = tstate->curexc_value;
+    *tb = tstate->curexc_traceback;
+    tstate->curexc_type = 0;
+    tstate->curexc_value = 0;
+    tstate->curexc_traceback = 0;
 #else
-            "name '%.200s' is not defined", PyString_AS_STRING(name));
+    PyErr_Fetch(type, value, tb);
 #endif
+}
+
+static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
+                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
+                                  int full_traceback) {
+    PyObject *old_exc, *old_val, *old_tb;
+    PyObject *ctx;
+    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
+    if (full_traceback) {
+        Py_XINCREF(old_exc);
+        Py_XINCREF(old_val);
+        Py_XINCREF(old_tb);
+        __Pyx_ErrRestore(old_exc, old_val, old_tb);
+        PyErr_PrintEx(1);
     }
-    return result;
+    #if PY_MAJOR_VERSION < 3
+    ctx = PyString_FromString(name);
+    #else
+    ctx = PyUnicode_FromString(name);
+    #endif
+    __Pyx_ErrRestore(old_exc, old_val, old_tb);
+    if (!ctx) {
+        PyErr_WriteUnraisable(Py_None);
+    } else {
+        PyErr_WriteUnraisable(ctx);
+        Py_DECREF(ctx);
+    }
+}
+
+static void __Pyx_RaiseArgtupleInvalid(
+    const char* func_name,
+    int exact,
+    Py_ssize_t num_min,
+    Py_ssize_t num_max,
+    Py_ssize_t num_found)
+{
+    Py_ssize_t num_expected;
+    const char *more_or_less;
+    if (num_found < num_min) {
+        num_expected = num_min;
+        more_or_less = "at least";
+    } else {
+        num_expected = num_max;
+        more_or_less = "at most";
+    }
+    if (exact) {
+        more_or_less = "exactly";
+    }
+    PyErr_Format(PyExc_TypeError,
+                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                 func_name, more_or_less, num_expected,
+                 (num_expected == 1) ? "" : "s", num_found);
 }
 
 static void __Pyx_RaiseDoubleKeywordsError(
@@ -14488,366 +25989,781 @@ static int __Pyx_ParseOptionalKeywords(
         if (kwds2) {
             if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
         } else {
-            goto invalid_keyword;
+            goto invalid_keyword;
+        }
+    }
+    return 0;
+arg_passed_twice:
+    __Pyx_RaiseDoubleKeywordsError(function_name, key);
+    goto bad;
+invalid_keyword_type:
+    PyErr_Format(PyExc_TypeError,
+        "%.200s() keywords must be strings", function_name);
+    goto bad;
+invalid_keyword:
+    PyErr_Format(PyExc_TypeError,
+    #if PY_MAJOR_VERSION < 3
+        "%.200s() got an unexpected keyword argument '%.200s'",
+        function_name, PyString_AsString(key));
+    #else
+        "%s() got an unexpected keyword argument '%U'",
+        function_name, key);
+    #endif
+bad:
+    return -1;
+}
+
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
+    if (unlikely(!type)) {
+        PyErr_SetString(PyExc_SystemError, "Missing type object");
+        return 0;
+    }
+    if (likely(PyObject_TypeCheck(obj, type)))
+        return 1;
+    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
+                 Py_TYPE(obj)->tp_name, type->tp_name);
+    return 0;
+}
+
+static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
+    PyObject *result;
+#if CYTHON_COMPILING_IN_CPYTHON
+    result = PyDict_GetItem(__pyx_d, name);
+    if (likely(result)) {
+        Py_INCREF(result);
+    } else {
+#else
+    result = PyObject_GetItem(__pyx_d, name);
+    if (!result) {
+        PyErr_Clear();
+#endif
+        result = __Pyx_GetBuiltinName(name);
+    }
+    return result;
+}
+
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyObject *result;
+    ternaryfunc call = func->ob_type->tp_call;
+    if (unlikely(!call))
+        return PyObject_Call(func, arg, kw);
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+        return NULL;
+    result = (*call)(func, arg, kw);
+    Py_LeaveRecursiveCall();
+    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+        PyErr_SetString(
+            PyExc_SystemError,
+            "NULL result without error in PyObject_Call");
+    }
+    return result;
+}
+#endif
+
+static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) {
+    PyErr_Format(PyExc_TypeError,
+        "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)",
+        name, type->tp_name, Py_TYPE(obj)->tp_name);
+}
+static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact)
+{
+    if (unlikely(!type)) {
+        PyErr_SetString(PyExc_SystemError, "Missing type object");
+        return 0;
+    }
+    if (none_allowed && obj == Py_None) return 1;
+    else if (exact) {
+        if (likely(Py_TYPE(obj) == type)) return 1;
+        #if PY_MAJOR_VERSION == 2
+        else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1;
+        #endif
+    }
+    else {
+        if (likely(PyObject_TypeCheck(obj, type))) return 1;
+    }
+    __Pyx_RaiseArgumentTypeInvalid(name, obj, type);
+    return 0;
+}
+
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
+    PyObject *self, *result;
+    PyCFunction cfunc;
+    cfunc = PyCFunction_GET_FUNCTION(func);
+    self = PyCFunction_GET_SELF(func);
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+        return NULL;
+    result = cfunc(self, arg);
+    Py_LeaveRecursiveCall();
+    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+        PyErr_SetString(
+            PyExc_SystemError,
+            "NULL result without error in PyObject_Call");
+    }
+    return result;
+}
+#endif
+
+#if CYTHON_COMPILING_IN_CPYTHON
+static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+    PyObject *result;
+    PyObject *args = PyTuple_New(1);
+    if (unlikely(!args)) return NULL;
+    Py_INCREF(arg);
+    PyTuple_SET_ITEM(args, 0, arg);
+    result = __Pyx_PyObject_Call(func, args, NULL);
+    Py_DECREF(args);
+    return result;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+#ifdef __Pyx_CyFunction_USED
+    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
+#else
+    if (likely(PyCFunction_Check(func))) {
+#endif
+        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
+            return __Pyx_PyObject_CallMethO(func, arg);
+        }
+    }
+    return __Pyx__PyObject_CallOneArg(func, arg);
+}
+#else
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+    PyObject* args = PyTuple_Pack(1, arg);
+    return (likely(args)) ? __Pyx_PyObject_Call(func, args, NULL) : NULL;
+}
+#endif
+
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
+#if CYTHON_COMPILING_IN_PYPY
+    return PyObject_RichCompareBool(s1, s2, equals);
+#else
+    if (s1 == s2) {
+        return (equals == Py_EQ);
+    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
+        const char *ps1, *ps2;
+        Py_ssize_t length = PyBytes_GET_SIZE(s1);
+        if (length != PyBytes_GET_SIZE(s2))
+            return (equals == Py_NE);
+        ps1 = PyBytes_AS_STRING(s1);
+        ps2 = PyBytes_AS_STRING(s2);
+        if (ps1[0] != ps2[0]) {
+            return (equals == Py_NE);
+        } else if (length == 1) {
+            return (equals == Py_EQ);
+        } else {
+            int result = memcmp(ps1, ps2, (size_t)length);
+            return (equals == Py_EQ) ? (result == 0) : (result != 0);
         }
+    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
+        return (equals == Py_NE);
+    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
+        return (equals == Py_NE);
+    } else {
+        int result;
+        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
+        if (!py_result)
+            return -1;
+        result = __Pyx_PyObject_IsTrue(py_result);
+        Py_DECREF(py_result);
+        return result;
     }
-    return 0;
-arg_passed_twice:
-    __Pyx_RaiseDoubleKeywordsError(function_name, key);
-    goto bad;
-invalid_keyword_type:
-    PyErr_Format(PyExc_TypeError,
-        "%.200s() keywords must be strings", function_name);
-    goto bad;
-invalid_keyword:
-    PyErr_Format(PyExc_TypeError,
-    #if PY_MAJOR_VERSION < 3
-        "%.200s() got an unexpected keyword argument '%.200s'",
-        function_name, PyString_AsString(key));
-    #else
-        "%s() got an unexpected keyword argument '%U'",
-        function_name, key);
-    #endif
-bad:
-    return -1;
+#endif
 }
 
-static void __Pyx_RaiseArgtupleInvalid(
-    const char* func_name,
-    int exact,
-    Py_ssize_t num_min,
-    Py_ssize_t num_max,
-    Py_ssize_t num_found)
-{
-    Py_ssize_t num_expected;
-    const char *more_or_less;
-    if (num_found < num_min) {
-        num_expected = num_min;
-        more_or_less = "at least";
-    } else {
-        num_expected = num_max;
-        more_or_less = "at most";
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
+#if CYTHON_COMPILING_IN_PYPY
+    return PyObject_RichCompareBool(s1, s2, equals);
+#else
+#if PY_MAJOR_VERSION < 3
+    PyObject* owned_ref = NULL;
+#endif
+    int s1_is_unicode, s2_is_unicode;
+    if (s1 == s2) {
+        goto return_eq;
     }
-    if (exact) {
-        more_or_less = "exactly";
+    s1_is_unicode = PyUnicode_CheckExact(s1);
+    s2_is_unicode = PyUnicode_CheckExact(s2);
+#if PY_MAJOR_VERSION < 3
+    if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) {
+        owned_ref = PyUnicode_FromObject(s2);
+        if (unlikely(!owned_ref))
+            return -1;
+        s2 = owned_ref;
+        s2_is_unicode = 1;
+    } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) {
+        owned_ref = PyUnicode_FromObject(s1);
+        if (unlikely(!owned_ref))
+            return -1;
+        s1 = owned_ref;
+        s1_is_unicode = 1;
+    } else if (((!s2_is_unicode) & (!s1_is_unicode))) {
+        return __Pyx_PyBytes_Equals(s1, s2, equals);
     }
-    PyErr_Format(PyExc_TypeError,
-                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
-                 func_name, more_or_less, num_expected,
-                 (num_expected == 1) ? "" : "s", num_found);
+#endif
+    if (s1_is_unicode & s2_is_unicode) {
+        Py_ssize_t length;
+        int kind;
+        void *data1, *data2;
+        if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0))
+            return -1;
+        length = __Pyx_PyUnicode_GET_LENGTH(s1);
+        if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) {
+            goto return_ne;
+        }
+        kind = __Pyx_PyUnicode_KIND(s1);
+        if (kind != __Pyx_PyUnicode_KIND(s2)) {
+            goto return_ne;
+        }
+        data1 = __Pyx_PyUnicode_DATA(s1);
+        data2 = __Pyx_PyUnicode_DATA(s2);
+        if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) {
+            goto return_ne;
+        } else if (length == 1) {
+            goto return_eq;
+        } else {
+            int result = memcmp(data1, data2, (size_t)(length * kind));
+            #if PY_MAJOR_VERSION < 3
+            Py_XDECREF(owned_ref);
+            #endif
+            return (equals == Py_EQ) ? (result == 0) : (result != 0);
+        }
+    } else if ((s1 == Py_None) & s2_is_unicode) {
+        goto return_ne;
+    } else if ((s2 == Py_None) & s1_is_unicode) {
+        goto return_ne;
+    } else {
+        int result;
+        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
+        if (!py_result)
+            return -1;
+        result = __Pyx_PyObject_IsTrue(py_result);
+        Py_DECREF(py_result);
+        return result;
+    }
+return_eq:
+    #if PY_MAJOR_VERSION < 3
+    Py_XDECREF(owned_ref);
+    #endif
+    return (equals == Py_EQ);
+return_ne:
+    #if PY_MAJOR_VERSION < 3
+    Py_XDECREF(owned_ref);
+    #endif
+    return (equals == Py_NE);
+#endif
 }
 
-static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
-    PyObject *result;
 #if CYTHON_COMPILING_IN_CPYTHON
-    result = PyDict_GetItem(__pyx_d, name);
-    if (likely(result)) {
-        Py_INCREF(result);
-    } else {
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
+#ifdef __Pyx_CyFunction_USED
+    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
 #else
-    result = PyObject_GetItem(__pyx_d, name);
-    if (!result) {
-        PyErr_Clear();
+    if (likely(PyCFunction_Check(func))) {
 #endif
-        result = __Pyx_GetBuiltinName(name);
+        if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
+            return __Pyx_PyObject_CallMethO(func, NULL);
+        }
     }
-    return result;
+    return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
 }
+#endif
 
+static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) {
+    PyObject *method, *result = NULL;
+    method = __Pyx_PyObject_GetAttrStr(obj, method_name);
+    if (unlikely(!method)) goto bad;
 #if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
-    PyObject *result;
-    ternaryfunc call = func->ob_type->tp_call;
-    if (unlikely(!call))
-        return PyObject_Call(func, arg, kw);
-    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
-        return NULL;
-    result = (*call)(func, arg, kw);
-    Py_LeaveRecursiveCall();
-    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
-        PyErr_SetString(
-            PyExc_SystemError,
-            "NULL result without error in PyObject_Call");
+    if (likely(PyMethod_Check(method))) {
+        PyObject *self = PyMethod_GET_SELF(method);
+        if (likely(self)) {
+            PyObject *args;
+            PyObject *function = PyMethod_GET_FUNCTION(method);
+            args = PyTuple_New(2);
+            if (unlikely(!args)) goto bad;
+            Py_INCREF(self);
+            PyTuple_SET_ITEM(args, 0, self);
+            Py_INCREF(arg);
+            PyTuple_SET_ITEM(args, 1, arg);
+            Py_INCREF(function);
+            Py_DECREF(method); method = NULL;
+            result = __Pyx_PyObject_Call(function, args, NULL);
+            Py_DECREF(args);
+            Py_DECREF(function);
+            return result;
+        }
+    }
+#endif
+    result = __Pyx_PyObject_CallOneArg(method, arg);
+bad:
+    Py_XDECREF(method);
+    return result;
+}
+
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d) {
+    if (PY_MAJOR_VERSION >= 3)
+        return __Pyx_PyObject_CallMethod1((PyObject*)&PyDict_Type, __pyx_n_s_values, d);
+    else
+        return PyDict_Values(d);
+}
+
+#if PY_MAJOR_VERSION < 3
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
+                        CYTHON_UNUSED PyObject *cause) {
+    Py_XINCREF(type);
+    if (!value || value == Py_None)
+        value = NULL;
+    else
+        Py_INCREF(value);
+    if (!tb || tb == Py_None)
+        tb = NULL;
+    else {
+        Py_INCREF(tb);
+        if (!PyTraceBack_Check(tb)) {
+            PyErr_SetString(PyExc_TypeError,
+                "raise: arg 3 must be a traceback or None");
+            goto raise_error;
+        }
+    }
+    if (PyType_Check(type)) {
+#if CYTHON_COMPILING_IN_PYPY
+        if (!value) {
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+#endif
+        PyErr_NormalizeException(&type, &value, &tb);
+    } else {
+        if (value) {
+            PyErr_SetString(PyExc_TypeError,
+                "instance exception may not have a separate value");
+            goto raise_error;
+        }
+        value = type;
+        type = (PyObject*) Py_TYPE(type);
+        Py_INCREF(type);
+        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
+            PyErr_SetString(PyExc_TypeError,
+                "raise: exception class must be a subclass of BaseException");
+            goto raise_error;
+        }
+    }
+    __Pyx_ErrRestore(type, value, tb);
+    return;
+raise_error:
+    Py_XDECREF(value);
+    Py_XDECREF(type);
+    Py_XDECREF(tb);
+    return;
+}
+#else
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
+    PyObject* owned_instance = NULL;
+    if (tb == Py_None) {
+        tb = 0;
+    } else if (tb && !PyTraceBack_Check(tb)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: arg 3 must be a traceback or None");
+        goto bad;
+    }
+    if (value == Py_None)
+        value = 0;
+    if (PyExceptionInstance_Check(type)) {
+        if (value) {
+            PyErr_SetString(PyExc_TypeError,
+                "instance exception may not have a separate value");
+            goto bad;
+        }
+        value = type;
+        type = (PyObject*) Py_TYPE(value);
+    } else if (PyExceptionClass_Check(type)) {
+        PyObject *instance_class = NULL;
+        if (value && PyExceptionInstance_Check(value)) {
+            instance_class = (PyObject*) Py_TYPE(value);
+            if (instance_class != type) {
+                if (PyObject_IsSubclass(instance_class, type)) {
+                    type = instance_class;
+                } else {
+                    instance_class = NULL;
+                }
+            }
+        }
+        if (!instance_class) {
+            PyObject *args;
+            if (!value)
+                args = PyTuple_New(0);
+            else if (PyTuple_Check(value)) {
+                Py_INCREF(value);
+                args = value;
+            } else
+                args = PyTuple_Pack(1, value);
+            if (!args)
+                goto bad;
+            owned_instance = PyObject_Call(type, args, NULL);
+            Py_DECREF(args);
+            if (!owned_instance)
+                goto bad;
+            value = owned_instance;
+            if (!PyExceptionInstance_Check(value)) {
+                PyErr_Format(PyExc_TypeError,
+                             "calling %R should have returned an instance of "
+                             "BaseException, not %R",
+                             type, Py_TYPE(value));
+                goto bad;
+            }
+        }
+    } else {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: exception class must be a subclass of BaseException");
+        goto bad;
     }
-    return result;
-}
+#if PY_VERSION_HEX >= 0x03030000
+    if (cause) {
+#else
+    if (cause && cause != Py_None) {
 #endif
-
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
-    if (unlikely(!type)) {
-        PyErr_SetString(PyExc_SystemError, "Missing type object");
-        return 0;
+        PyObject *fixed_cause;
+        if (cause == Py_None) {
+            fixed_cause = NULL;
+        } else if (PyExceptionClass_Check(cause)) {
+            fixed_cause = PyObject_CallObject(cause, NULL);
+            if (fixed_cause == NULL)
+                goto bad;
+        } else if (PyExceptionInstance_Check(cause)) {
+            fixed_cause = cause;
+            Py_INCREF(fixed_cause);
+        } else {
+            PyErr_SetString(PyExc_TypeError,
+                            "exception causes must derive from "
+                            "BaseException");
+            goto bad;
+        }
+        PyException_SetCause(value, fixed_cause);
     }
-    if (likely(PyObject_TypeCheck(obj, type)))
-        return 1;
-    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
-                 Py_TYPE(obj)->tp_name, type->tp_name);
-    return 0;
-}
-
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    PyObject *tmp_type, *tmp_value, *tmp_tb;
-    PyThreadState *tstate = PyThreadState_GET();
-    tmp_type = tstate->curexc_type;
-    tmp_value = tstate->curexc_value;
-    tmp_tb = tstate->curexc_traceback;
-    tstate->curexc_type = type;
-    tstate->curexc_value = value;
-    tstate->curexc_traceback = tb;
-    Py_XDECREF(tmp_type);
-    Py_XDECREF(tmp_value);
-    Py_XDECREF(tmp_tb);
+    PyErr_SetObject(type, value);
+    if (tb) {
+#if CYTHON_COMPILING_IN_PYPY
+        PyObject *tmp_type, *tmp_value, *tmp_tb;
+        PyErr_Fetch(tmp_type, tmp_value, tmp_tb);
+        Py_INCREF(tb);
+        PyErr_Restore(tmp_type, tmp_value, tb);
+        Py_XDECREF(tmp_tb);
 #else
-    PyErr_Restore(type, value, tb);
+        PyThreadState *tstate = PyThreadState_GET();
+        PyObject* tmp_tb = tstate->curexc_traceback;
+        if (tb != tmp_tb) {
+            Py_INCREF(tb);
+            tstate->curexc_traceback = tb;
+            Py_XDECREF(tmp_tb);
+        }
 #endif
+    }
+bad:
+    Py_XDECREF(owned_instance);
+    return;
 }
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    PyThreadState *tstate = PyThreadState_GET();
-    *type = tstate->curexc_type;
-    *value = tstate->curexc_value;
-    *tb = tstate->curexc_traceback;
-    tstate->curexc_type = 0;
-    tstate->curexc_value = 0;
-    tstate->curexc_traceback = 0;
-#else
-    PyErr_Fetch(type, value, tb);
 #endif
-}
 
-static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
-                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
-                                  int full_traceback) {
-    PyObject *old_exc, *old_val, *old_tb;
-    PyObject *ctx;
-    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
-    if (full_traceback) {
-        Py_XINCREF(old_exc);
-        Py_XINCREF(old_val);
-        Py_XINCREF(old_tb);
-        __Pyx_ErrRestore(old_exc, old_val, old_tb);
-        PyErr_PrintEx(1);
-    }
-    #if PY_MAJOR_VERSION < 3
-    ctx = PyString_FromString(name);
-    #else
-    ctx = PyUnicode_FromString(name);
-    #endif
-    __Pyx_ErrRestore(old_exc, old_val, old_tb);
-    if (!ctx) {
-        PyErr_WriteUnraisable(Py_None);
-    } else {
-        PyErr_WriteUnraisable(ctx);
-        Py_DECREF(ctx);
-    }
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Keys(PyObject* d) {
+    if (PY_MAJOR_VERSION >= 3)
+        return __Pyx_PyObject_CallMethod1((PyObject*)&PyDict_Type, __pyx_n_s_keys, d);
+    else
+        return PyDict_Keys(d);
 }
 
-static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) {
-    PyErr_Format(PyExc_TypeError,
-        "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)",
-        name, type->tp_name, Py_TYPE(obj)->tp_name);
-}
-static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
-    const char *name, int exact)
-{
-    if (unlikely(!type)) {
-        PyErr_SetString(PyExc_SystemError, "Missing type object");
-        return 0;
-    }
-    if (none_allowed && obj == Py_None) return 1;
-    else if (exact) {
-        if (likely(Py_TYPE(obj) == type)) return 1;
-        #if PY_MAJOR_VERSION == 2
-        else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1;
-        #endif
-    }
-    else {
-        if (likely(PyObject_TypeCheck(obj, type))) return 1;
+static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) {
+    PyObject* value;
+#if PY_MAJOR_VERSION >= 3
+    value = PyDict_GetItemWithError(d, key);
+    if (unlikely(!value)) {
+        if (unlikely(PyErr_Occurred()))
+            return NULL;
+        value = default_value;
     }
-    __Pyx_RaiseArgumentTypeInvalid(name, obj, type);
-    return 0;
-}
-
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
-#if CYTHON_COMPILING_IN_PYPY
-    return PyObject_RichCompareBool(s1, s2, equals);
+    Py_INCREF(value);
 #else
-    if (s1 == s2) {
-        return (equals == Py_EQ);
-    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
-        const char *ps1, *ps2;
-        Py_ssize_t length = PyBytes_GET_SIZE(s1);
-        if (length != PyBytes_GET_SIZE(s2))
-            return (equals == Py_NE);
-        ps1 = PyBytes_AS_STRING(s1);
-        ps2 = PyBytes_AS_STRING(s2);
-        if (ps1[0] != ps2[0]) {
-            return (equals == Py_NE);
-        } else if (length == 1) {
-            return (equals == Py_EQ);
-        } else {
-            int result = memcmp(ps1, ps2, (size_t)length);
-            return (equals == Py_EQ) ? (result == 0) : (result != 0);
+    if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) {
+        value = PyDict_GetItem(d, key);
+        if (unlikely(!value)) {
+            value = default_value;
         }
-    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
-        return (equals == Py_NE);
-    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
-        return (equals == Py_NE);
+        Py_INCREF(value);
     } else {
-        int result;
-        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
-        if (!py_result)
-            return -1;
-        result = __Pyx_PyObject_IsTrue(py_result);
-        Py_DECREF(py_result);
-        return result;
+        if (default_value == Py_None)
+            default_value = NULL;
+        value = PyObject_CallMethodObjArgs(
+            d, __pyx_n_s_get, key, default_value, NULL);
     }
 #endif
+    return value;
 }
 
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
-    PyObject *r;
-    if (!j) return NULL;
-    r = PyObject_GetItem(o, j);
-    Py_DECREF(j);
-    return r;
-}
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o);
-    if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        PyObject *r = PyList_GET_ITEM(o, i);
-        Py_INCREF(r);
-        return r;
-    }
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-#else
-    return PySequence_GetItem(o, i);
-#endif
-}
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o);
-    if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-        PyObject *r = PyTuple_GET_ITEM(o, i);
-        Py_INCREF(r);
-        return r;
-    }
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-#else
-    return PySequence_GetItem(o, i);
-#endif
-}
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
-                                                     int is_list, int wraparound, int boundscheck) {
+static CYTHON_INLINE int __Pyx_PyObject_SetSlice(
+        PyObject* obj, PyObject* value, Py_ssize_t cstart, Py_ssize_t cstop,
+        PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice,
+        int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) {
 #if CYTHON_COMPILING_IN_CPYTHON
-    if (is_list || PyList_CheckExact(o)) {
-        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
-        if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) {
-            PyObject *r = PyList_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
+    PyMappingMethods* mp;
+#if PY_MAJOR_VERSION < 3
+    PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence;
+    if (likely(ms && ms->sq_ass_slice)) {
+        if (!has_cstart) {
+            if (_py_start && (*_py_start != Py_None)) {
+                cstart = __Pyx_PyIndex_AsSsize_t(*_py_start);
+                if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+            } else
+                cstart = 0;
         }
-    }
-    else if (PyTuple_CheckExact(o)) {
-        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
-        if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
+        if (!has_cstop) {
+            if (_py_stop && (*_py_stop != Py_None)) {
+                cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop);
+                if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+            } else
+                cstop = PY_SSIZE_T_MAX;
         }
-    } else {
-        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
-        if (likely(m && m->sq_item)) {
-            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
-                Py_ssize_t l = m->sq_length(o);
-                if (likely(l >= 0)) {
-                    i += l;
-                } else {
-                    if (PyErr_ExceptionMatches(PyExc_OverflowError))
-                        PyErr_Clear();
-                    else
-                        return NULL;
+        if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) {
+            Py_ssize_t l = ms->sq_length(obj);
+            if (likely(l >= 0)) {
+                if (cstop < 0) {
+                    cstop += l;
+                    if (cstop < 0) cstop = 0;
+                }
+                if (cstart < 0) {
+                    cstart += l;
+                    if (cstart < 0) cstart = 0;
                 }
+            } else {
+                if (PyErr_ExceptionMatches(PyExc_OverflowError))
+                    PyErr_Clear();
+                else
+                    goto bad;
+            }
+        }
+        return ms->sq_ass_slice(obj, cstart, cstop, value);
+    }
+#endif
+    mp = Py_TYPE(obj)->tp_as_mapping;
+    if (likely(mp && mp->mp_ass_subscript))
+#endif
+    {
+        int result;
+        PyObject *py_slice, *py_start, *py_stop;
+        if (_py_slice) {
+            py_slice = *_py_slice;
+        } else {
+            PyObject* owned_start = NULL;
+            PyObject* owned_stop = NULL;
+            if (_py_start) {
+                py_start = *_py_start;
+            } else {
+                if (has_cstart) {
+                    owned_start = py_start = PyInt_FromSsize_t(cstart);
+                    if (unlikely(!py_start)) goto bad;
+                } else
+                    py_start = Py_None;
             }
-            return m->sq_item(o, i);
+            if (_py_stop) {
+                py_stop = *_py_stop;
+            } else {
+                if (has_cstop) {
+                    owned_stop = py_stop = PyInt_FromSsize_t(cstop);
+                    if (unlikely(!py_stop)) {
+                        Py_XDECREF(owned_start);
+                        goto bad;
+                    }
+                } else
+                    py_stop = Py_None;
+            }
+            py_slice = PySlice_New(py_start, py_stop, Py_None);
+            Py_XDECREF(owned_start);
+            Py_XDECREF(owned_stop);
+            if (unlikely(!py_slice)) goto bad;
         }
-    }
+#if CYTHON_COMPILING_IN_CPYTHON
+        result = mp->mp_ass_subscript(obj, py_slice, value);
 #else
-    if (is_list || PySequence_Check(o)) {
-        return PySequence_GetItem(o, i);
-    }
+        result = value ? PyObject_SetItem(obj, py_slice, value) : PyObject_DelItem(obj, py_slice);
 #endif
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+        if (!_py_slice) {
+            Py_DECREF(py_slice);
+        }
+        return result;
+    }
+    PyErr_Format(PyExc_TypeError,
+        "'%.200s' object does not support slice %.10s",
+        Py_TYPE(obj)->tp_name, value ? "assignment" : "deletion");
+bad:
+    return -1;
+}
+
+static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
+    PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
 }
 
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
+        PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
+        PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice,
+        int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) {
 #if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
-    PyObject *self, *result;
-    PyCFunction cfunc;
-    cfunc = PyCFunction_GET_FUNCTION(func);
-    self = PyCFunction_GET_SELF(func);
-    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
-        return NULL;
-    result = cfunc(self, arg);
-    Py_LeaveRecursiveCall();
-    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
-        PyErr_SetString(
-            PyExc_SystemError,
-            "NULL result without error in PyObject_Call");
+    PyMappingMethods* mp;
+#if PY_MAJOR_VERSION < 3
+    PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence;
+    if (likely(ms && ms->sq_slice)) {
+        if (!has_cstart) {
+            if (_py_start && (*_py_start != Py_None)) {
+                cstart = __Pyx_PyIndex_AsSsize_t(*_py_start);
+                if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+            } else
+                cstart = 0;
+        }
+        if (!has_cstop) {
+            if (_py_stop && (*_py_stop != Py_None)) {
+                cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop);
+                if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+            } else
+                cstop = PY_SSIZE_T_MAX;
+        }
+        if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) {
+            Py_ssize_t l = ms->sq_length(obj);
+            if (likely(l >= 0)) {
+                if (cstop < 0) {
+                    cstop += l;
+                    if (cstop < 0) cstop = 0;
+                }
+                if (cstart < 0) {
+                    cstart += l;
+                    if (cstart < 0) cstart = 0;
+                }
+            } else {
+                if (PyErr_ExceptionMatches(PyExc_OverflowError))
+                    PyErr_Clear();
+                else
+                    goto bad;
+            }
+        }
+        return ms->sq_slice(obj, cstart, cstop);
     }
-    return result;
-}
 #endif
-
+    mp = Py_TYPE(obj)->tp_as_mapping;
+    if (likely(mp && mp->mp_subscript))
+#endif
+    {
+        PyObject* result;
+        PyObject *py_slice, *py_start, *py_stop;
+        if (_py_slice) {
+            py_slice = *_py_slice;
+        } else {
+            PyObject* owned_start = NULL;
+            PyObject* owned_stop = NULL;
+            if (_py_start) {
+                py_start = *_py_start;
+            } else {
+                if (has_cstart) {
+                    owned_start = py_start = PyInt_FromSsize_t(cstart);
+                    if (unlikely(!py_start)) goto bad;
+                } else
+                    py_start = Py_None;
+            }
+            if (_py_stop) {
+                py_stop = *_py_stop;
+            } else {
+                if (has_cstop) {
+                    owned_stop = py_stop = PyInt_FromSsize_t(cstop);
+                    if (unlikely(!py_stop)) {
+                        Py_XDECREF(owned_start);
+                        goto bad;
+                    }
+                } else
+                    py_stop = Py_None;
+            }
+            py_slice = PySlice_New(py_start, py_stop, Py_None);
+            Py_XDECREF(owned_start);
+            Py_XDECREF(owned_stop);
+            if (unlikely(!py_slice)) goto bad;
+        }
 #if CYTHON_COMPILING_IN_CPYTHON
-static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-    PyObject *result;
-    PyObject *args = PyTuple_New(1);
-    if (unlikely(!args)) return NULL;
-    Py_INCREF(arg);
-    PyTuple_SET_ITEM(args, 0, arg);
-    result = __Pyx_PyObject_Call(func, args, NULL);
-    Py_DECREF(args);
-    return result;
-}
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-#ifdef __Pyx_CyFunction_USED
-    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
+        result = mp->mp_subscript(obj, py_slice);
 #else
-    if (likely(PyCFunction_Check(func))) {
+        result = PyObject_GetItem(obj, py_slice);
 #endif
-        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
-            return __Pyx_PyObject_CallMethO(func, arg);
+        if (!_py_slice) {
+            Py_DECREF(py_slice);
         }
+        return result;
     }
-    return __Pyx__PyObject_CallOneArg(func, arg);
-}
-#else
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-    PyObject* args = PyTuple_Pack(1, arg);
-    return (likely(args)) ? __Pyx_PyObject_Call(func, args, NULL) : NULL;
+    PyErr_Format(PyExc_TypeError,
+        "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name);
+bad:
+    return NULL;
 }
-#endif
 
 #if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
-#ifdef __Pyx_CyFunction_USED
-    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
-#else
-    if (likely(PyCFunction_Check(func))) {
-#endif
-        if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
-            return __Pyx_PyObject_CallMethO(func, NULL);
-        }
+static CYTHON_INLINE void __Pyx_crop_slice(Py_ssize_t* _start, Py_ssize_t* _stop, Py_ssize_t* _length) {
+    Py_ssize_t start = *_start, stop = *_stop, length = *_length;
+    if (start < 0) {
+        start += length;
+        if (start < 0)
+            start = 0;
     }
-    return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
+    if (stop < 0)
+        stop += length;
+    else if (stop > length)
+        stop = length;
+    *_length = stop - start;
+    *_start = start;
+    *_stop = stop;
+}
+static CYTHON_INLINE void __Pyx_copy_object_array(PyObject** CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) {
+    PyObject *v;
+    Py_ssize_t i;
+    for (i = 0; i < length; i++) {
+        v = dest[i] = src[i];
+        Py_INCREF(v);
+    }
+}
+static CYTHON_INLINE PyObject* __Pyx_PyList_GetSlice(
+            PyObject* src, Py_ssize_t start, Py_ssize_t stop) {
+    PyObject* dest;
+    Py_ssize_t length = PyList_GET_SIZE(src);
+    __Pyx_crop_slice(&start, &stop, &length);
+    if (unlikely(length <= 0))
+        return PyList_New(0);
+    dest = PyList_New(length);
+    if (unlikely(!dest))
+        return NULL;
+    __Pyx_copy_object_array(
+        ((PyListObject*)src)->ob_item + start,
+        ((PyListObject*)dest)->ob_item,
+        length);
+    return dest;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyTuple_GetSlice(
+            PyObject* src, Py_ssize_t start, Py_ssize_t stop) {
+    PyObject* dest;
+    Py_ssize_t length = PyTuple_GET_SIZE(src);
+    __Pyx_crop_slice(&start, &stop, &length);
+    if (unlikely(length <= 0))
+        return PyTuple_New(0);
+    dest = PyTuple_New(length);
+    if (unlikely(!dest))
+        return NULL;
+    __Pyx_copy_object_array(
+        ((PyTupleObject*)src)->ob_item + start,
+        ((PyTupleObject*)dest)->ob_item,
+        length);
+    return dest;
 }
 #endif
 
+static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
+    int q = a / b;
+    int r = a - q*b;
+    q -= ((r != 0) & ((r ^ b) < 0));
+    return q;
+}
+
 static CYTHON_INLINE int __Pyx_IterFinish(void) {
 #if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
@@ -15079,163 +26995,6 @@ static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t ori
     return 1;
 }
 
-#if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
-                        CYTHON_UNUSED PyObject *cause) {
-    Py_XINCREF(type);
-    if (!value || value == Py_None)
-        value = NULL;
-    else
-        Py_INCREF(value);
-    if (!tb || tb == Py_None)
-        tb = NULL;
-    else {
-        Py_INCREF(tb);
-        if (!PyTraceBack_Check(tb)) {
-            PyErr_SetString(PyExc_TypeError,
-                "raise: arg 3 must be a traceback or None");
-            goto raise_error;
-        }
-    }
-    if (PyType_Check(type)) {
-#if CYTHON_COMPILING_IN_PYPY
-        if (!value) {
-            Py_INCREF(Py_None);
-            value = Py_None;
-        }
-#endif
-        PyErr_NormalizeException(&type, &value, &tb);
-    } else {
-        if (value) {
-            PyErr_SetString(PyExc_TypeError,
-                "instance exception may not have a separate value");
-            goto raise_error;
-        }
-        value = type;
-        type = (PyObject*) Py_TYPE(type);
-        Py_INCREF(type);
-        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
-            PyErr_SetString(PyExc_TypeError,
-                "raise: exception class must be a subclass of BaseException");
-            goto raise_error;
-        }
-    }
-    __Pyx_ErrRestore(type, value, tb);
-    return;
-raise_error:
-    Py_XDECREF(value);
-    Py_XDECREF(type);
-    Py_XDECREF(tb);
-    return;
-}
-#else
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
-    PyObject* owned_instance = NULL;
-    if (tb == Py_None) {
-        tb = 0;
-    } else if (tb && !PyTraceBack_Check(tb)) {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: arg 3 must be a traceback or None");
-        goto bad;
-    }
-    if (value == Py_None)
-        value = 0;
-    if (PyExceptionInstance_Check(type)) {
-        if (value) {
-            PyErr_SetString(PyExc_TypeError,
-                "instance exception may not have a separate value");
-            goto bad;
-        }
-        value = type;
-        type = (PyObject*) Py_TYPE(value);
-    } else if (PyExceptionClass_Check(type)) {
-        PyObject *instance_class = NULL;
-        if (value && PyExceptionInstance_Check(value)) {
-            instance_class = (PyObject*) Py_TYPE(value);
-            if (instance_class != type) {
-                if (PyObject_IsSubclass(instance_class, type)) {
-                    type = instance_class;
-                } else {
-                    instance_class = NULL;
-                }
-            }
-        }
-        if (!instance_class) {
-            PyObject *args;
-            if (!value)
-                args = PyTuple_New(0);
-            else if (PyTuple_Check(value)) {
-                Py_INCREF(value);
-                args = value;
-            } else
-                args = PyTuple_Pack(1, value);
-            if (!args)
-                goto bad;
-            owned_instance = PyObject_Call(type, args, NULL);
-            Py_DECREF(args);
-            if (!owned_instance)
-                goto bad;
-            value = owned_instance;
-            if (!PyExceptionInstance_Check(value)) {
-                PyErr_Format(PyExc_TypeError,
-                             "calling %R should have returned an instance of "
-                             "BaseException, not %R",
-                             type, Py_TYPE(value));
-                goto bad;
-            }
-        }
-    } else {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: exception class must be a subclass of BaseException");
-        goto bad;
-    }
-#if PY_VERSION_HEX >= 0x03030000
-    if (cause) {
-#else
-    if (cause && cause != Py_None) {
-#endif
-        PyObject *fixed_cause;
-        if (cause == Py_None) {
-            fixed_cause = NULL;
-        } else if (PyExceptionClass_Check(cause)) {
-            fixed_cause = PyObject_CallObject(cause, NULL);
-            if (fixed_cause == NULL)
-                goto bad;
-        } else if (PyExceptionInstance_Check(cause)) {
-            fixed_cause = cause;
-            Py_INCREF(fixed_cause);
-        } else {
-            PyErr_SetString(PyExc_TypeError,
-                            "exception causes must derive from "
-                            "BaseException");
-            goto bad;
-        }
-        PyException_SetCause(value, fixed_cause);
-    }
-    PyErr_SetObject(type, value);
-    if (tb) {
-#if CYTHON_COMPILING_IN_PYPY
-        PyObject *tmp_type, *tmp_value, *tmp_tb;
-        PyErr_Fetch(tmp_type, tmp_value, tmp_tb);
-        Py_INCREF(tb);
-        PyErr_Restore(tmp_type, tmp_value, tb);
-        Py_XDECREF(tmp_tb);
-#else
-        PyThreadState *tstate = PyThreadState_GET();
-        PyObject* tmp_tb = tstate->curexc_traceback;
-        if (tb != tmp_tb) {
-            Py_INCREF(tb);
-            tstate->curexc_traceback = tb;
-            Py_XDECREF(tmp_tb);
-        }
-#endif
-    }
-bad:
-    Py_XDECREF(owned_instance);
-    return;
-}
-#endif
-
 static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
 #if PY_VERSION_HEX >= 0x02070000
     PyObject *ob = PyCapsule_New(vtable, 0, 0);
@@ -15516,148 +27275,6 @@ bad:
     Py_XDECREF(py_frame);
 }
 
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
-    const int neg_one = (int) -1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (is_unsigned) {
-        if (sizeof(int) < sizeof(long)) {
-            return PyInt_FromLong((long) value);
-        } else if (sizeof(int) <= sizeof(unsigned long)) {
-            return PyLong_FromUnsignedLong((unsigned long) value);
-        } else if (sizeof(int) <= sizeof(unsigned long long)) {
-            return PyLong_FromUnsignedLongLong((unsigned long long) value);
-        }
-    } else {
-        if (sizeof(int) <= sizeof(long)) {
-            return PyInt_FromLong((long) value);
-        } else if (sizeof(int) <= sizeof(long long)) {
-            return PyLong_FromLongLong((long long) value);
-        }
-    }
-    {
-        int one = 1; int little = (int)*(unsigned char *)&one;
-        unsigned char *bytes = (unsigned char *)&value;
-        return _PyLong_FromByteArray(bytes, sizeof(int),
-                                     little, !is_unsigned);
-    }
-}
-
-#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)       \
-    {                                                                     \
-        func_type value = func_value;                                     \
-        if (sizeof(target_type) < sizeof(func_type)) {                    \
-            if (unlikely(value != (func_type) (target_type) value)) {     \
-                func_type zero = 0;                                       \
-                if (is_unsigned && unlikely(value < zero))                \
-                    goto raise_neg_overflow;                              \
-                else                                                      \
-                    goto raise_overflow;                                  \
-            }                                                             \
-        }                                                                 \
-        return (target_type) value;                                       \
-    }
-
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
- #if CYTHON_USE_PYLONG_INTERNALS
-  #include "longintrepr.h"
- #endif
-#endif
-
-static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
-    const int neg_one = (int) -1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-#if PY_MAJOR_VERSION < 3
-    if (likely(PyInt_Check(x))) {
-        if (sizeof(int) < sizeof(long)) {
-            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
-        } else {
-            long val = PyInt_AS_LONG(x);
-            if (is_unsigned && unlikely(val < 0)) {
-                goto raise_neg_overflow;
-            }
-            return (int) val;
-        }
-    } else
-#endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
- #if CYTHON_USE_PYLONG_INTERNALS
-            switch (Py_SIZE(x)) {
-                case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(int, digit, ((PyLongObject*)x)->ob_digit[0]);
-            }
- #endif
-#endif
-            if (unlikely(Py_SIZE(x) < 0)) {
-                goto raise_neg_overflow;
-            }
-            if (sizeof(int) <= sizeof(unsigned long)) {
-                __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong(x))
-            } else if (sizeof(int) <= sizeof(unsigned long long)) {
-                __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong(x))
-            }
-        } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
- #if CYTHON_USE_PYLONG_INTERNALS
-            switch (Py_SIZE(x)) {
-                case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +(((PyLongObject*)x)->ob_digit[0]));
-                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
-            }
- #endif
-#endif
-            if (sizeof(int) <= sizeof(long)) {
-                __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong(x))
-            } else if (sizeof(int) <= sizeof(long long)) {
-                __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong(x))
-            }
-        }
-        {
-#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
-            PyErr_SetString(PyExc_RuntimeError,
-                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
-#else
-            int val;
-            PyObject *v = __Pyx_PyNumber_Int(x);
- #if PY_MAJOR_VERSION < 3
-            if (likely(v) && !PyLong_Check(v)) {
-                PyObject *tmp = v;
-                v = PyNumber_Long(tmp);
-                Py_DECREF(tmp);
-            }
- #endif
-            if (likely(v)) {
-                int one = 1; int is_little = (int)*(unsigned char *)&one;
-                unsigned char *bytes = (unsigned char *)&val;
-                int ret = _PyLong_AsByteArray((PyLongObject *)v,
-                                              bytes, sizeof(val),
-                                              is_little, !is_unsigned);
-                Py_DECREF(v);
-                if (likely(!ret))
-                    return val;
-            }
-#endif
-            return (int) -1;
-        }
-    } else {
-        int val;
-        PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (int) -1;
-        val = __Pyx_PyInt_As_int(tmp);
-        Py_DECREF(tmp);
-        return val;
-    }
-raise_overflow:
-    PyErr_SetString(PyExc_OverflowError,
-        "value too large to convert to int");
-    return (int) -1;
-raise_neg_overflow:
-    PyErr_SetString(PyExc_OverflowError,
-        "can't convert negative value to int");
-    return (int) -1;
-}
-
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
     PyObject *empty_list = 0;
     PyObject *module = 0;
@@ -15731,6 +27348,27 @@ bad:
     return module;
 }
 
+#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)       \
+    {                                                                     \
+        func_type value = func_value;                                     \
+        if (sizeof(target_type) < sizeof(func_type)) {                    \
+            if (unlikely(value != (func_type) (target_type) value)) {     \
+                func_type zero = 0;                                       \
+                if (is_unsigned && unlikely(value < zero))                \
+                    goto raise_neg_overflow;                              \
+                else                                                      \
+                    goto raise_overflow;                                  \
+            }                                                             \
+        }                                                                 \
+        return (target_type) value;                                       \
+    }
+
+#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
+ #if CYTHON_USE_PYLONG_INTERNALS
+  #include "longintrepr.h"
+ #endif
+#endif
+
 static CYTHON_INLINE MPI_Comm __Pyx_PyInt_As_MPI_Comm(PyObject *x) {
     const MPI_Comm neg_one = (MPI_Comm) -1, const_zero = 0;
     const int is_unsigned = neg_one > const_zero;
@@ -15881,7 +27519,102 @@ static CYTHON_INLINE int64_t __Pyx_PyInt_As_int64_t(PyObject *x) {
             PyErr_SetString(PyExc_RuntimeError,
                             "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
 #else
-            int64_t val;
+            int64_t val;
+            PyObject *v = __Pyx_PyNumber_Int(x);
+ #if PY_MAJOR_VERSION < 3
+            if (likely(v) && !PyLong_Check(v)) {
+                PyObject *tmp = v;
+                v = PyNumber_Long(tmp);
+                Py_DECREF(tmp);
+            }
+ #endif
+            if (likely(v)) {
+                int one = 1; int is_little = (int)*(unsigned char *)&one;
+                unsigned char *bytes = (unsigned char *)&val;
+                int ret = _PyLong_AsByteArray((PyLongObject *)v,
+                                              bytes, sizeof(val),
+                                              is_little, !is_unsigned);
+                Py_DECREF(v);
+                if (likely(!ret))
+                    return val;
+            }
+#endif
+            return (int64_t) -1;
+        }
+    } else {
+        int64_t val;
+        PyObject *tmp = __Pyx_PyNumber_Int(x);
+        if (!tmp) return (int64_t) -1;
+        val = __Pyx_PyInt_As_int64_t(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to int64_t");
+    return (int64_t) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to int64_t");
+    return (int64_t) -1;
+}
+
+static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
+    const uint64_t neg_one = (uint64_t) -1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if (sizeof(uint64_t) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(uint64_t, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (uint64_t) val;
+        }
+    } else
+#endif
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
+ #if CYTHON_USE_PYLONG_INTERNALS
+            switch (Py_SIZE(x)) {
+                case  0: return 0;
+                case  1: __PYX_VERIFY_RETURN_INT(uint64_t, digit, ((PyLongObject*)x)->ob_digit[0]);
+            }
+ #endif
+#endif
+            if (unlikely(Py_SIZE(x) < 0)) {
+                goto raise_neg_overflow;
+            }
+            if (sizeof(uint64_t) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(uint64_t) <= sizeof(unsigned long long)) {
+                __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long long, PyLong_AsUnsignedLongLong(x))
+            }
+        } else {
+#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
+ #if CYTHON_USE_PYLONG_INTERNALS
+            switch (Py_SIZE(x)) {
+                case  0: return 0;
+                case  1: __PYX_VERIFY_RETURN_INT(uint64_t,  digit, +(((PyLongObject*)x)->ob_digit[0]));
+                case -1: __PYX_VERIFY_RETURN_INT(uint64_t, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
+            }
+ #endif
+#endif
+            if (sizeof(uint64_t) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT(uint64_t, long, PyLong_AsLong(x))
+            } else if (sizeof(uint64_t) <= sizeof(long long)) {
+                __PYX_VERIFY_RETURN_INT(uint64_t, long long, PyLong_AsLongLong(x))
+            }
+        }
+        {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+            PyErr_SetString(PyExc_RuntimeError,
+                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+            uint64_t val;
             PyObject *v = __Pyx_PyNumber_Int(x);
  #if PY_MAJOR_VERSION < 3
             if (likely(v) && !PyLong_Check(v)) {
@@ -15901,39 +27634,39 @@ static CYTHON_INLINE int64_t __Pyx_PyInt_As_int64_t(PyObject *x) {
                     return val;
             }
 #endif
-            return (int64_t) -1;
+            return (uint64_t) -1;
         }
     } else {
-        int64_t val;
+        uint64_t val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (int64_t) -1;
-        val = __Pyx_PyInt_As_int64_t(tmp);
+        if (!tmp) return (uint64_t) -1;
+        val = __Pyx_PyInt_As_uint64_t(tmp);
         Py_DECREF(tmp);
         return val;
     }
 raise_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "value too large to convert to int64_t");
-    return (int64_t) -1;
+        "value too large to convert to uint64_t");
+    return (uint64_t) -1;
 raise_neg_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "can't convert negative value to int64_t");
-    return (int64_t) -1;
+        "can't convert negative value to uint64_t");
+    return (uint64_t) -1;
 }
 
-static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
-    const uint64_t neg_one = (uint64_t) -1, const_zero = 0;
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
+    const int neg_one = (int) -1, const_zero = 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        if (sizeof(uint64_t) < sizeof(long)) {
-            __PYX_VERIFY_RETURN_INT(uint64_t, long, PyInt_AS_LONG(x))
+        if (sizeof(int) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
         } else {
             long val = PyInt_AS_LONG(x);
             if (is_unsigned && unlikely(val < 0)) {
                 goto raise_neg_overflow;
             }
-            return (uint64_t) val;
+            return (int) val;
         }
     } else
 #endif
@@ -15943,32 +27676,32 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
  #if CYTHON_USE_PYLONG_INTERNALS
             switch (Py_SIZE(x)) {
                 case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(uint64_t, digit, ((PyLongObject*)x)->ob_digit[0]);
+                case  1: __PYX_VERIFY_RETURN_INT(int, digit, ((PyLongObject*)x)->ob_digit[0]);
             }
  #endif
 #endif
             if (unlikely(Py_SIZE(x) < 0)) {
                 goto raise_neg_overflow;
             }
-            if (sizeof(uint64_t) <= sizeof(unsigned long)) {
-                __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, PyLong_AsUnsignedLong(x))
-            } else if (sizeof(uint64_t) <= sizeof(unsigned long long)) {
-                __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long long, PyLong_AsUnsignedLongLong(x))
+            if (sizeof(int) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(int) <= sizeof(unsigned long long)) {
+                __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong(x))
             }
         } else {
 #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
  #if CYTHON_USE_PYLONG_INTERNALS
             switch (Py_SIZE(x)) {
                 case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(uint64_t,  digit, +(((PyLongObject*)x)->ob_digit[0]));
-                case -1: __PYX_VERIFY_RETURN_INT(uint64_t, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
+                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +(((PyLongObject*)x)->ob_digit[0]));
+                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
             }
  #endif
 #endif
-            if (sizeof(uint64_t) <= sizeof(long)) {
-                __PYX_VERIFY_RETURN_INT(uint64_t, long, PyLong_AsLong(x))
-            } else if (sizeof(uint64_t) <= sizeof(long long)) {
-                __PYX_VERIFY_RETURN_INT(uint64_t, long long, PyLong_AsLongLong(x))
+            if (sizeof(int) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong(x))
+            } else if (sizeof(int) <= sizeof(long long)) {
+                __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong(x))
             }
         }
         {
@@ -15976,7 +27709,7 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
             PyErr_SetString(PyExc_RuntimeError,
                             "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
 #else
-            uint64_t val;
+            int val;
             PyObject *v = __Pyx_PyNumber_Int(x);
  #if PY_MAJOR_VERSION < 3
             if (likely(v) && !PyLong_Check(v)) {
@@ -15996,24 +27729,24 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
                     return val;
             }
 #endif
-            return (uint64_t) -1;
+            return (int) -1;
         }
     } else {
-        uint64_t val;
+        int val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (uint64_t) -1;
-        val = __Pyx_PyInt_As_uint64_t(tmp);
+        if (!tmp) return (int) -1;
+        val = __Pyx_PyInt_As_int(tmp);
         Py_DECREF(tmp);
         return val;
     }
 raise_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "value too large to convert to uint64_t");
-    return (uint64_t) -1;
+        "value too large to convert to int");
+    return (int) -1;
 raise_neg_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "can't convert negative value to uint64_t");
-    return (uint64_t) -1;
+        "can't convert negative value to int");
+    return (int) -1;
 }
 
 static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
@@ -16111,6 +27844,32 @@ raise_neg_overflow:
     return (long) -1;
 }
 
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
+    const int neg_one = (int) -1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(int) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(int) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(int) <= sizeof(unsigned long long)) {
+            return PyLong_FromUnsignedLongLong((unsigned long long) value);
+        }
+    } else {
+        if (sizeof(int) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(int) <= sizeof(long long)) {
+            return PyLong_FromLongLong((long long) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(int),
+                                     little, !is_unsigned);
+    }
+}
+
 static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int64_t(int64_t value) {
     const int64_t neg_one = (int64_t) -1, const_zero = 0;
     const int is_unsigned = neg_one > const_zero;
@@ -16596,6 +28355,608 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_long(unsigned long valu
     #endif
 #endif
 
+static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
+    PyObject* fake_module;
+    PyTypeObject* cached_type = NULL;
+    fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI);
+    if (!fake_module) return NULL;
+    Py_INCREF(fake_module);
+    cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name);
+    if (cached_type) {
+        if (!PyType_Check((PyObject*)cached_type)) {
+            PyErr_Format(PyExc_TypeError,
+                "Shared Cython type %.200s is not a type object",
+                type->tp_name);
+            goto bad;
+        }
+        if (cached_type->tp_basicsize != type->tp_basicsize) {
+            PyErr_Format(PyExc_TypeError,
+                "Shared Cython type %.200s has the wrong size, try recompiling",
+                type->tp_name);
+            goto bad;
+        }
+    } else {
+        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
+        PyErr_Clear();
+        if (PyType_Ready(type) < 0) goto bad;
+        if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0)
+            goto bad;
+        Py_INCREF(type);
+        cached_type = type;
+    }
+done:
+    Py_DECREF(fake_module);
+    return cached_type;
+bad:
+    Py_XDECREF(cached_type);
+    cached_type = NULL;
+    goto done;
+}
+
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyThreadState *tstate = PyThreadState_GET();
+    tmp_type = tstate->exc_type;
+    tmp_value = tstate->exc_value;
+    tmp_tb = tstate->exc_traceback;
+    tstate->exc_type = *type;
+    tstate->exc_value = *value;
+    tstate->exc_traceback = *tb;
+#else
+    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
+    PyErr_SetExcInfo(*type, *value, *tb);
+#endif
+    *type = tmp_type;
+    *value = tmp_value;
+    *tb = tmp_tb;
+}
+
+static PyObject *__Pyx_Generator_Next(PyObject *self);
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
+static PyObject *__Pyx_Generator_Close(PyObject *self);
+static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args);
+static PyTypeObject *__pyx_GeneratorType = 0;
+#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
+#define __Pyx_Generator_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
+    PyObject *et, *ev, *tb;
+    PyObject *value = NULL;
+    __Pyx_ErrFetch(&et, &ev, &tb);
+    if (!et) {
+        Py_XDECREF(tb);
+        Py_XDECREF(ev);
+        Py_INCREF(Py_None);
+        *pvalue = Py_None;
+        return 0;
+    }
+    if (unlikely(et != PyExc_StopIteration) &&
+            unlikely(!PyErr_GivenExceptionMatches(et, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    if (likely(et == PyExc_StopIteration)) {
+        if (likely(!ev) || !PyObject_IsInstance(ev, PyExc_StopIteration)) {
+            if (!ev) {
+                Py_INCREF(Py_None);
+                ev = Py_None;
+            }
+            Py_XDECREF(tb);
+            Py_DECREF(et);
+            *pvalue = ev;
+            return 0;
+        }
+    }
+    PyErr_NormalizeException(&et, &ev, &tb);
+    if (unlikely(!PyObject_IsInstance(ev, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    Py_XDECREF(tb);
+    Py_DECREF(et);
+#if PY_VERSION_HEX >= 0x030300A0
+    value = ((PyStopIterationObject *)ev)->value;
+    Py_INCREF(value);
+    Py_DECREF(ev);
+#else
+    {
+        PyObject* args = PyObject_GetAttr(ev, __pyx_n_s_args);
+        Py_DECREF(ev);
+        if (likely(args)) {
+            value = PyObject_GetItem(args, 0);
+            Py_DECREF(args);
+        }
+        if (unlikely(!value)) {
+            __Pyx_ErrRestore(NULL, NULL, NULL);
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+    }
+#endif
+    *pvalue = value;
+    return 0;
+}
+#endif
+static CYTHON_INLINE
+void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
+    PyObject *exc_type = self->exc_type;
+    PyObject *exc_value = self->exc_value;
+    PyObject *exc_traceback = self->exc_traceback;
+    self->exc_type = NULL;
+    self->exc_value = NULL;
+    self->exc_traceback = NULL;
+    Py_XDECREF(exc_type);
+    Py_XDECREF(exc_value);
+    Py_XDECREF(exc_traceback);
+}
+static CYTHON_INLINE
+int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
+    if (unlikely(gen->is_running)) {
+        PyErr_SetString(PyExc_ValueError,
+                        "generator already executing");
+        return 1;
+    }
+    return 0;
+}
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
+    PyObject *retval;
+    assert(!self->is_running);
+    if (unlikely(self->resume_label == 0)) {
+        if (unlikely(value && value != Py_None)) {
+            PyErr_SetString(PyExc_TypeError,
+                            "can't send non-None value to a "
+                            "just-started generator");
+            return NULL;
+        }
+    }
+    if (unlikely(self->resume_label == -1)) {
+        PyErr_SetNone(PyExc_StopIteration);
+        return NULL;
+    }
+    if (value) {
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        if (self->exc_traceback) {
+            PyThreadState *tstate = PyThreadState_GET();
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_XINCREF(tstate->frame);
+            assert(f->f_back == NULL);
+            f->f_back = tstate->frame;
+        }
+#endif
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+    } else {
+        __Pyx_Generator_ExceptionClear(self);
+    }
+    self->is_running = 1;
+    retval = self->body((PyObject *) self, value);
+    self->is_running = 0;
+    if (retval) {
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        if (self->exc_traceback) {
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_CLEAR(f->f_back);
+        }
+#endif
+    } else {
+        __Pyx_Generator_ExceptionClear(self);
+    }
+    return retval;
+}
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_FinishDelegation(__pyx_GeneratorObject *gen) {
+    PyObject *ret;
+    PyObject *val = NULL;
+    __Pyx_Generator_Undelegate(gen);
+    __Pyx_PyGen_FetchStopIterationValue(&val);
+    ret = __Pyx_Generator_SendEx(gen, val);
+    Py_XDECREF(val);
+    return ret;
+}
+static PyObject *__Pyx_Generator_Next(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        ret = Py_TYPE(yf)->tp_iternext(yf);
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, Py_None);
+}
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Send(yf, value);
+        } else {
+            if (value == Py_None)
+                ret = PyIter_Next(yf);
+            else
+                ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value);
+        }
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, value);
+}
+static int __Pyx_Generator_CloseIter(__pyx_GeneratorObject *gen, PyObject *yf) {
+    PyObject *retval = NULL;
+    int err = 0;
+    if (__Pyx_Generator_CheckExact(yf)) {
+        retval = __Pyx_Generator_Close(yf);
+        if (!retval)
+            return -1;
+    } else {
+        PyObject *meth;
+        gen->is_running = 1;
+        meth = PyObject_GetAttr(yf, __pyx_n_s_close);
+        if (unlikely(!meth)) {
+            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                PyErr_WriteUnraisable(yf);
+            }
+            PyErr_Clear();
+        } else {
+            retval = PyObject_CallFunction(meth, NULL);
+            Py_DECREF(meth);
+            if (!retval)
+                err = -1;
+        }
+        gen->is_running = 0;
+    }
+    Py_XDECREF(retval);
+    return err;
+}
+static PyObject *__Pyx_Generator_Close(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject *retval, *raised_exception;
+    PyObject *yf = gen->yieldfrom;
+    int err = 0;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        Py_INCREF(yf);
+        err = __Pyx_Generator_CloseIter(gen, yf);
+        __Pyx_Generator_Undelegate(gen);
+        Py_DECREF(yf);
+    }
+    if (err == 0)
+        PyErr_SetNone(PyExc_GeneratorExit);
+    retval = __Pyx_Generator_SendEx(gen, NULL);
+    if (retval) {
+        Py_DECREF(retval);
+        PyErr_SetString(PyExc_RuntimeError,
+                        "generator ignored GeneratorExit");
+        return NULL;
+    }
+    raised_exception = PyErr_Occurred();
+    if (!raised_exception
+        || raised_exception == PyExc_StopIteration
+        || raised_exception == PyExc_GeneratorExit
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
+    {
+        if (raised_exception) PyErr_Clear();
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+    return NULL;
+}
+static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject *typ;
+    PyObject *tb = NULL;
+    PyObject *val = NULL;
+    PyObject *yf = gen->yieldfrom;
+    if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
+        return NULL;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        Py_INCREF(yf);
+        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
+            int err = __Pyx_Generator_CloseIter(gen, yf);
+            Py_DECREF(yf);
+            __Pyx_Generator_Undelegate(gen);
+            if (err < 0)
+                return __Pyx_Generator_SendEx(gen, NULL);
+            goto throw_here;
+        }
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Throw(yf, args);
+        } else {
+            PyObject *meth = PyObject_GetAttr(yf, __pyx_n_s_throw);
+            if (unlikely(!meth)) {
+                Py_DECREF(yf);
+                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                    gen->is_running = 0;
+                    return NULL;
+                }
+                PyErr_Clear();
+                __Pyx_Generator_Undelegate(gen);
+                gen->is_running = 0;
+                goto throw_here;
+            }
+            ret = PyObject_CallObject(meth, args);
+            Py_DECREF(meth);
+        }
+        gen->is_running = 0;
+        Py_DECREF(yf);
+        if (!ret) {
+            ret = __Pyx_Generator_FinishDelegation(gen);
+        }
+        return ret;
+    }
+throw_here:
+    __Pyx_Raise(typ, val, tb, NULL);
+    return __Pyx_Generator_SendEx(gen, NULL);
+}
+static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_VISIT(gen->closure);
+    Py_VISIT(gen->classobj);
+    Py_VISIT(gen->yieldfrom);
+    Py_VISIT(gen->exc_type);
+    Py_VISIT(gen->exc_value);
+    Py_VISIT(gen->exc_traceback);
+    return 0;
+}
+static int __Pyx_Generator_clear(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_CLEAR(gen->closure);
+    Py_CLEAR(gen->classobj);
+    Py_CLEAR(gen->yieldfrom);
+    Py_CLEAR(gen->exc_type);
+    Py_CLEAR(gen->exc_value);
+    Py_CLEAR(gen->exc_traceback);
+    Py_CLEAR(gen->gi_name);
+    Py_CLEAR(gen->gi_qualname);
+    return 0;
+}
+static void __Pyx_Generator_dealloc(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject_GC_UnTrack(gen);
+    if (gen->gi_weakreflist != NULL)
+        PyObject_ClearWeakRefs(self);
+    if (gen->resume_label > 0) {
+        PyObject_GC_Track(self);
+#if PY_VERSION_HEX >= 0x030400a1
+        if (PyObject_CallFinalizerFromDealloc(self))
+#else
+        Py_TYPE(gen)->tp_del(self);
+        if (self->ob_refcnt > 0)
+#endif
+        {
+            return;
+        }
+        PyObject_GC_UnTrack(self);
+    }
+    __Pyx_Generator_clear(self);
+    PyObject_GC_Del(gen);
+}
+static void __Pyx_Generator_del(PyObject *self) {
+    PyObject *res;
+    PyObject *error_type, *error_value, *error_traceback;
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    if (gen->resume_label <= 0)
+        return ;
+#if PY_VERSION_HEX < 0x030400a1
+    assert(self->ob_refcnt == 0);
+    self->ob_refcnt = 1;
+#endif
+    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
+    res = __Pyx_Generator_Close(self);
+    if (res == NULL)
+        PyErr_WriteUnraisable(self);
+    else
+        Py_DECREF(res);
+    __Pyx_ErrRestore(error_type, error_value, error_traceback);
+#if PY_VERSION_HEX < 0x030400a1
+    assert(self->ob_refcnt > 0);
+    if (--self->ob_refcnt == 0) {
+        return;
+    }
+    {
+        Py_ssize_t refcnt = self->ob_refcnt;
+        _Py_NewReference(self);
+        self->ob_refcnt = refcnt;
+    }
+#if CYTHON_COMPILING_IN_CPYTHON
+    assert(PyType_IS_GC(self->ob_type) &&
+           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
+    _Py_DEC_REFTOTAL;
+#endif
+#ifdef COUNT_ALLOCS
+    --Py_TYPE(self)->tp_frees;
+    --Py_TYPE(self)->tp_allocs;
+#endif
+#endif
+}
+static PyObject *
+__Pyx_Generator_get_name(__pyx_GeneratorObject *self)
+{
+    Py_INCREF(self->gi_name);
+    return self->gi_name;
+}
+static int
+__Pyx_Generator_set_name(__pyx_GeneratorObject *self, PyObject *value)
+{
+    PyObject *tmp;
+#if PY_MAJOR_VERSION >= 3
+    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
+#else
+    if (unlikely(value == NULL || !PyString_Check(value))) {
+#endif
+        PyErr_SetString(PyExc_TypeError,
+                        "__name__ must be set to a string object");
+        return -1;
+    }
+    tmp = self->gi_name;
+    Py_INCREF(value);
+    self->gi_name = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_Generator_get_qualname(__pyx_GeneratorObject *self)
+{
+    Py_INCREF(self->gi_qualname);
+    return self->gi_qualname;
+}
+static int
+__Pyx_Generator_set_qualname(__pyx_GeneratorObject *self, PyObject *value)
+{
+    PyObject *tmp;
+#if PY_MAJOR_VERSION >= 3
+    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
+#else
+    if (unlikely(value == NULL || !PyString_Check(value))) {
+#endif
+        PyErr_SetString(PyExc_TypeError,
+                        "__qualname__ must be set to a string object");
+        return -1;
+    }
+    tmp = self->gi_qualname;
+    Py_INCREF(value);
+    self->gi_qualname = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyGetSetDef __pyx_Generator_getsets[] = {
+    {(char *) "__name__", (getter)__Pyx_Generator_get_name, (setter)__Pyx_Generator_set_name,
+     (char*) PyDoc_STR("name of the generator"), 0},
+    {(char *) "__qualname__", (getter)__Pyx_Generator_get_qualname, (setter)__Pyx_Generator_set_qualname,
+     (char*) PyDoc_STR("qualified name of the generator"), 0},
+    {0, 0, 0, 0, 0}
+};
+static PyMemberDef __pyx_Generator_memberlist[] = {
+    {(char *) "gi_running", T_BOOL, offsetof(__pyx_GeneratorObject, is_running), READONLY, NULL},
+    {0, 0, 0, 0, 0}
+};
+static PyMethodDef __pyx_Generator_methods[] = {
+    {"send", (PyCFunction) __Pyx_Generator_Send, METH_O, 0},
+    {"throw", (PyCFunction) __Pyx_Generator_Throw, METH_VARARGS, 0},
+    {"close", (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
+    {0, 0, 0, 0}
+};
+static PyTypeObject __pyx_GeneratorType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    "generator",
+    sizeof(__pyx_GeneratorObject),
+    0,
+    (destructor) __Pyx_Generator_dealloc,
+    0,
+    0,
+    0,
+#if PY_MAJOR_VERSION < 3
+    0,
+#else
+    0,
+#endif
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
+    0,
+    (traverseproc) __Pyx_Generator_traverse,
+    0,
+    0,
+    offsetof(__pyx_GeneratorObject, gi_weakreflist),
+    0,
+    (iternextfunc) __Pyx_Generator_Next,
+    __pyx_Generator_methods,
+    __pyx_Generator_memberlist,
+    __pyx_Generator_getsets,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030400a1
+    0,
+#else
+    __Pyx_Generator_del,
+#endif
+    0,
+#if PY_VERSION_HEX >= 0x030400a1
+    __Pyx_Generator_del,
+#endif
+};
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure, PyObject *name, PyObject *qualname) {
+    __pyx_GeneratorObject *gen =
+        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
+    if (gen == NULL)
+        return NULL;
+    gen->body = body;
+    gen->closure = closure;
+    Py_XINCREF(closure);
+    gen->is_running = 0;
+    gen->resume_label = 0;
+    gen->classobj = NULL;
+    gen->yieldfrom = NULL;
+    gen->exc_type = NULL;
+    gen->exc_value = NULL;
+    gen->exc_traceback = NULL;
+    gen->gi_weakreflist = NULL;
+    Py_XINCREF(qualname);
+    gen->gi_qualname = qualname;
+    Py_XINCREF(name);
+    gen->gi_name = name;
+    PyObject_GC_Track(gen);
+    return gen;
+}
+static int __pyx_Generator_init(void) {
+    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
+    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
+    __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
+    if (__pyx_GeneratorType == NULL) {
+        return -1;
+    }
+    return 0;
+}
+
 static int __Pyx_check_binary_version(void) {
     char ctversion[4], rtversion[4];
     PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
diff --git a/wrappers/numpy/adios.pyx b/wrappers/numpy/adios.pyx
index cadbf95..125fc2f 100644
--- a/wrappers/numpy/adios.pyx
+++ b/wrappers/numpy/adios.pyx
@@ -1,12 +1,7 @@
-"""
- ADIOS is freely available under the terms of the BSD license described
- in the COPYING file in the top level directory of this source distribution.
+# -*- coding: utf-8 -*-
+"""ADIOS: ADIOS python module
 
- Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
-"""
-"""
- This is a cython file. To generate a CPP file, use the following command:
- $ cython --cplus adios.pyx
+.. moduleauthor:: Jong Choi <choij at ornl.gov>
 """
 
 import numpy as np
@@ -18,6 +13,15 @@ cimport numpy as np
 import cython
 cimport cython
 
+from libc.stdlib cimport malloc, free
+from cpython.string cimport PyString_AsString
+
+cdef char ** to_cstring_array(list_str):
+    cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+    for i in xrange(len(list_str)):
+        ret[i] = PyString_AsString(list_str[i])
+    return ret
+
 ## ====================
 ## ADIOS Exported Functions
 ## ====================
@@ -42,6 +46,7 @@ cdef extern from "adios_types.h":
         adios_string
         adios_complex
         adios_double_complex
+        adios_string_array
 
     ctypedef enum ADIOS_BUFFER_ALLOC_WHEN:
         ADIOS_BUFFER_ALLOC_UNKNOWN
@@ -107,6 +112,13 @@ cdef extern from "adios.h":
                                      ADIOS_DATATYPES type,
                                      char * value,
                                      char * var)
+
+    cdef int adios_define_attribute_byvalue (int64_t group,
+                                             char * name,
+                                             char * path,
+                                             ADIOS_DATATYPES type,
+                                             int nelems,
+                                             void * values)
     
     cdef int adios_select_method (int64_t group,
                                   char * method,
@@ -150,12 +162,6 @@ cdef extern from "adios_selection.h":
 
 cdef extern from "adios_read.h":
     ctypedef enum ADIOS_READ_METHOD:
-        ADIOS_READ_METHOD_BP
-        ADIOS_READ_METHOD_BP_AGGREGATE
-        ADIOS_READ_METHOD_DATASPACES
-        ADIOS_READ_METHOD_DIMES
-        ADIOS_READ_METHOD_FLEXPATH
-        ADIOS_READ_METHOD_ICEE
         pass
 
     ctypedef enum ADIOS_LOCKMODE:
@@ -220,6 +226,13 @@ cdef extern from "adios_read.h":
                                        void * data)
     cdef int adios_perform_reads (const ADIOS_FILE *fp, int blocking)
 
+    cdef int adios_get_attr (ADIOS_FILE *fp,
+                             const char * attrname,
+                             ADIOS_DATATYPES  * type,
+                             int * size,
+                             void ** data)
+    
+    cdef char * adios_type_to_string (ADIOS_DATATYPES type)
 
 ## ====================
 ## ADIOS Enum (public)
@@ -241,6 +254,7 @@ class DATATYPE:
     string = 9
     complex = 10
     double_complex = 11
+    string_array = 12
 
 class FLAG:
     UNKNOWN = 0
@@ -251,7 +265,39 @@ class BUFFER_ALLOC_WHEN:
     UNKNOWN = 0
     NOW = 1
     LATER = 2
+
+class READ_METHOD:
+    BP            = 0 
+    BP_AGGREGATE  = 1
+    DATASPACES    = 3
+    DIMES         = 4
+    FLEXPATH      = 5
+    ICEE          = 6
+
+
+cpdef __parse_index(index, ndim):
+    # Fix index, handling ellipsis and incomplete slices.
+    if not isinstance(index, tuple):
+        index = (index,)
+
+    fixed = []
+    length = len(index)
     
+    for slice_ in index:
+        if slice_ is Ellipsis:
+            fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+        elif isinstance(slice_, (int, long)):
+            fixed.append(slice(slice_, slice_+1, None))
+        else:
+            fixed.append(slice_)
+        length -= 1
+
+    index = tuple(fixed)
+    if len(index) < ndim:
+        index += (slice(None),) * (ndim-len(index))
+
+    return index
+
 ## ====================
 ## ADIOS Write API
 ## ====================
@@ -274,12 +320,15 @@ cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):
     result = adios_group_size(fd_p, data_size, &total_size)
     return total_size
 
-cpdef int write (int64_t fd_p, char * name, np.ndarray val):
+cpdef int write (int64_t fd_p, char * name, val, dtype=None):
     cdef np.ndarray val_
-    if val.flags.contiguous:
-        val_ = val
+    if isinstance(val, (np.ndarray)):
+        if val.flags.contiguous:
+            val_ = val
+        else:
+            val_ = np.array(val, copy=True)
     else:
-        val_ = np.array(val, copy=True)
+        val_ = np.array(val, dtype=dtype)
 
     return adios_write (fd_p, name, <void *> val_.data)
 
@@ -292,6 +341,10 @@ cpdef int write_long (int64_t fd_p, char * name, long val):
 cpdef int write_float (int64_t fd_p, char * name, float val):
     return adios_write (fd_p, name, &val)
 
+cpdef int write_double (int64_t fd_p, char * name, double val):
+    return adios_write (fd_p, name, &val)
+
+
 cpdef int read(int64_t fd_p, char * name, np.ndarray val):
     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
     print "Reading ... ", val.itemsize * val.size, "(bytes)"
@@ -327,13 +380,13 @@ cpdef int64_t declare_group(char * name,
 cpdef int define_var(int64_t group_id,
                      char * name,
                      char * path,
-                     int type,
+                     int atype,
                      char * dimensions = "",
                      char * global_dimensions = "",
                      char * local_offsets = ""):
     return adios_define_var(group_id,
                             name, path,
-                            <ADIOS_DATATYPES> type,
+                            <ADIOS_DATATYPES> atype,
                             dimensions,
                             global_dimensions,
                             local_offsets)
@@ -341,16 +394,59 @@ cpdef int define_var(int64_t group_id,
 cpdef int define_attribute (int64_t group,
                             char * name,
                             char * path,
-                            int type,
+                            int atype,
                             char * value,
                             char * var):
     return adios_define_attribute (group,
                                    name,
                                    path,
-                                   <ADIOS_DATATYPES> type,
+                                   <ADIOS_DATATYPES> atype,
                                    value,
                                    var)
 
+cpdef int define_attribute_byvalue (int64_t group,
+                                    char * name,
+                                    char * path,
+                                    val):
+    cdef np.ndarray val_
+    if isinstance(val, (np.ndarray)):
+        if val.flags.contiguous:
+            val_ = val
+        else:
+            val_ = np.array(val, copy=True)
+    else:
+        val_ = np.array(val)
+
+    atype = np2adiostype(val_.dtype)
+
+    cdef char * pt1
+    cdef char ** pt2
+    if (val_.dtype.char == 'S'):
+        if (val_.size == 1):
+            pt1 = PyString_AsString(val)
+            adios_define_attribute_byvalue (group,
+                                            name,
+                                            path,
+                                            DATATYPE.string,
+                                            1,
+                                            <void *> pt1)
+        else:
+            pt2 = to_cstring_array(val)
+            adios_define_attribute_byvalue (group,
+                                            name,
+                                            path,
+                                            DATATYPE.string_array,
+                                            len(val),
+                                            <void *> pt2)
+            free(pt2)
+    else:
+        adios_define_attribute_byvalue (group,
+                                        name,
+                                        path,
+                                        <ADIOS_DATATYPES> atype,
+                                        val_.size,
+                                        <void *> val_.data)
+
 cpdef int select_method (int64_t group,
                          char * method,
                          char * parameters = "",
@@ -365,34 +461,37 @@ cpdef int select_method (int64_t group,
 ## ADIOS Read API (V2)
 ## ====================
 
-cdef type adios2nptype(ADIOS_DATATYPES t):
-    cdef type ntype = None
+cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):
+    """ strlen apply only to string type """
+    cdef np.dtype ntype = None
     if t == adios_byte:
-        ntype = np.int8
+        ntype = np.dtype(np.int8)
     elif t == adios_short:
-        ntype = np.int16
+        ntype = np.dtype(np.int16)
     elif t == adios_integer:
-        ntype = np.int32
+        ntype = np.dtype(np.int32)
     elif t == adios_long:
-        ntype = np.int64
+        ntype = np.dtype(np.int64)
     elif t == adios_unsigned_byte:
-        ntype = np.uint8
+        ntype = np.dtype(np.uint8)
     elif t == adios_unsigned_short:
-        ntype = np.uint16
+        ntype = np.dtype(np.uint16)
     elif t == adios_unsigned_integer:
-        ntype = np.uint32
+        ntype = np.dtype(np.uint32)
     elif t == adios_unsigned_long:
-        ntype = np.uint64
+        ntype = np.dtype(np.uint64)
     elif t == adios_real:
-        ntype = np.float32
+        ntype = np.dtype(np.float32)
     elif t == adios_double:
-        ntype = np.float64
+        ntype = np.dtype(np.float64)
     elif t == adios_long_double:
-        ntype = np.float128
+        ntype = np.dtype(np.float128)
     elif t == adios_complex:
-        ntype = np.complex64
+        ntype = np.dtype(np.complex64)
     elif t == adios_double_complex:
-        ntype = np.complex128
+        ntype = np.dtype(np.complex128)
+    elif t == adios_string:
+        ntype = np.dtype((np.str_, strlen))
     else:
         ntype = None
 
@@ -413,32 +512,33 @@ cdef printfile(ADIOS_FILE * f):
 
 cdef printvar(ADIOS_VARINFO * v):
     print '%15s : %d' % ('varid', v.varid)
-    print '%15s : %s' % ('type', adios2nptype(v.type))
+    print '%15s : %s' % ('type', adios2npdtype(v.type))
     print '%15s : %d' % ('ndim', v.ndim)
     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])
     print '%15s : %d' % ('nsteps', v.nsteps)
 
 cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):
     if (name == "BP"):
-        method = ADIOS_READ_METHOD_BP
+        method = READ_METHOD.BP
     elif (name == "BP_AGGREGATE"):
-        method = ADIOS_READ_METHOD_BP_AGGREGATE
+        method = READ_METHOD.BP_AGGREGATE
     elif (name == "DATASPACES"):
-        method = ADIOS_READ_METHOD_DATASPACES
+        method = READ_METHOD.DATASPACES
     elif (name == "DIMES"):
-        method = ADIOS_READ_METHOD_DIMES
+        method = READ_METHOD.DIMES
     elif (name == "FLEXPATH"):
-        method = ADIOS_READ_METHOD_FLEXPATH
+        method = READ_METHOD.FLEXPATH
     elif (name == "ICEE"):
-        method = ADIOS_READ_METHOD_ICEE
+        method = READ_METHOD.ICEE
     else:
         print '[WARN] Invalid read method name:', name, '. Use default BP method'
-        method = ADIOS_READ_METHOD_BP
+        method = READ_METHOD.BP
         
     return method
 
-cpdef np2adiostype(type nptype):
-    """ Ignored: int_, intc, intp """
+cpdef np2adiostype(np.dtype nptype):
+    """ Convert Numpy.dtype to Adios Datatype
+    """
 
     cdef atype = DATATYPE.unknown
 
@@ -474,11 +574,16 @@ cpdef np2adiostype(type nptype):
         atype = DATATYPE.complex
     elif (nptype == np.complex128):
         atype = DATATYPE.double_complex
-    elif (nptype == np.str_):
-        atype = DATATYPE.byte
+    elif (nptype.char == 'S'):
+        atype = DATATYPE.string
+    else:
+        atype = DATATYPE.unknown
 
     return atype
 
+cpdef str adiostype2string (ADIOS_DATATYPES type):
+    return str(adios_type_to_string(<ADIOS_DATATYPES> type))
+
 ## ====================
 ## ADIOS Class Definitions for Read
 ## ====================
@@ -496,29 +601,88 @@ cpdef int read_finalize(char * method_name = "BP"):
     cdef method = str2adiosreadmethod(method_name)
     return adios_read_finalize_method (method)
 
-""" Python class for ADIOS_FILE structure """
+## Python class for ADIOS_FILE structure
 cdef class file:
-    """ Private Memeber """
+    """
+    file class for Adios file read and write.
+
+    Args:
+        fname (str): filename.
+        method_name (str, optional): Adios read method (default: 'BP').
+        comm (MPI_Comm, optional): MPI_comm for parallel read/write (default: MPI_COMM_WORLD).
+        is_stream (bool, optional): Set True if use stream reader (default: False).
+        lock_mode (int, optional): ADIOS_LOCKMODE for stream reader (default: ADIOS_LOCKMODE_ALL).
+        timeout_sec (float, optional): Timeout seconds for stream reader (default: 0.0).
+
+    Example:
+    
+    >>> import adios as ad
+    >>> f = ad.file('adiosfile.bp')
+    
+    """
+    
     cpdef ADIOS_FILE * fp
-
-    """ Public Memeber """
-    cpdef public bytes name
-    cpdef public int nvars
-    cpdef public int nattrs
-    cpdef public int current_step
-    cpdef public int last_step
-    cpdef public int endianness
-    cpdef public int version
-    cpdef public int file_size
+    cpdef bytes name
+    cpdef int nvars
+    cpdef int nattrs
+    cpdef int current_step
+    cpdef int last_step
+    cpdef int endianness
+    cpdef int version
+    cpdef int file_size
+    cpdef bint is_stream
     
+    ## Public Memeber
     cpdef public dict var
     cpdef public dict attr
 
-    cpdef public bint is_stream
+    property name:
+        """ The filename (or stream name) associated with. """
+        def __get__(self):
+            return self.name
+
+    property nvars:
+        """ The number of variables. """
+        def __get__(self):
+            return self.nvars
+
+    property nattrs:
+        """ The number of attributes. """
+        def __get__(self):
+            return self.nattrs
+
+    property current_step:
+        """ The current timestep index. """
+        def __get__(self):
+            return self.current_step
+
+    property last_step:
+        """ The last timestep index. """
+        def __get__(self):
+            return self.last_step
+
+    property endianness:
+        """ The endianness of the stored data. """
+        def __get__(self):
+            return self.endianness
+
+    property version:
+        """ The version of Adios. """
+        def __get__(self):
+            return self.version
+        
+    property file_sizec:
+        """ The size of Adios file. """
+        def __get__(self):
+            return self.file_size
+
+    property is_stream:
+        """ Indicating reader type; file reader or stream reader """
+        def __get__(self):
+            return self.is_stream
 
-    """ Initialization. Call adios_read_open and populate public members """
     def __init__(self, char * fname,
-                 char * method_name = "BP",
+                 char * method_name = 'BP',
                  MPI_Comm comm = MPI_COMM_WORLD,
                  is_stream = False,
                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
@@ -546,43 +710,147 @@ cdef class file:
         self.version = self.fp.version
         self.file_size = self.fp.file_size
     
-        for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:
-            self.var[varname] = var(self, varname)
+        for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:
+            self.var[name] = var(self, name)
+
+        for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:
+            self.attr[name] = attr(self, name)
 
     def __del__(self):
-            self.close()
+        """ Close file on destruction. """
+        self.close()
             
-    """ Call adios_read_close """
     cpdef close(self):
+        """ Close the open file. """
         assert self.fp != NULL, 'Not an open file'
         adios_read_close(self.fp)
         self.fp = NULL
         
-    """ Print self """
     cpdef printself(self):
+        """ Print native ADIOS_FILE structure. """
         assert self.fp != NULL, 'Not an open file'
         print '=== AdiosFile ==='
         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
         printfile(self.fp)
 
     cpdef advance(self, int last = 0, float timeout_sec = 0.0):
-        return adios_advance_step(self.fp, last, timeout_sec)
+        """
+        Advance a timestep for stream reader.
+
+        Args:
+            last (int, optional): last timestep index (default: 0).
+            timeout_sec (float, optional): timeout seconds (default: 0.0).
+
+        Returns:
+            int: 0 if successful, non-zero otherwise.
+        """
+        val = adios_advance_step(self.fp, last, timeout_sec)
+        if (val >= 0):
+            self.current_step = self.fp.current_step
+            self.last_step = self.fp.last_step
+
+            for v in self.var.values():
+                v.advance()
+                
+        return val
+        
+    def __getitem__(self, varname):
+        """
+        Return Adios variable.
+
+        Args:
+            varname (str): variable name.
+
+        Raises:
+            KeyError: If no varname exists.
+
+        """
+        if not isinstance(varname, tuple):
+            varname = (varname,)
+
+        if len(varname) > 1:
+            raise KeyError(varname)
+        
+        for key_ in varname:
+            if not isinstance(key_, str):
+                raise TypeError("Unhashable type")
+
+            if key_ in self.var.keys():
+                return self.var.get(key_)
+            elif key_ in self.attr.keys():
+                return self.attr.get(key_)
+            else:
+                raise KeyError(key_)
+        
+    def __repr__(self):
+        """ Return string representation. """
+        return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+                "current_step=%r, last_step=%r, file_size=%r)") % \
+                (self.fp.path,
+                 self.nvars,
+                 self.var.keys(),
+                 self.nattrs,
+                 self.attr.keys(),
+                 self.current_step,
+                 self.last_step,
+                 self.file_size)
 
-""" Python class for ADIOS_VARINFO structure """
 cdef class var:
-    """ Private Memeber """
+    """
+    Adios variable class.
+
+    Unlike attributes whose values are populated on initialization,
+    variable's values will be returned by explicitly calling read() or
+    array access interface ([]).  
+
+    Args:
+        file (file): Associated file class
+        name (str): variable name
+
+    Note:
+        Users do not need to create this class manually.
+    """
+    
     cdef file file
     cdef ADIOS_VARINFO * vp
 
-    """ Public Memeber """
-    cpdef public bytes name
-    cpdef public int varid
-    cpdef public type type
-    cpdef public int ndim
-    cpdef public tuple dims
-    cpdef public int nsteps
+    cpdef bytes name
+    cpdef int varid
+    cpdef np.dtype dtype
+    cpdef int ndim
+    cpdef tuple dims
+    cpdef int nsteps
+
+    property name:
+        """ The variable name. """
+        def __get__(self):
+            return self.name
+    
+    property varid:
+        """ Internal variable id. """
+        def __get__(self):
+            return self.varid
+    
+    property dtype:
+        """ Variable type as in numpy.dtype. """
+        def __get__(self):
+            return self.dtype
+
+    property ndim:
+        """ The number of dimensions of the variable. """
+        def __get__(self):
+            return self.ndim
+
+    property dims:
+        """ The shape of the variable. """
+        def __get__(self):
+            return self.dims
+
+    property nsteps:
+        """ The number of time steps of the variable. """
+        def __get__(self):
+            return self.nsteps
 
-    """ Initialization. Call adios_inq_var and populate public members """
     def __init__(self, file file, char * name):
         self.file = file
         self.vp = NULL
@@ -592,26 +860,87 @@ cdef class var:
         assert self.vp != NULL, 'Not a valid var'
 
         self.name = name
-        self.varid = self.vp.varid                
-        self.type = adios2nptype(self.vp.type)
+        self.varid = self.vp.varid
         self.ndim = self.vp.ndim                 
         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
         self.nsteps = self.vp.nsteps
-        
+
+        if self.vp.type == DATATYPE.string:
+            self.dtype = adios2npdtype(self.vp.type, len(<char*> self.vp.value))
+        else:
+            self.dtype = adios2npdtype(self.vp.type)
+
     def __del__(self):
         self.close()
 
-    """ Call adios_free_varinfo """
     cpdef close(self):
+        """ Close and free variable information """
         assert self.vp != NULL, 'Not an open var'
         adios_free_varinfo(self.vp)
         self.vp = NULL
 
-    """ Call adios_schedule_read and adios_perform_reads """
-    cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):
-        assert self.type is not None, 'Data type is not supported yet'
-        if (self.nsteps > 0):
-            assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'
+    cpdef advance(self):
+        """ Update variable information after the stream advanced """
+        self.vp = adios_inq_var(self.file.fp, self.name)
+        assert self.vp != NULL, 'Not a valid var'
+        self.nsteps = self.vp.nsteps
+
+    cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):
+        """ Perform read.
+
+        Read data from an ADIOS BP file. Subset reading is
+        supported. Without any options, this will read out a whole
+        data.
+
+        Args:
+            offset (tuple of int, optional): offset (default: ())
+            count (tuple of int, optional): count (default: ())
+            from_steps (int, optional): starting step index (default: None)
+            nsteps (int, optional): number of time dimensions (default: None)
+            fill (value, optional): default fill value (default: 0)
+
+        Returns:
+            NumPy ndarray
+            
+        Raises:
+            IndexError: If dimension is mismatched or out of the boundary.
+
+
+        Example:
+
+        The following command will read the full data:
+        
+        >>> var.read()
+
+        which is equvalent to
+
+        >>> var[]
+
+
+        The following command is for subset reading:
+        
+        >>> var.read(offset=(1,2), count=(3,4))
+
+        which will return an 3x4 array offset by (1,2) in the original
+        data. With Numpy's array notation, the following command does the same job:
+
+        >>> var[1:4, 2:6]
+
+        Similarly, the following two commands are same:
+
+        >>> var.read(count=(5,6))
+        >>> var[:5, :6]
+        
+        """
+        if from_steps is None:
+            from_steps = 0 ##self.file.current_step
+
+        if nsteps is None:
+            nsteps = self.file.last_step - from_steps + 1
+
+        assert self.dtype is not None, 'Data type is not supported yet'
+        if (self.nsteps > 0) and (from_steps + nsteps > self.nsteps):
+            raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))
         
         cdef list lshape = [self.vp.dims[i] for i in range(self.vp.ndim)]
         cdef np.ndarray npshape = np.array(lshape, dtype=np.int64)
@@ -629,36 +958,520 @@ cdef class var:
         else:
             npcount = np.array(count, dtype=np.int64)
 
-        assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'
-        assert npshape.ndim == npcount.ndim, 'Count dimension mismatch.'
-        assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'
+        if npshape.ndim != npoffset.ndim:
+            raise IndexError('Offset dimension mismatch (offset dim: %r)' % (npoffset.ndim))
+
+        if npshape.ndim != npcount.ndim:
+            raise IndexError('Count dimension mismatch (count dim: %r)' % (npcount.ndim))
+
+        if (npshape < npcount + npoffset).any():
+            raise IndexError('Requested is larger than the shape.')
 
         shape = list(npcount)
         if (nsteps > 1):
             shape.insert(0, nsteps)
-        cdef np.ndarray var = np.zeros(shape, dtype=self.type)
+        cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)
+        
+        if len(shape) > 0:
+            var[:] = fill
 
         cdef ADIOS_SELECTION * sel
         sel = adios_selection_boundingbox (self.vp.ndim, <uint64_t *> npoffset.data, <uint64_t *> npcount.data)
-        
+
+        ##print 'npoffset', npoffset
+        ##print 'npcount', npcount
+
         adios_schedule_read_byid (self.file.fp, sel, self.vp.varid, from_steps, nsteps, <void *> var.data)
         adios_perform_reads(self.file.fp, 1)
 
-        return var
+        ## Try not to return as scalar to be consistent
+        ##if (var.ndim == 0):
+        ##    return np.asscalar(var)
+        ##else:
+        ##    return var
+        return np.squeeze(var)
 
-    """ Print self """
     cpdef printself(self):
+        """ Print native ADIOS_VARINFO structure. """
         assert self.vp != NULL, 'Not an open variable'
         print '=== AdiosVariable ==='
         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)
         printvar(self.vp)
+        
+    def __repr__(self):
+        return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+               (self.varid,
+                self.dtype,
+                self.ndim,
+                self.dims,
+                self.nsteps)
+
+    def __getitem__(self, index):
+        ndim_ = self.ndim
+        if (self.nsteps) > 1: ndim_ += 1
+
+        index_ = __parse_index(index, ndim_)
 
+        if (ndim_ > 0) and (len(index_) > ndim_):
+            raise IndexError("Too many indices for data")
+
+        if (ndim_ == 0) and (len(index_) > 1):
+            raise IndexError("Too many indices for data")
+        
+        for slice_ in index_:
+            if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+                raise IndexError("Step size (%d) is not supported." % (slice_.step))
+            if isinstance(slice_, str):
+                raise IndexError("Name index (%r) is not supported." % (slice_))
+        
+        if (self.nsteps) > 1:
+            dims_ = list(self.dims)
+            dims_.insert(0, self.nsteps)
+            indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))
+            z = zip(*indices)
+
+            from_steps_ = z[0][0]
+            nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+            offset_ = z[0][1:]
+            count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+        else:
+            indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))
+            z = zip(*indices)
+
+            if len(z) == 0:
+                from_steps_ = 0
+                nsteps_ = self.nsteps
+                offset_ = ()
+                count_ = ()
+            else:
+                from_steps_ = 0
+                nsteps_ = self.nsteps
+                offset_ = z[0]
+                count_ = tuple((np.subtract(z[1], z[0])-1)%self.dims+1)
+
+        ##print "from_steps", from_steps_
+        ##print "nsteps", nsteps_
+        ##print "offset", offset_
+        ##print "count", count_
+        
+        return self.read(offset=offset_,
+                         count=count_,
+                         from_steps=from_steps_,
+                         nsteps=nsteps_)
+
+cdef class attr:
+    """
+    Adios attribute class.
+    
+    Attribute values are loaded on initialization.
+
+    Args:
+        attr_name (str): attribute name
+
+    Raises:
+        KeyError: If no attribute name exists.
+
+    Note:
+        Users do not need to create this class manually.        
+    """
+    cdef file file
+    cpdef bytes name
+    cpdef np.dtype dtype
+    cdef np.ndarray value
+
+    property name:
+        """ The attribute name """
+        def __get__(self):
+            return self.name
+
+    property dtype:
+        """ The attribute type as in numpy.dtype """
+        def __get__(self):
+            return self.dtype
+
+    property value:
+        """ The attribute's value """
+        def __get__(self):
+            return self.value
+
+    def __init__(self, file file, char * name):
+        self.file = file
+        self.name = name
+
+        cdef int64_t p
+        cdef ADIOS_DATATYPES atype
+        cdef int bytes
+        cdef list strlist
+        cdef int len
+        
+        err = adios_get_attr(self.file.fp, self.name, &atype, &bytes, <void **> &p)
+
+        if err == 0:
+            if atype == DATATYPE.string:
+                bytes = bytes - 1 ## Remove the NULL terminal                
+            self.dtype = adios2npdtype(atype, bytes)
+            if atype == DATATYPE.string_array:
+                strlist = list()
+                len = bytes/sizeof(p)
+                for i in range(len):
+                    strlist.append((<char **>p)[i])
+                self.value = np.array(strlist)
+                self.dtype = self.value.dtype
+                    
+            elif self.dtype is None:
+                print 'Warning: No support yet: %s (type=%d, bytes=%d)' % \
+                      (self.name, atype, bytes)
+            else:
+                len = bytes/self.dtype.itemsize
+                if len == 1:
+                    self.value = np.array(len, dtype=self.dtype)
+                else:
+                    self.value = np.zeros(len, dtype=self.dtype)
+                self.value.data = <char *> p
+        else:
+            raise KeyError(name)
+
+    def __repr__(self):
+        return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \
+               (self.name, self.dtype, self.value)
+
+
+## Helper dict
+cdef class smartdict(dict):
+    cdef factory
+    def __init__(self, factory):
+        dict.__init__(self)
+        self.factory = factory
+        
+    def __setitem__(self, key, value):
+        if key in dict.keys(self):
+            dict.__setitem__(self, key, value)
+        else:
+            self.factory(key, value)
+
+cdef class writer:
+    """
+    writer class for Adios write.
+
+    Args:
+        fname (str): filename.
+        is_noxml (bool, optional): Set True if use noxml APIs (default: True).
+        comm (MPI_Comm, optional): MPI_comm for parallel read/write (default: MPI_COMM_WORLD).
+
+    Example:
+    
+    >>> import adios as ad
+    >>> f = ad.writer('adiosfile.bp')
+    
+    """
+    
+    cdef int64_t gid
+    cpdef bytes fname
+    cpdef bytes gname
+    cpdef bytes method
+    cpdef bytes method_params
+    cpdef bint is_noxml
+    cpdef MPI_Comm comm
+
+    cpdef dict var
+    cpdef dict attr
+
+    property fname:
+        """ The filename to write. """
+        def __get__(self):
+            return self.fname
+
+    property gname:
+        """ The groupname associated with the file. """
+        def __get__(self):
+            return self.gname
+        
+    property is_noxml:
+        """ Boolean to indicate using No-XML or not. """
+        def __get__(self):
+            return self.is_noxml
+        
+    property var:
+        """ Dictionary of variables to write. """
+        def __get__(self):
+            return self.var
+
+    property attr:
+        """ Dictionary of attributes to write. """
+        def __get__(self):
+            return self.attr
+        
+    def __init__(self,char * fname,
+                 bint is_noxml = True,
+                 MPI_Comm comm = MPI_COMM_WORLD):
+        self.fname = fname
+        self.method = <bytes>""
+        self.method_params = <bytes>""
+        self.is_noxml = is_noxml
+        self.comm = comm
+        self.var = dict()
+        self.attr = dict()
+
+    ##def __var_factory__(self, name, value):
+    ##    print "var_factory:", name, value
+    ##
+    ##def __attr_factory__(self, name, value):
+    ##    print "attr_factory:", name, value
+
+    def declare_group(self, char * gname,
+                      char * method = "POSIX1",
+                      char * method_params = ""):
+        """
+        Define a group associated with the file.
+
+        Args:
+            gname (str): group name.
+            method (str, optional): Adios write method (default: 'POSIX1')
+            method_params (str, optional): parameters for the write method (default: '')
+
+        Example:
+
+        >>>  fw.declare_group('group', method='MPI_, method_params='verbose=3')
+        
+        """
+        self.gid = declare_group(gname, "", 1)
+        self.gname = gname
+        self.method = method
+        self.method_params = method_params
+        select_method(self.gid, self.method, self.method_params, "")
+
+    def define_var(self, char * varname,
+                   ldim = tuple(),
+                   gdim = tuple(),
+                   offset = tuple()):
+        """
+        Define a variable associated with the file.
+
+        Args:
+            varname (str): variable name.
+            ldim (tuple, optional): local dimension (default: tuple())
+            gdim (tuple, optional): global dimension (default: tuple())
+            offset (tuple, optional): offset (default: tuple())
+
+        Example:
+
+        Write 'temperature' variable of size of 2x3 array.
+
+        >>>  fw.define_var ('temperature', (2,3))
+        
+        """
+        self.var[varname] = varinfo(varname, ldim, gdim, offset)
+
+    def define_attr(self, char * attrname):
+        """
+        Define attribute in the file.
+
+        Args:
+            attrname (str): attribute name.
+        """
+
+        self.attr[attrname] = attrinfo(attrname, is_static=True)
+
+    def define_dynamic_attr(self, char * attrname,
+                            char * varname,
+                            dtype):
+        self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)
+    def __setitem__(self, name, val):
+        if self.var.has_key(name):
+            self.var[name].value = val
+        elif self.attr.has_key(name):
+            self.attr[name].value = val
+        else:
+            self.var[name] = val
+        
+    def __getitem__(self, name):
+        if self.var.has_key(name):
+            return self.var[name].value
+        elif self.attr.has_key(name):
+            return self.attr[name].value
+        else:
+            raise KeyError(name)
+    
+    def close(self):
+        """
+        Write variables and attributes to a file and close the writer.
+        """
+        fd = open(self.gname, self.fname, "w")
+
+        extra_var = dict()
+        extra_attr = dict()
+
+        for key, val in self.var.iteritems():
+            if not isinstance(val, varinfo):
+                n = np.array(val)
+                extra_var[key] = varinfo(key, n.shape)
+                extra_var[key].value = val
+            else:
+                if self.is_noxml: val.define(self.gid)
+
+        for key, val in extra_var.iteritems():
+            if self.is_noxml: val.define(self.gid)
+            self.var[key] = val
+
+        for key, val in self.attr.iteritems():
+            if not isinstance(val, attrinfo):
+                extra_attr[key] = attrinfo(key, val, np.array(val).dtype)
+            else:
+                if self.is_noxml: val.define(self.gid)
+
+        for key, val in extra_attr.iteritems():
+            if self.is_noxml: val.define(self.gid)
+
+        groupsize = 0
+        for var in self.var.values():
+            groupsize = groupsize + var.bytes()
+
+        set_group_size(fd, groupsize)
+
+        for var in self.var.values():
+            var.write(fd)
+            
+        close(fd)
+    
+    def __repr__(self):
+        return ("AdiosWriter (fname=%r, gname=%r, "
+                "method=%r, method_params=%r, var=%r, attr=%r)") % \
+                (self.fname,
+                 self.gname,
+                 self.method,
+                 self.method_params,
+                 self.var.keys(),
+                 self.attr.keys())
+
+cdef class attrinfo:
+    cdef bytes name
+    cdef bint is_static # Use define_byvalue, if True
+    cdef dtype
+    cdef value # Either varname or nparray
+
+    property name:
+        def __get__(self):
+            return self.name
+
+    property is_static:
+        def __get__(self):
+            return self.is_static
+
+    property dtype:
+        def __get__(self):
+            return self.dtype
+        
+    property value:
+        def __get__(self):
+            return self.value
+        
+        def __set__(self, value):
+            self.value = value
+        
+    def __init__(self, char * name,
+                 value = None,
+                 dtype = None,
+                 bint is_static = True):
+        self.name = name
+        self.value = value
+        self.dtype = dtype
+        self.is_static = is_static
+
+    def define(self, int64_t gid):
+        if self.is_static:
+            if self.value is None:
+                raise TypeError("Value is none")
+            
+            define_attribute_byvalue(gid, self.name, "", self.value)
+        else:
+            ##atype = np2adiostype(np.dtype(self.dtype))
+            ##define_attribute(gid, self.name, "",
+            ##                 atype, "", str(self.value))
+            raise NotImplementedError            
+        
+    def __repr__(self):
+        return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+                (self.name,
+                 self.is_static,
+                 self.value,
+                 self.dtype)
+
+cdef class varinfo:
+    cdef bytes name
+    cdef public ldim
+    cdef public gdim
+    cdef public offset
+    cdef public value
+
+    def __init__(self, char * name,
+                 ldim = tuple(),
+                 gdim = tuple(),
+                 offset = tuple()):
+        self.name = name
+        self.ldim = ldim
+        self.gdim = gdim
+        self.offset = offset
+        
+    def define(self, int64_t gid):
+        if self.value is None:
+            raise TypeError("Value is none")
+
+        ldim_ = self.ldim
+        if isinstance(self.ldim, (tuple, list)):
+            ldim_ = tuple(self.ldim)
+
+        gdim_ = self.gdim
+        if isinstance(self.gdim, (tuple, list)):
+            gdim_ = tuple(self.gdim)
+
+        offset_ = self.offset
+        if isinstance(self.offset, (tuple, list)):
+            offset_ = tuple(self.offset)
+
+        val_ = self.value
+        if not isinstance(self.value, (np.ndarray)):
+            val_ = np.array(self.value)
+
+        atype = np2adiostype(val_.dtype)
+        ## No space allowed
+        define_var(gid, self.name, "", atype,
+                   str(ldim_).replace(' ', '').strip('(,)'),
+                   str(gdim_).replace(' ', '').strip('(,)'),
+                   str(offset_).replace(' ', '').strip('(,)'))
+
+    def bytes(self):
+        val_ = self.value
+        if not isinstance(self.value, (np.ndarray)):
+            val_ = np.array(self.value)
+        
+        return val_.size * val_.itemsize
+    
+    def write(self, int64_t fd): 
+        val_ = self.value
+        if not isinstance(self.value, (np.ndarray)):
+            val_ = np.array(self.value)
+        
+        write(fd, self.name, val_)
+    
+    def __repr__(self):
+        return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \
+                (self.name, self.ldim, self.gdim, self.offset, self.value)
+        
 ## ====================
 ## ADIOS Global functions
 ## ====================
 
 def readvar(fname, varname):
+    """ Retrieve a variable value from an Adios file.
+
+    Args:
+        fname (str): Adios file name
+        varname (str): Variable name to retrieve
+
+    Returns:
+        NumPy ndarray: variable value
+    """
     f = file(fname, comm=MPI_COMM_SELF)
     if not f.var.has_key(varname):
         print "No valid variable"
@@ -668,6 +1481,14 @@ def readvar(fname, varname):
     return v.read(from_steps=0, nsteps=v.nsteps)
 
 def bpls(fname):
+    """ Return meta data of an Adios file as a Python dictionary object.
+
+    Args:
+        fname (str): Adios file name
+
+    Returns:
+        dict: Adios file meta data
+    """
     f = file(fname, comm=MPI_COMM_SELF)
     return {'nvars': f.nvars,
             'nattrs': f.nattrs,
diff --git a/wrappers/numpy/adios_mpi.cpp b/wrappers/numpy/adios_mpi.cpp
index c8671db..ffaa23b 100644
--- a/wrappers/numpy/adios_mpi.cpp
+++ b/wrappers/numpy/adios_mpi.cpp
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.21.1 */
+/* Generated by Cython 0.22 */
 
 #define PY_SSIZE_T_CLEAN
 #ifndef CYTHON_USE_PYLONG_INTERNALS
@@ -19,7 +19,7 @@
 #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000)
     #error Cython requires Python 2.6+ or Python 3.2+.
 #else
-#define CYTHON_ABI "0_21_1"
+#define CYTHON_ABI "0_22"
 #include <stddef.h>
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
@@ -54,7 +54,7 @@
 #define CYTHON_COMPILING_IN_PYPY 0
 #define CYTHON_COMPILING_IN_CPYTHON 1
 #endif
-#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
 #define Py_OptimizeFlag 0
 #endif
 #define __PYX_BUILD_PY_SSIZE_T "n"
@@ -203,11 +203,22 @@ static CYTHON_INLINE float __PYX_NAN() {
   return value;
 }
 #endif
+#define __Pyx_void_to_None(void_result) (void_result, Py_INCREF(Py_None), Py_None)
 #ifdef __cplusplus
 template<typename T>
 void __Pyx_call_destructor(T* x) {
     x->~T();
 }
+template<typename T>
+class __Pyx_FakeReference {
+  public:
+    __Pyx_FakeReference() : ptr(NULL) { }
+    __Pyx_FakeReference(T& ref) : ptr(&ref) { }
+    T *operator->() { return ptr; }
+    operator T&() { return *ptr; }
+  private:
+    T *ptr;
+};
 #endif
 
 
@@ -299,11 +310,11 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
 #endif
 #define __Pyx_PyObject_AsSString(s)    ((signed char*) __Pyx_PyObject_AsString(s))
 #define __Pyx_PyObject_AsUString(s)    ((unsigned char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_FromUString(s)  __Pyx_PyObject_FromString((const char*)s)
-#define __Pyx_PyBytes_FromUString(s)   __Pyx_PyBytes_FromString((const char*)s)
-#define __Pyx_PyByteArray_FromUString(s)   __Pyx_PyByteArray_FromString((const char*)s)
-#define __Pyx_PyStr_FromUString(s)     __Pyx_PyStr_FromString((const char*)s)
-#define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((const char*)s)
+#define __Pyx_PyObject_FromCString(s)  __Pyx_PyObject_FromString((const char*)s)
+#define __Pyx_PyBytes_FromCString(s)   __Pyx_PyBytes_FromString((const char*)s)
+#define __Pyx_PyByteArray_FromCString(s)   __Pyx_PyByteArray_FromString((const char*)s)
+#define __Pyx_PyStr_FromCString(s)     __Pyx_PyStr_FromString((const char*)s)
+#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
 #if PY_MAJOR_VERSION < 3
 static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
 {
@@ -339,7 +350,7 @@ static int __Pyx_init_sys_getdefaultencoding_params(void) {
     const char* default_encoding_c;
     sys = PyImport_ImportModule("sys");
     if (!sys) goto bad;
-    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
+    default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
     Py_DECREF(sys);
     if (!default_encoding) goto bad;
     default_encoding_c = PyBytes_AsString(default_encoding);
@@ -453,7 +464,7 @@ static const char *__pyx_f[] = {
   "MPI.pxd",
 };
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":723
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":726
  * # in Cython to enable them only on the right systems.
  * 
  * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<
@@ -462,7 +473,7 @@ static const char *__pyx_f[] = {
  */
 typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":724
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":727
  * 
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<
@@ -471,7 +482,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t;
  */
 typedef npy_int16 __pyx_t_5numpy_int16_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":725
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":728
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<
@@ -480,7 +491,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t;
  */
 typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":726
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":729
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t
  * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<
@@ -489,7 +500,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t;
  */
 typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":730
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":733
  * #ctypedef npy_int128     int128_t
  * 
  * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<
@@ -498,7 +509,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t;
  */
 typedef npy_uint8 __pyx_t_5numpy_uint8_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":731
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":734
  * 
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<
@@ -507,7 +518,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  */
 typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":732
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":735
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<
@@ -516,7 +527,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  */
 typedef npy_uint32 __pyx_t_5numpy_uint32_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":733
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":736
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t
  * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<
@@ -525,7 +536,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  */
 typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":737
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":740
  * #ctypedef npy_uint128    uint128_t
  * 
  * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<
@@ -534,7 +545,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  */
 typedef npy_float32 __pyx_t_5numpy_float32_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":738
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":741
  * 
  * ctypedef npy_float32    float32_t
  * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<
@@ -543,7 +554,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t;
  */
 typedef npy_float64 __pyx_t_5numpy_float64_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":747
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":750
  * # The int types are mapped a bit surprising --
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<
@@ -552,7 +563,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t;
  */
 typedef npy_long __pyx_t_5numpy_int_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":748
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":751
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<
@@ -561,7 +572,7 @@ typedef npy_long __pyx_t_5numpy_int_t;
  */
 typedef npy_longlong __pyx_t_5numpy_long_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":749
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":752
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t
  * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<
@@ -570,7 +581,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t;
  */
 typedef npy_longlong __pyx_t_5numpy_longlong_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":751
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":754
  * ctypedef npy_longlong   longlong_t
  * 
  * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<
@@ -579,7 +590,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t;
  */
 typedef npy_ulong __pyx_t_5numpy_uint_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":752
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":755
  * 
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<
@@ -588,7 +599,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":753
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":756
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t
  * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<
@@ -597,7 +608,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":755
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":758
  * ctypedef npy_ulonglong  ulonglong_t
  * 
  * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<
@@ -606,7 +617,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  */
 typedef npy_intp __pyx_t_5numpy_intp_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":756
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":759
  * 
  * ctypedef npy_intp       intp_t
  * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<
@@ -615,7 +626,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t;
  */
 typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":758
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":761
  * ctypedef npy_uintp      uintp_t
  * 
  * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<
@@ -624,7 +635,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t;
  */
 typedef npy_double __pyx_t_5numpy_float_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":759
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":762
  * 
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<
@@ -633,7 +644,7 @@ typedef npy_double __pyx_t_5numpy_float_t;
  */
 typedef npy_double __pyx_t_5numpy_double_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":760
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":763
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t
  * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<
@@ -682,8 +693,16 @@ struct PyMPIWinObject;
 struct PyMPIFileObject;
 struct __pyx_obj_9adios_mpi_file;
 struct __pyx_obj_9adios_mpi_var;
-
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":762
+struct __pyx_obj_9adios_mpi_attr;
+struct __pyx_obj_9adios_mpi_smartdict;
+struct __pyx_obj_9adios_mpi_writer;
+struct __pyx_obj_9adios_mpi_attrinfo;
+struct __pyx_obj_9adios_mpi_varinfo;
+struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__;
+struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr;
+struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr;
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":765
  * ctypedef npy_longdouble longdouble_t
  * 
  * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<
@@ -692,7 +711,7 @@ struct __pyx_obj_9adios_mpi_var;
  */
 typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":763
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":766
  * 
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<
@@ -701,7 +720,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":764
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":767
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t
  * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<
@@ -710,7 +729,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  */
 typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":766
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":769
  * ctypedef npy_clongdouble clongdouble_t
  * 
  * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<
@@ -720,17 +739,19 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 typedef npy_cdouble __pyx_t_5numpy_complex_t;
 struct __pyx_opt_args_9adios_mpi_init;
 struct __pyx_opt_args_9adios_mpi_open;
+struct __pyx_opt_args_9adios_mpi_write;
 struct __pyx_opt_args_9adios_mpi_finalize;
 struct __pyx_opt_args_9adios_mpi_init_noxml;
 struct __pyx_opt_args_9adios_mpi_declare_group;
 struct __pyx_opt_args_9adios_mpi_define_var;
 struct __pyx_opt_args_9adios_mpi_select_method;
+struct __pyx_opt_args_9adios_mpi_adios2npdtype;
 struct __pyx_opt_args_9adios_mpi_read_init;
 struct __pyx_opt_args_9adios_mpi_read_finalize;
 struct __pyx_opt_args_9adios_mpi_4file_advance;
 struct __pyx_opt_args_9adios_mpi_3var_read;
 
-/* "adios_mpi.pyx":258
+/* "adios_mpi.pyx":304
  * ## ====================
  * 
  * cpdef init(char * config, MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
@@ -742,7 +763,7 @@ struct __pyx_opt_args_9adios_mpi_init {
   struct PyMPICommObject *comm;
 };
 
-/* "adios_mpi.pyx":261
+/* "adios_mpi.pyx":307
  *     return adios_init(config, comm.ob_mpi)
  * 
  * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
@@ -754,7 +775,19 @@ struct __pyx_opt_args_9adios_mpi_open {
   struct PyMPICommObject *comm;
 };
 
-/* "adios_mpi.pyx":302
+/* "adios_mpi.pyx":322
+ *     return total_size
+ * 
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):             # <<<<<<<<<<<<<<
+ *     cdef np.ndarray val_
+ *     if isinstance(val, (np.ndarray)):
+ */
+struct __pyx_opt_args_9adios_mpi_write {
+  int __pyx_n;
+  PyObject *dtype;
+};
+
+/* "adios_mpi.pyx":355
  *     return adios_close(fd_p)
  * 
  * cpdef int finalize(int mype = 0):             # <<<<<<<<<<<<<<
@@ -766,7 +799,7 @@ struct __pyx_opt_args_9adios_mpi_finalize {
   int mype;
 };
 
-/* "adios_mpi.pyx":308
+/* "adios_mpi.pyx":361
  * ## ADIOS No-XML API
  * ## ====================
  * cpdef int init_noxml(MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
@@ -778,7 +811,7 @@ struct __pyx_opt_args_9adios_mpi_init_noxml {
   struct PyMPICommObject *comm;
 };
 
-/* "adios_mpi.pyx":316
+/* "adios_mpi.pyx":369
  *                                  buffer_size)
  * 
  * cpdef int64_t declare_group(char * name,             # <<<<<<<<<<<<<<
@@ -791,7 +824,7 @@ struct __pyx_opt_args_9adios_mpi_declare_group {
   int stats;
 };
 
-/* "adios_mpi.pyx":326
+/* "adios_mpi.pyx":379
  *     return id
  * 
  * cpdef int define_var(int64_t group_id,             # <<<<<<<<<<<<<<
@@ -805,8 +838,8 @@ struct __pyx_opt_args_9adios_mpi_define_var {
   char *local_offsets;
 };
 
-/* "adios_mpi.pyx":353
- *                                    var)
+/* "adios_mpi.pyx":449
+ *                                         <void *> val_.data)
  * 
  * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
  *                          char * method,
@@ -818,7 +851,19 @@ struct __pyx_opt_args_9adios_mpi_select_method {
   char *base_path;
 };
 
-/* "adios_mpi.pyx":486
+/* "adios_mpi.pyx":463
+ * ## ====================
+ * 
+ * cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):             # <<<<<<<<<<<<<<
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None
+ */
+struct __pyx_opt_args_9adios_mpi_adios2npdtype {
+  int __pyx_n;
+  int strlen;
+};
+
+/* "adios_mpi.pyx":591
  * 
  * """ Call adios_read_init_method """
  * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
@@ -832,7 +877,7 @@ struct __pyx_opt_args_9adios_mpi_read_init {
   char *parameters;
 };
 
-/* "adios_mpi.pyx":494
+/* "adios_mpi.pyx":599
  * 
  * """ Call adios_read_finalize_method """
  * cpdef int read_finalize(char * method_name = "BP"):             # <<<<<<<<<<<<<<
@@ -844,12 +889,12 @@ struct __pyx_opt_args_9adios_mpi_read_finalize {
   char *method_name;
 };
 
-/* "adios_mpi.pyx":567
+/* "adios_mpi.pyx":735
  *         printfile(self.fp)
  * 
  *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
- *         return adios_advance_step(self.fp, last, timeout_sec)
- * 
+ *         """
+ *         Advance a timestep for stream reader.
  */
 struct __pyx_opt_args_9adios_mpi_4file_advance {
   int __pyx_n;
@@ -857,12 +902,12 @@ struct __pyx_opt_args_9adios_mpi_4file_advance {
   float timeout_sec;
 };
 
-/* "adios_mpi.pyx":610
+/* "adios_mpi.pyx":887
+ *         self.nsteps = self.vp.nsteps
+ * 
+ *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):             # <<<<<<<<<<<<<<
+ *         """ Perform read.
  * 
- *     """ Call adios_schedule_read and adios_perform_reads """
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):             # <<<<<<<<<<<<<<
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):
  */
 struct __pyx_opt_args_9adios_mpi_3var_read {
   int __pyx_n;
@@ -870,6 +915,7 @@ struct __pyx_opt_args_9adios_mpi_3var_read {
   PyObject *count;
   PyObject *from_steps;
   PyObject *nsteps;
+  PyObject *fill;
 };
 
 /* "../../../../Library/Python/2.7/lib/python/site-packages/mpi4py/include/mpi4py/MPI.pxd":49
@@ -1134,12 +1180,12 @@ typedef struct PyMPIFileObject PyMPIFileObject;
 
 __PYX_EXTERN_C DL_EXPORT(PyTypeObject) PyMPIFile_Type;
 
-/* "adios_mpi.pyx":499
+/* "adios_mpi.pyx":604
  * 
- * """ Python class for ADIOS_FILE structure """
+ * ## Python class for ADIOS_FILE structure
  * cdef class file:             # <<<<<<<<<<<<<<
- *     """ Private Memeber """
- *     cpdef ADIOS_FILE * fp
+ *     """
+ *     file class for Adios file read and write.
  */
 struct __pyx_obj_9adios_mpi_file {
   PyObject_HEAD
@@ -1153,18 +1199,18 @@ struct __pyx_obj_9adios_mpi_file {
   int endianness;
   int version;
   int file_size;
+  int is_stream;
   PyObject *var;
   PyObject *attr;
-  int is_stream;
 };
 
 
-/* "adios_mpi.pyx":571
+/* "adios_mpi.pyx":797
+ *                  self.file_size)
  * 
- * """ Python class for ADIOS_VARINFO structure """
  * cdef class var:             # <<<<<<<<<<<<<<
- *     """ Private Memeber """
- *     cdef file file
+ *     """
+ *     Adios variable class.
  */
 struct __pyx_obj_9adios_mpi_var {
   PyObject_HEAD
@@ -1173,20 +1219,152 @@ struct __pyx_obj_9adios_mpi_var {
   ADIOS_VARINFO *vp;
   PyObject *name;
   int varid;
-  PyObject *type;
+  PyArray_Descr *dtype;
   int ndim;
   PyObject *dims;
   int nsteps;
 };
 
 
+/* "adios_mpi.pyx":1062
+ *                          nsteps=nsteps_)
+ * 
+ * cdef class attr:             # <<<<<<<<<<<<<<
+ *     """
+ *     Adios attribute class.
+ */
+struct __pyx_obj_9adios_mpi_attr {
+  PyObject_HEAD
+  struct __pyx_obj_9adios_mpi_file *file;
+  PyObject *name;
+  PyArray_Descr *dtype;
+  PyArrayObject *value;
+};
 
-/* "adios_mpi.pyx":499
+
+/* "adios_mpi.pyx":1140
+ * 
+ * ## Helper dict
+ * cdef class smartdict(dict):             # <<<<<<<<<<<<<<
+ *     cdef factory
+ *     def __init__(self, factory):
+ */
+struct __pyx_obj_9adios_mpi_smartdict {
+  PyDictObject __pyx_base;
+  PyObject *factory;
+};
+
+
+/* "adios_mpi.pyx":1152
+ *             self.factory(key, value)
+ * 
+ * cdef class writer:             # <<<<<<<<<<<<<<
+ *     """
+ *     writer class for Adios write.
+ */
+struct __pyx_obj_9adios_mpi_writer {
+  PyObject_HEAD
+  int64_t gid;
+  PyObject *fname;
+  PyObject *gname;
+  PyObject *method;
+  PyObject *method_params;
+  int is_noxml;
+  struct PyMPICommObject *comm;
+  PyObject *var;
+  PyObject *attr;
+};
+
+
+/* "adios_mpi.pyx":1346
+ *                  self.attr.keys())
+ * 
+ * cdef class attrinfo:             # <<<<<<<<<<<<<<
+ *     cdef bytes name
+ *     cdef bint is_static # Use define_byvalue, if True
+ */
+struct __pyx_obj_9adios_mpi_attrinfo {
+  PyObject_HEAD
+  PyObject *name;
+  int is_static;
+  PyObject *dtype;
+  PyObject *value;
+};
+
+
+/* "adios_mpi.pyx":1399
+ *                  self.dtype)
+ * 
+ * cdef class varinfo:             # <<<<<<<<<<<<<<
+ *     cdef bytes name
+ *     cdef public ldim
+ */
+struct __pyx_obj_9adios_mpi_varinfo {
+  PyObject_HEAD
+  PyObject *name;
+  PyObject *ldim;
+  PyObject *gdim;
+  PyObject *offset;
+  PyObject *value;
+};
+
+
+/* "adios_mpi.pyx":1009
+ *                 self.nsteps)
+ * 
+ *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1
+ */
+struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ {
+  PyObject_HEAD
+  PyObject *__pyx_v_dims_;
+  PyObject *__pyx_v_index_;
+  struct __pyx_obj_9adios_mpi_var *__pyx_v_self;
+};
+
+
+/* "adios_mpi.pyx":1030
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *__pyx_outer_scope;
+  PyObject *__pyx_v_x;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
+};
+
+
+/* "adios_mpi.pyx":1038
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *__pyx_outer_scope;
+  PyObject *__pyx_v_x;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
+};
+
+
+
+/* "adios_mpi.pyx":604
  * 
- * """ Python class for ADIOS_FILE structure """
+ * ## Python class for ADIOS_FILE structure
  * cdef class file:             # <<<<<<<<<<<<<<
- *     """ Private Memeber """
- *     cpdef ADIOS_FILE * fp
+ *     """
+ *     file class for Adios file read and write.
  */
 
 struct __pyx_vtabstruct_9adios_mpi_file {
@@ -1197,20 +1375,23 @@ struct __pyx_vtabstruct_9adios_mpi_file {
 static struct __pyx_vtabstruct_9adios_mpi_file *__pyx_vtabptr_9adios_mpi_file;
 
 
-/* "adios_mpi.pyx":571
+/* "adios_mpi.pyx":797
+ *                  self.file_size)
  * 
- * """ Python class for ADIOS_VARINFO structure """
  * cdef class var:             # <<<<<<<<<<<<<<
- *     """ Private Memeber """
- *     cdef file file
+ *     """
+ *     Adios variable class.
  */
 
 struct __pyx_vtabstruct_9adios_mpi_var {
   PyObject *(*close)(struct __pyx_obj_9adios_mpi_var *, int __pyx_skip_dispatch);
+  PyObject *(*advance)(struct __pyx_obj_9adios_mpi_var *, int __pyx_skip_dispatch);
   PyObject *(*read)(struct __pyx_obj_9adios_mpi_var *, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_3var_read *__pyx_optional_args);
   PyObject *(*printself)(struct __pyx_obj_9adios_mpi_var *, int __pyx_skip_dispatch);
 };
 static struct __pyx_vtabstruct_9adios_mpi_var *__pyx_vtabptr_9adios_mpi_var;
+
+/* --- Runtime support code (head) --- */
 #ifndef CYTHON_REFNANNY
   #define CYTHON_REFNANNY 0
 #endif
@@ -1290,18 +1471,76 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject
 
 static PyObject *__Pyx_GetBuiltinName(PyObject *name);
 
+#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
+    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
+    __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) : \
+    (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) : \
+               __Pyx_GetItemInt_Generic(o, to_py_func(i))))
+#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
+    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
+    __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
+    (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
+                                                              int wraparound, int boundscheck);
+#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
+    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
+    __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
+    (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
+                                                              int wraparound, int boundscheck);
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
+                                                     int is_list, int wraparound, int boundscheck);
+
+static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb);
+static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb);
+
+static void __Pyx_WriteUnraisable(const char *name, int clineno,
+                                  int lineno, const char *filename,
+                                  int full_traceback);
+
+static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyObject* none = _PyList_Extend((PyListObject*)L, v);
+    if (unlikely(!none))
+        return -1;
+    Py_DECREF(none);
+    return 0;
+#else
+    return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v);
+#endif
+}
+
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
+    PyListObject* L = (PyListObject*) list;
+    Py_ssize_t len = Py_SIZE(list);
+    if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
+        Py_INCREF(x);
+        PyList_SET_ITEM(list, len, x);
+        Py_SIZE(list) = len+1;
+        return 0;
+    }
+    return PyList_Append(list, x);
+}
+#else
+#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
+#endif
+
+static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
+    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);
+
 static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);
 
 static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
     const char* function_name);
 
-static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
-    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);
-
 static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact);
 
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
+
 static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name);
 
 #if CYTHON_COMPILING_IN_CPYTHON
@@ -1310,14 +1549,23 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg
 #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
 #endif
 
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
+#endif
 
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb);
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb);
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
 
-static void __Pyx_WriteUnraisable(const char *name, int clineno,
-                                  int lineno, const char *filename,
-                                  int full_traceback);
+#include <string.h>
+
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);
+
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals);
+
+#if PY_MAJOR_VERSION >= 3
+#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
+#else
+#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
+#endif
 
 #if CYTHON_COMPILING_IN_CPYTHON
 static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) {
@@ -1335,43 +1583,57 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) {
 #define __Pyx_ListComp_Append(L,x) PyList_Append(L,x)
 #endif
 
-#include <string.h>
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
+#else
+#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
+#endif
 
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);
+static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg);
 
-#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
-    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
-    __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) : \
-    (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) : \
-               __Pyx_GetItemInt_Generic(o, to_py_func(i))))
-#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
-    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
-    __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
-    (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck);
-#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
-    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
-    __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
-    (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck);
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
-                                                     int is_list, int wraparound, int boundscheck);
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d);
 
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
-#endif
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
 
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Keys(PyObject* d);
+
+static CYTHON_INLINE int __Pyx_PySequence_Contains(PyObject* item, PyObject* seq, int eq) {
+    int result = PySequence_Contains(seq, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+}
+
+static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value);
+
+#define __Pyx_PyObject_DelSlice(obj, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound) \
+    __Pyx_PyObject_SetSlice(obj, (PyObject*)NULL, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound)
+static CYTHON_INLINE int __Pyx_PyObject_SetSlice(
+        PyObject* obj, PyObject* value, Py_ssize_t cstart, Py_ssize_t cstop,
+        PyObject** py_start, PyObject** py_stop, PyObject** py_slice,
+        int has_cstart, int has_cstop, int wraparound);
+
+static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname);
+
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
+        PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
+        PyObject** py_start, PyObject** py_stop, PyObject** py_slice,
+        int has_cstart, int has_cstop, int wraparound);
 
 #if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
+static CYTHON_INLINE PyObject* __Pyx_PyList_GetSlice(PyObject* src, Py_ssize_t start, Py_ssize_t stop);
+static CYTHON_INLINE PyObject* __Pyx_PyTuple_GetSlice(PyObject* src, Py_ssize_t start, Py_ssize_t stop);
 #else
-#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
+#define __Pyx_PyList_GetSlice(seq, start, stop)   PySequence_GetSlice(seq, start, stop)
+#define __Pyx_PyTuple_GetSlice(seq, start, stop)  PySequence_GetSlice(seq, start, stop)
+#endif
+
+#ifndef __PYX_FORCE_INIT_THREADS
+  #define __PYX_FORCE_INIT_THREADS 0
 #endif
 
+static CYTHON_INLINE int __Pyx_div_int(int, int); /* proto */
+
+#define UNARY_NEG_WOULD_OVERFLOW(x)            (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
+
 #if PY_MAJOR_VERSION >= 3
 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
     PyObject *value;
@@ -1392,6 +1654,23 @@ static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
     #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key)
 #endif
 
+#if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o,n,NULL)
+static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) {
+    PyTypeObject* tp = Py_TYPE(obj);
+    if (likely(tp->tp_setattro))
+        return tp->tp_setattro(obj, attr_name, value);
+#if PY_MAJOR_VERSION < 3
+    if (likely(tp->tp_setattr))
+        return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value);
+#endif
+    return PyObject_SetAttr(obj, attr_name, value);
+}
+#else
+#define __Pyx_PyObject_DelAttrStr(o,n)   PyObject_DelAttr(o,n)
+#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
+#endif
+
 static CYTHON_INLINE int __Pyx_IterFinish(void);
 
 static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name);
@@ -1414,8 +1693,6 @@ static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict,
 static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos,
                                               PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict);
 
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
-
 static int __Pyx_SetVtable(PyObject *dict, void *vtable);
 
 static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases);
@@ -1442,18 +1719,18 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
 static void __Pyx_AddTraceback(const char *funcname, int c_line,
                                int py_line, const char *filename);
 
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
-
-static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
-
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);
 
 static CYTHON_INLINE int64_t __Pyx_PyInt_As_int64_t(PyObject *);
 
 static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *);
 
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
+
 static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
 
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
+
 static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int64_t(int64_t value);
 
 static int __Pyx_Print(PyObject*, PyObject *, int);
@@ -1568,6 +1845,39 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
     #endif
 #endif
 
+static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type);
+
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);
+
+#define __Pyx_Generator_USED
+#include <structmember.h>
+#include <frameobject.h>
+typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
+typedef struct {
+    PyObject_HEAD
+    __pyx_generator_body_t body;
+    PyObject *closure;
+    PyObject *exc_type;
+    PyObject *exc_value;
+    PyObject *exc_traceback;
+    PyObject *gi_weakreflist;
+    PyObject *classobj;
+    PyObject *yieldfrom;
+    PyObject *gi_name;
+    PyObject *gi_qualname;
+    int resume_label;
+    char is_running;
+} __pyx_GeneratorObject;
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure, PyObject *name, PyObject *qualname);
+static int __pyx_Generator_init(void);
+static int __Pyx_Generator_clear(PyObject* self);
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
+#else
+#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
+#endif
+
 static int __Pyx_check_binary_version(void);
 
 #if !defined(__Pyx_PyIdentifier_FromString)
@@ -1588,6 +1898,7 @@ static PyObject *__pyx_f_9adios_mpi_4file_close(struct __pyx_obj_9adios_mpi_file
 static PyObject *__pyx_f_9adios_mpi_4file_printself(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
 static PyObject *__pyx_f_9adios_mpi_4file_advance(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_4file_advance *__pyx_optional_args); /* proto*/
 static PyObject *__pyx_f_9adios_mpi_3var_close(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
+static PyObject *__pyx_f_9adios_mpi_3var_advance(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
 static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_3var_read *__pyx_optional_args); /* proto*/
 static PyObject *__pyx_f_9adios_mpi_3var_printself(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
 
@@ -1639,18 +1950,31 @@ static PyTypeObject *__pyx_ptype_6mpi4py_3MPI_File = 0;
 
 /* Module declarations from 'cython' */
 
+/* Module declarations from 'cpython.string' */
+
 /* Module declarations from 'libc.stdint' */
 
 /* Module declarations from 'adios_mpi' */
 static PyTypeObject *__pyx_ptype_9adios_mpi_file = 0;
 static PyTypeObject *__pyx_ptype_9adios_mpi_var = 0;
+static PyTypeObject *__pyx_ptype_9adios_mpi_attr = 0;
+static PyTypeObject *__pyx_ptype_9adios_mpi_smartdict = 0;
+static PyTypeObject *__pyx_ptype_9adios_mpi_writer = 0;
+static PyTypeObject *__pyx_ptype_9adios_mpi_attrinfo = 0;
+static PyTypeObject *__pyx_ptype_9adios_mpi_varinfo = 0;
+static PyTypeObject *__pyx_ptype_9adios_mpi___pyx_scope_struct____getitem__ = 0;
+static PyTypeObject *__pyx_ptype_9adios_mpi___pyx_scope_struct_1_genexpr = 0;
+static PyTypeObject *__pyx_ptype_9adios_mpi___pyx_scope_struct_2_genexpr = 0;
+static char **__pyx_f_9adios_mpi_to_cstring_array(PyObject *); /*proto*/
+static PyObject *__pyx_f_9adios_mpi___parse_index(PyObject *, PyObject *, int __pyx_skip_dispatch); /*proto*/
 static PyObject *__pyx_f_9adios_mpi_init(char *, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_init *__pyx_optional_args); /*proto*/
 static int64_t __pyx_f_9adios_mpi_open(char *, char *, char *, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_open *__pyx_optional_args); /*proto*/
 static int64_t __pyx_f_9adios_mpi_set_group_size(int64_t, uint64_t, int __pyx_skip_dispatch); /*proto*/
-static int __pyx_f_9adios_mpi_write(int64_t, char *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/
+static int __pyx_f_9adios_mpi_write(int64_t, char *, PyObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_write *__pyx_optional_args); /*proto*/
 static int __pyx_f_9adios_mpi_write_int(int64_t, char *, int, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_9adios_mpi_write_long(int64_t, char *, long, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_9adios_mpi_write_float(int64_t, char *, float, int __pyx_skip_dispatch); /*proto*/
+static int __pyx_f_9adios_mpi_write_double(int64_t, char *, double, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_9adios_mpi_read(int64_t, char *, PyArrayObject *, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_9adios_mpi_close(int64_t, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_9adios_mpi_finalize(int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_finalize *__pyx_optional_args); /*proto*/
@@ -1659,102 +1983,159 @@ static int __pyx_f_9adios_mpi_allocate_buffer(int, uint64_t, int __pyx_skip_disp
 static int64_t __pyx_f_9adios_mpi_declare_group(char *, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_declare_group *__pyx_optional_args); /*proto*/
 static int __pyx_f_9adios_mpi_define_var(int64_t, char *, char *, int, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_define_var *__pyx_optional_args); /*proto*/
 static int __pyx_f_9adios_mpi_define_attribute(int64_t, char *, char *, int, char *, char *, int __pyx_skip_dispatch); /*proto*/
+static int __pyx_f_9adios_mpi_define_attribute_byvalue(int64_t, char *, char *, PyObject *, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_9adios_mpi_select_method(int64_t, char *, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_select_method *__pyx_optional_args); /*proto*/
-static PyObject *__pyx_f_9adios_mpi_adios2nptype(ADIOS_DATATYPES); /*proto*/
+static PyArray_Descr *__pyx_f_9adios_mpi_adios2npdtype(ADIOS_DATATYPES, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_adios2npdtype *__pyx_optional_args); /*proto*/
 static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *); /*proto*/
 static PyObject *__pyx_f_9adios_mpi_printvar(ADIOS_VARINFO *); /*proto*/
 static ADIOS_READ_METHOD __pyx_f_9adios_mpi_str2adiosreadmethod(PyObject *); /*proto*/
-static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *, int __pyx_skip_dispatch); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyArray_Descr *, int __pyx_skip_dispatch); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_adiostype2string(ADIOS_DATATYPES, int __pyx_skip_dispatch); /*proto*/
 static int __pyx_f_9adios_mpi_read_init(int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_read_init *__pyx_optional_args); /*proto*/
 static int __pyx_f_9adios_mpi_read_finalize(int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_read_finalize *__pyx_optional_args); /*proto*/
 #define __Pyx_MODULE_NAME "adios_mpi"
 int __pyx_module_is_main_adios_mpi = 0;
 
 /* Implementation of 'adios_mpi' */
+static PyObject *__pyx_builtin_xrange;
+static PyObject *__pyx_builtin_Ellipsis;
 static PyObject *__pyx_builtin_range;
+static PyObject *__pyx_builtin_KeyError;
+static PyObject *__pyx_builtin_TypeError;
+static PyObject *__pyx_builtin_IndexError;
+static PyObject *__pyx_builtin_zip;
+static PyObject *__pyx_builtin_NotImplementedError;
 static PyObject *__pyx_builtin_ValueError;
 static PyObject *__pyx_builtin_RuntimeError;
-static PyObject *__pyx_pf_9adios_mpi_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_config, struct PyMPICommObject *__pyx_v_comm); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_2open(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, struct PyMPICommObject *__pyx_v_comm); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_4set_group_size(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_6write(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_8write_int(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_10write_long(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_12write_float(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_14read(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_16close(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_18finalize(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_mype); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_20init_noxml(CYTHON_UNUSED PyObject *__pyx_self, struct PyMPICommObject *__pyx_v_comm); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_22allocate_buffer(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_when, uint64_t __pyx_v_buffer_size); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_24declare_group(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_name, char *__pyx_v_time_index, int __pyx_v_stats); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_26define_var(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_dimensions, char *__pyx_v_global_dimensions, char *__pyx_v_local_offsets); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_28define_attribute(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_value, char *__pyx_v_var); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_30select_method(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_method, char *__pyx_v_parameters, char *__pyx_v_base_path); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_32np2adiostype(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_nptype); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_34read_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name, struct PyMPICommObject *__pyx_v_comm, char *__pyx_v_parameters); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_36read_finalize(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name); /* proto */
-static int __pyx_pf_9adios_mpi_4file___init__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, char *__pyx_v_fname, char *__pyx_v_method_name, struct PyMPICommObject *__pyx_v_comm, PyObject *__pyx_v_is_stream, ADIOS_LOCKMODE __pyx_v_lock_mode, float __pyx_v_timeout_sec); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_4file_2__del__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_4file_4close(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_4file_6printself(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_4file_8advance(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_v_last, float __pyx_v_timeout_sec); /* proto */
+static PyObject *__pyx_pf_9adios_mpi___parse_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_index, PyObject *__pyx_v_ndim); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_2init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_config, struct PyMPICommObject *__pyx_v_comm); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4open(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, struct PyMPICommObject *__pyx_v_comm); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6set_group_size(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_8write(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyObject *__pyx_v_val, PyObject *__pyx_v_dtype); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_10write_int(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_12write_long(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_14write_float(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_16write_double(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, double __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_18read(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_20close(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_22finalize(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_mype); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_24init_noxml(CYTHON_UNUSED PyObject *__pyx_self, struct PyMPICommObject *__pyx_v_comm); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_26allocate_buffer(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_when, uint64_t __pyx_v_buffer_size); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_28declare_group(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_name, char *__pyx_v_time_index, int __pyx_v_stats); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_30define_var(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_dimensions, char *__pyx_v_global_dimensions, char *__pyx_v_local_offsets); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_32define_attribute(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_value, char *__pyx_v_var); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_34define_attribute_byvalue(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, PyObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_36select_method(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_method, char *__pyx_v_parameters, char *__pyx_v_base_path); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_38adios2npdtype(CYTHON_UNUSED PyObject *__pyx_self, ADIOS_DATATYPES __pyx_v_t, int __pyx_v_strlen); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_40np2adiostype(CYTHON_UNUSED PyObject *__pyx_self, PyArray_Descr *__pyx_v_nptype); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_42adiostype2string(CYTHON_UNUSED PyObject *__pyx_self, ADIOS_DATATYPES __pyx_v_type); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_44read_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name, struct PyMPICommObject *__pyx_v_comm, char *__pyx_v_parameters); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_46read_finalize(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_4file_4name___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_4file_4name_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_9adios_mpi_4file_4name_4__del__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_4file_5nvars___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_4file_5nvars_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_4file_6nattrs___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_4file_6nattrs_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_4file_12current_step___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_4file_12current_step_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_4file_9last_step___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_4file_9last_step_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_4file_10endianness___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_4file_10endianness_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_4file_7version___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_4file_7version_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_4file_9file_size___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_4file_9file_size_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_4file_3var___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4file_10file_sizec___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4file_9is_stream___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_4file___init__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, char *__pyx_v_fname, char *__pyx_v_method_name, struct PyMPICommObject *__pyx_v_comm, PyObject *__pyx_v_is_stream, ADIOS_LOCKMODE __pyx_v_lock_mode, float __pyx_v_timeout_sec); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4file_2__del__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4file_4close(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4file_6printself(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4file_8advance(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_v_last, float __pyx_v_timeout_sec); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4file_10__getitem__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_varname); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4file_12__repr__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4file_3var___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
 static int __pyx_pf_9adios_mpi_4file_3var_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static int __pyx_pf_9adios_mpi_4file_3var_4__del__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_4file_4attr___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
 static int __pyx_pf_9adios_mpi_4file_4attr_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static int __pyx_pf_9adios_mpi_4file_4attr_4__del__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_4file_9is_stream___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_4file_9is_stream_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, struct __pyx_obj_9adios_mpi_file *__pyx_v_file, char *__pyx_v_name); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_3var_2__del__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_3var_4close(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_3var_6read(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_offset, PyObject *__pyx_v_count, PyObject *__pyx_v_from_steps, PyObject *__pyx_v_nsteps); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_3var_8printself(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_3var_4name___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_3var_4name_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_9adios_mpi_3var_4name_4__del__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_3var_5varid___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_3var_5varid_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_3var_4type___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_3var_4type_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_9adios_mpi_3var_4type_4__del__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_5dtype___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_3var_4ndim___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_3var_4ndim_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_3var_4dims___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_3var_4dims_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_9adios_mpi_3var_4dims_4__del__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_9adios_mpi_3var_6nsteps___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
-static int __pyx_pf_9adios_mpi_3var_6nsteps_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_38readvar(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname, PyObject *__pyx_v_varname); /* proto */
-static PyObject *__pyx_pf_9adios_mpi_40bpls(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname); /* proto */
+static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, struct __pyx_obj_9adios_mpi_file *__pyx_v_file, char *__pyx_v_name); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_2__del__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_4close(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_6advance(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_8read(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_offset, PyObject *__pyx_v_count, PyObject *__pyx_v_from_steps, PyObject *__pyx_v_nsteps, PyObject *__pyx_v_fill); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_10printself(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_12__repr__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_11__getitem___genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_11__getitem___3genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_3var_14__getitem__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4attr_4name___get__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4attr_5dtype___get__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4attr_5value___get__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_4attr___init__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self, struct __pyx_obj_9adios_mpi_file *__pyx_v_file, char *__pyx_v_name); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_4attr_2__repr__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_9smartdict___init__(struct __pyx_obj_9adios_mpi_smartdict *__pyx_v_self, PyObject *__pyx_v_factory); /* proto */
+static int __pyx_pf_9adios_mpi_9smartdict_2__setitem__(struct __pyx_obj_9adios_mpi_smartdict *__pyx_v_self, PyObject *__pyx_v_key, PyObject *__pyx_v_value); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_5fname___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_5gname___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_8is_noxml___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_3var___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_4attr___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_6writer___init__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_fname, int __pyx_v_is_noxml, struct PyMPICommObject *__pyx_v_comm); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_2declare_group(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_gname, char *__pyx_v_method, char *__pyx_v_method_params); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_4define_var(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_varname, PyObject *__pyx_v_ldim, PyObject *__pyx_v_gdim, PyObject *__pyx_v_offset); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_6define_attr(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_attrname); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_8define_dynamic_attr(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_attrname, char *__pyx_v_varname, PyObject *__pyx_v_dtype); /* proto */
+static int __pyx_pf_9adios_mpi_6writer_10__setitem__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_12__getitem__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, PyObject *__pyx_v_name); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_14close(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_6writer_16__repr__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_4name___get__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_9is_static___get__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_5dtype___get__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_5value___get__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_8attrinfo_5value_2__set__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_9adios_mpi_8attrinfo___init__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self, char *__pyx_v_name, PyObject *__pyx_v_value, PyObject *__pyx_v_dtype, int __pyx_v_is_static); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_2define(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self, int64_t __pyx_v_gid); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_4__repr__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_7varinfo___init__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, char *__pyx_v_name, PyObject *__pyx_v_ldim, PyObject *__pyx_v_gdim, PyObject *__pyx_v_offset); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_2define(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, int64_t __pyx_v_gid); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_4bytes(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_6write(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, int64_t __pyx_v_fd); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_8__repr__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_4ldim___get__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_7varinfo_4ldim_2__set__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_9adios_mpi_7varinfo_4ldim_4__del__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_4gdim___get__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_7varinfo_4gdim_2__set__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_9adios_mpi_7varinfo_4gdim_4__del__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_6offset___get__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_7varinfo_6offset_2__set__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_9adios_mpi_7varinfo_6offset_4__del__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_5value___get__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static int __pyx_pf_9adios_mpi_7varinfo_5value_2__set__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_9adios_mpi_7varinfo_5value_4__del__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_48readvar(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname, PyObject *__pyx_v_varname); /* proto */
+static PyObject *__pyx_pf_9adios_mpi_50bpls(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname); /* proto */
 static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */
 static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */
 static PyObject *__pyx_tp_new_9adios_mpi_file(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
 static PyObject *__pyx_tp_new_9adios_mpi_var(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_9adios_mpi_attr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_9adios_mpi_smartdict(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_9adios_mpi_writer(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_9adios_mpi_attrinfo(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_9adios_mpi_varinfo(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_9adios_mpi___pyx_scope_struct____getitem__(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_9adios_mpi___pyx_scope_struct_1_genexpr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_9adios_mpi___pyx_scope_struct_2_genexpr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
 static char __pyx_k_B[] = "B";
 static char __pyx_k_H[] = "H";
 static char __pyx_k_I[] = "I";
 static char __pyx_k_L[] = "L";
 static char __pyx_k_O[] = "O";
 static char __pyx_k_Q[] = "Q";
+static char __pyx_k_S[] = "S";
 static char __pyx_k_b[] = "b";
 static char __pyx_k_d[] = "d";
 static char __pyx_k_f[] = "f";
@@ -1764,14 +2145,15 @@ static char __pyx_k_i[] = "i";
 static char __pyx_k_k[] = "k";
 static char __pyx_k_l[] = "l";
 static char __pyx_k_q[] = "q";
+static char __pyx_k_t[] = "t";
 static char __pyx_k_v[] = "v";
+static char __pyx_k_w[] = "w";
 static char __pyx_k_BP[] = "BP";
 static char __pyx_k_NO[] = "NO";
 static char __pyx_k_Zd[] = "Zd";
 static char __pyx_k_Zf[] = "Zf";
 static char __pyx_k_Zg[] = "Zg";
-static char __pyx_k__4[] = "";
-static char __pyx_k__8[] = "/";
+static char __pyx_k__7[] = "";
 static char __pyx_k_fh[] = "fh";
 static char __pyx_k_fp[] = "fp";
 static char __pyx_k_np[] = "np";
@@ -1779,26 +2161,37 @@ static char __pyx_k_vp[] = "vp";
 static char __pyx_k_MPI[] = "MPI";
 static char __pyx_k_NOW[] = "NOW";
 static char __pyx_k_YES[] = "YES";
-static char __pyx_k__17[] = "*";
-static char __pyx_k_all[] = "all";
+static char __pyx_k__11[] = "/";
+static char __pyx_k__31[] = " ";
+static char __pyx_k__33[] = "(,)";
+static char __pyx_k__45[] = "*";
+static char __pyx_k_any[] = "any";
 static char __pyx_k_doc[] = "__doc__";
 static char __pyx_k_end[] = "end";
+static char __pyx_k_get[] = "get";
 static char __pyx_k_str[] = "str_";
 static char __pyx_k_val[] = "val";
 static char __pyx_k_var[] = "var";
+static char __pyx_k_zip[] = "zip";
 static char __pyx_k_FLAG[] = "FLAG";
 static char __pyx_k_ICEE[] = "ICEE";
+static char __pyx_k_args[] = "args";
 static char __pyx_k_bool[] = "bool_";
 static char __pyx_k_bpls[] = "bpls";
 static char __pyx_k_byte[] = "byte";
+static char __pyx_k_char[] = "char";
 static char __pyx_k_comm[] = "comm";
 static char __pyx_k_copy[] = "copy";
 static char __pyx_k_dims[] = "dims";
 static char __pyx_k_fd_p[] = "fd_p";
 static char __pyx_k_file[] = "file";
 static char __pyx_k_fill[] = "fill";
+static char __pyx_k_gdim[] = "gdim";
+static char __pyx_k_init[] = "__init__";
 static char __pyx_k_int8[] = "int8";
+static char __pyx_k_keys[] = "keys";
 static char __pyx_k_last[] = "last";
+static char __pyx_k_ldim[] = "ldim";
 static char __pyx_k_long[] = "long";
 static char __pyx_k_main[] = "__main__";
 static char __pyx_k_mode[] = "mode";
@@ -1808,7 +2201,9 @@ static char __pyx_k_ndim[] = "ndim";
 static char __pyx_k_path[] = "path";
 static char __pyx_k_read[] = "read";
 static char __pyx_k_real[] = "real";
+static char __pyx_k_send[] = "send";
 static char __pyx_k_size[] = "size";
+static char __pyx_k_step[] = "step";
 static char __pyx_k_test[] = "__test__";
 static char __pyx_k_type[] = "type";
 static char __pyx_k_vars[] = "vars";
@@ -1819,6 +2214,7 @@ static char __pyx_k_DIMES[] = "DIMES";
 static char __pyx_k_LATER[] = "LATER";
 static char __pyx_k_array[] = "array";
 static char __pyx_k_attrs[] = "attrs";
+static char __pyx_k_atype[] = "atype";
 static char __pyx_k_bytes[] = "(bytes)";
 static char __pyx_k_close[] = "close";
 static char __pyx_k_count[] = "count";
@@ -1826,7 +2222,9 @@ static char __pyx_k_dtype[] = "dtype";
 static char __pyx_k_flags[] = "flags";
 static char __pyx_k_float[] = "float_";
 static char __pyx_k_fname[] = "fname";
+static char __pyx_k_gname[] = "gname";
 static char __pyx_k_group[] = "group";
+static char __pyx_k_index[] = "index";
 static char __pyx_k_int16[] = "int16";
 static char __pyx_k_int32[] = "int32";
 static char __pyx_k_int64[] = "int64";
@@ -1834,15 +2232,21 @@ static char __pyx_k_numpy[] = "numpy";
 static char __pyx_k_nvars[] = "nvars";
 static char __pyx_k_print[] = "print";
 static char __pyx_k_range[] = "range";
+static char __pyx_k_shape[] = "shape";
 static char __pyx_k_short[] = "short";
 static char __pyx_k_split[] = "split";
 static char __pyx_k_stats[] = "stats";
+static char __pyx_k_strip[] = "strip";
+static char __pyx_k_throw[] = "throw";
 static char __pyx_k_uint8[] = "uint8";
 static char __pyx_k_value[] = "value";
 static char __pyx_k_varid[] = "varid";
+static char __pyx_k_write[] = "write";
 static char __pyx_k_zeros[] = "zeros";
 static char __pyx_k_15s_lu[] = "%15s : %lu";
+static char __pyx_k_POSIX1[] = "POSIX1";
 static char __pyx_k_config[] = "config";
+static char __pyx_k_define[] = "define";
 static char __pyx_k_double[] = "double";
 static char __pyx_k_import[] = "__import__";
 static char __pyx_k_method[] = "method";
@@ -1851,44 +2255,65 @@ static char __pyx_k_nattrs[] = "nattrs";
 static char __pyx_k_nsteps[] = "nsteps";
 static char __pyx_k_offset[] = "offset";
 static char __pyx_k_string[] = "string";
+static char __pyx_k_strlen[] = "strlen";
 static char __pyx_k_uint16[] = "uint16";
 static char __pyx_k_uint32[] = "uint32";
 static char __pyx_k_uint64[] = "uint64";
+static char __pyx_k_values[] = "values";
+static char __pyx_k_xrange[] = "xrange";
 static char __pyx_k_Reading[] = "Reading ... ";
 static char __pyx_k_UNKNOWN[] = "UNKNOWN";
 static char __pyx_k_advance[] = "advance";
+static char __pyx_k_bytes_2[] = "bytes";
 static char __pyx_k_complex[] = "complex_";
+static char __pyx_k_factory[] = "factory";
 static char __pyx_k_float16[] = "float16";
 static char __pyx_k_float32[] = "float32";
 static char __pyx_k_float64[] = "float64";
+static char __pyx_k_genexpr[] = "genexpr";
+static char __pyx_k_indices[] = "indices";
 static char __pyx_k_integer[] = "integer";
 static char __pyx_k_prepare[] = "__prepare__";
 static char __pyx_k_readvar[] = "readvar";
+static char __pyx_k_replace[] = "replace";
+static char __pyx_k_setitem[] = "__setitem__";
+static char __pyx_k_squeeze[] = "squeeze";
 static char __pyx_k_unknown[] = "unknown";
 static char __pyx_k_varname[] = "varname";
 static char __pyx_k_version[] = "version";
 static char __pyx_k_DATATYPE[] = "DATATYPE";
+static char __pyx_k_Ellipsis[] = "Ellipsis";
 static char __pyx_k_FLEXPATH[] = "FLEXPATH";
+static char __pyx_k_KeyError[] = "KeyError";
+static char __pyx_k_attrname[] = "attrname";
 static char __pyx_k_float128[] = "float128";
 static char __pyx_k_group_id[] = "group_id";
+static char __pyx_k_is_noxml[] = "is_noxml";
 static char __pyx_k_itemsize[] = "itemsize";
 static char __pyx_k_iterkeys[] = "iterkeys";
 static char __pyx_k_qualname[] = "__qualname__";
+static char __pyx_k_subtract[] = "subtract";
+static char __pyx_k_var_dict[] = "var: dict";
 static char __pyx_k_AdiosFile[] = "=== AdiosFile ===";
 static char __pyx_k_COMM_SELF[] = "COMM_SELF";
+static char __pyx_k_TypeError[] = "TypeError";
 static char __pyx_k_adios_mpi[] = "adios_mpi";
+static char __pyx_k_attr_dict[] = "attr: dict";
 static char __pyx_k_base_path[] = "base_path";
 static char __pyx_k_complex64[] = "complex64";
 static char __pyx_k_complex_2[] = "complex";
 static char __pyx_k_data_size[] = "data_size";
 static char __pyx_k_file_size[] = "file_size";
+static char __pyx_k_is_static[] = "is_static";
 static char __pyx_k_is_stream[] = "is_stream";
+static char __pyx_k_iteritems[] = "iteritems";
 static char __pyx_k_last_step[] = "last_step";
 static char __pyx_k_lock_mode[] = "lock_mode";
 static char __pyx_k_metaclass[] = "__metaclass__";
 static char __pyx_k_printself[] = "printself";
 static char __pyx_k_COMM_WORLD[] = "COMM_WORLD";
 static char __pyx_k_DATASPACES[] = "DATASPACES";
+static char __pyx_k_IndexError[] = "IndexError";
 static char __pyx_k_ValueError[] = "ValueError";
 static char __pyx_k_complex128[] = "complex128";
 static char __pyx_k_contiguous[] = "contiguous";
@@ -1901,101 +2326,181 @@ static char __pyx_k_parameters[] = "parameters";
 static char __pyx_k_pyx_vtable[] = "__pyx_vtable__";
 static char __pyx_k_time_index[] = "time_index";
 static char __pyx_k_time_steps[] = "time_steps";
+static char __pyx_k_READ_METHOD[] = "READ_METHOD";
 static char __pyx_k_buffer_size[] = "buffer_size";
+static char __pyx_k_gdim_object[] = "gdim: object";
+static char __pyx_k_ldim_object[] = "ldim: object";
 static char __pyx_k_long_double[] = "long_double";
 static char __pyx_k_method_name[] = "method_name";
 static char __pyx_k_timeout_sec[] = "timeout_sec";
 static char __pyx_k_BP_AGGREGATE[] = "BP_AGGREGATE";
 static char __pyx_k_RuntimeError[] = "RuntimeError";
 static char __pyx_k_current_step[] = "current_step";
+static char __pyx_k_string_array[] = "string_array";
+static char __pyx_k_value_object[] = "value: object";
 static char __pyx_k_var_namelist[] = "var_namelist";
 static char __pyx_k_AdiosVariable[] = "=== AdiosVariable ===";
+static char __pyx_k_Value_is_none[] = "Value is none";
 static char __pyx_k_attr_namelist[] = "attr_namelist";
 static char __pyx_k_local_offsets[] = "local_offsets";
+static char __pyx_k_method_params[] = "method_params";
+static char __pyx_k_offset_object[] = "offset: object";
 static char __pyx_k_unsigned_byte[] = "unsigned_byte";
 static char __pyx_k_unsigned_long[] = "unsigned_long";
 static char __pyx_k_double_complex[] = "double_complex";
 static char __pyx_k_unsigned_short[] = "unsigned_short";
 static char __pyx_k_Not_a_valid_var[] = "Not a valid var";
 static char __pyx_k_Not_an_open_var[] = "Not an open var";
+static char __pyx_k_Unhashable_type[] = "Unhashable type";
 static char __pyx_k_Not_an_open_file[] = "Not an open file";
 static char __pyx_k_unsigned_integer[] = "unsigned_integer";
 static char __pyx_k_BUFFER_ALLOC_WHEN[] = "BUFFER_ALLOC_WHEN";
 static char __pyx_k_No_valid_variable[] = "No valid variable";
+static char __pyx_k_The_variable_name[] = " The variable name. ";
 static char __pyx_k_global_dimensions[] = "global_dimensions";
+static char __pyx_k_var_read_line_887[] = "var.read (line 887)";
+static char __pyx_k_The_attribute_name[] = " The attribute name ";
+static char __pyx_k_NotImplementedError[] = "NotImplementedError";
+static char __pyx_k_Internal_variable_id[] = " Internal variable id. ";
 static char __pyx_k_Not_an_open_variable[] = "Not an open variable";
+static char __pyx_k_The_version_of_Adios[] = " The version of Adios. ";
+static char __pyx_k_The_attribute_s_value[] = " The attribute's value ";
+static char __pyx_k_The_filename_to_write[] = " The filename to write. ";
 static char __pyx_k_Use_default_BP_method[] = ". Use default BP method";
-static char __pyx_k_Count_dimension_mismatch[] = "Count dimension mismatch.";
-static char __pyx_k_Offset_dimension_mismatch[] = "Offset dimension mismatch";
-static char __pyx_k_Count_is_larger_than_shape[] = "Count is larger than shape.";
-static char __pyx_k_Step_index_is_out_of_range[] = "Step index is out of range";
+static char __pyx_k_The_size_of_Adios_file[] = " The size of Adios file. ";
+static char __pyx_k_The_last_timestep_index[] = " The last timestep index. ";
+static char __pyx_k_The_number_of_variables[] = " The number of variables. ";
+static char __pyx_k_The_number_of_attributes[] = " The number of attributes. ";
+static char __pyx_k_getitem___locals_genexpr[] = "__getitem__.<locals>.genexpr";
+static char __pyx_k_The_shape_of_the_variable[] = " The shape of the variable. ";
+static char __pyx_k_Too_many_indices_for_data[] = "Too many indices for data";
+static char __pyx_k_The_current_timestep_index[] = " The current timestep index. ";
 static char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous";
+static char __pyx_k_writer_define_var_line_1243[] = "writer.define_var (line 1243)";
+static char __pyx_k_Step_size_d_is_not_supported[] = "Step size (%d) is not supported.";
+static char __pyx_k_Name_index_r_is_not_supported[] = "Name index (%r) is not supported.";
 static char __pyx_k_WARN_Invalid_read_method_name[] = "[WARN] Invalid read method name:";
 static char __pyx_k_Data_type_is_not_supported_yet[] = "Data type is not supported yet";
-static char __pyx_k_ADIOS_is_freely_available_under[] = "\n ADIOS is freely available under the terms of the BSD license described\n in the COPYING file in the top level directory of this source distribution.\n\n Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.\n";
+static char __pyx_k_Define_a_group_associated_with[] = "\n        Define a group associated with the file.\n\n        Args:\n            gname (str): group name.\n            method (str, optional): Adios write method (default: 'POSIX1')\n            method_params (str, optional): parameters for the write method (default: '')\n\n        Example:\n\n        >>>  fw.declare_group('group', method='MPI', method_params='verbose=3')\n        \n        ";
+static char __pyx_k_Perform_read_Read_data_from_an[] = " Perform read.\n\n        Read data from an ADIOS BP file. Subset reading is\n        supported. Without any options, this will read out a whole\n        data.\n\n        Args:\n            offset (tuple of int, optional): offset (default: ())\n            count (tuple of int, optional): count (default: ())\n            from_steps (int, optional): starting step index (default: None)\n            nsteps (int, optional): number of tim [...]
+static char __pyx_k_The_attribute_type_as_in_numpy[] = " The attribute type as in numpy.dtype ";
+static char __pyx_k_writer_declare_group_line_1221[] = "writer.declare_group (line 1221)";
+static char __pyx_k_AdiosVar_varid_r_dtype_r_ndim_r[] = "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)";
+static char __pyx_k_AdiosVarinfo_name_r_ldim_r_gdim[] = "AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)";
+static char __pyx_k_Boolean_to_indicate_using_No_XM[] = " Boolean to indicate using No-XML or not. ";
+static char __pyx_k_Define_a_variable_associated_wi[] = "\n        Define a variable associated with the file.\n\n        Args:\n            varname (str): variable name.\n            ldim (tuple, optional): local dimension (default: tuple())\n            gdim (tuple, optional): global dimension (default: tuple())\n            offset (tuple, optional): offset (default: tuple())\n\n        Example:\n\n        Write 'temperature' variable of size of 2x3 array.\n\n        >>>  fw.define_var [...]
+static char __pyx_k_Dictionary_of_attributes_to_wri[] = " Dictionary of attributes to write. ";
+static char __pyx_k_Dictionary_of_variables_to_writ[] = " Dictionary of variables to write. ";
+static char __pyx_k_Indicating_reader_type_file_rea[] = " Indicating reader type; file reader or stream reader ";
+static char __pyx_k_Step_index_is_out_of_range_from[] = "Step index is out of range: from_steps=%r, nsteps=%r";
+static char __pyx_k_The_endianness_of_the_stored_da[] = " The endianness of the stored data. ";
+static char __pyx_k_The_filename_or_stream_name_ass[] = " The filename (or stream name) associated with. ";
+static char __pyx_k_The_groupname_associated_with_t[] = " The groupname associated with the file. ";
+static char __pyx_k_The_number_of_dimensions_of_the[] = " The number of dimensions of the variable. ";
+static char __pyx_k_The_number_of_time_steps_of_the[] = " The number of time steps of the variable. ";
 static char __pyx_k_Users_jyc_project_adios_devel_w[] = "/Users/jyc/project/adios-devel/wrappers/numpy/adios_mpi.pyx";
+static char __pyx_k_Variable_type_as_in_numpy_dtype[] = " Variable type as in numpy.dtype. ";
+static char __pyx_k_Warning_No_support_yet_s_type_d[] = "Warning: No support yet: %s (type=%d, bytes=%d)";
 static char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)";
+static char __pyx_k_ADIOS_ADIOS_python_module_module[] = "ADIOS: ADIOS python module\n\n.. moduleauthor:: Jong Choi <choij at ornl.gov>\n";
+static char __pyx_k_AdiosAttr_name_r_dtype_r_value_r[] = "AdiosAttr (name=%r, dtype=%r, value=%r)";
+static char __pyx_k_AdiosAttrinfo_name_r_is_static_r[] = "AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)";
+static char __pyx_k_AdiosFile_path_r_nvars_r_var_r_n[] = "AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, current_step=%r, last_step=%r, file_size=%r)";
+static char __pyx_k_AdiosWriter_fname_r_gname_r_meth[] = "AdiosWriter (fname=%r, gname=%r, method=%r, method_params=%r, var=%r, attr=%r)";
+static char __pyx_k_Count_dimension_mismatch_count_d[] = "Count dimension mismatch (count dim: %r)";
 static char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd";
 static char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported";
+static char __pyx_k_Offset_dimension_mismatch_offset[] = "Offset dimension mismatch (offset dim: %r)";
 static char __pyx_k_Only_contiguous_arrays_are_suppo[] = "Only contiguous arrays are supported.";
+static char __pyx_k_Requested_is_larger_than_the_sha[] = "Requested is larger than the shape.";
 static char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous";
 static char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short.";
 static PyObject *__pyx_kp_s_15s_d;
 static PyObject *__pyx_kp_s_15s_lu;
 static PyObject *__pyx_kp_s_15s_s;
+static PyObject *__pyx_kp_s_AdiosAttr_name_r_dtype_r_value_r;
+static PyObject *__pyx_kp_s_AdiosAttrinfo_name_r_is_static_r;
 static PyObject *__pyx_kp_s_AdiosFile;
+static PyObject *__pyx_kp_s_AdiosFile_path_r_nvars_r_var_r_n;
+static PyObject *__pyx_kp_s_AdiosVar_varid_r_dtype_r_ndim_r;
 static PyObject *__pyx_kp_s_AdiosVariable;
+static PyObject *__pyx_kp_s_AdiosVarinfo_name_r_ldim_r_gdim;
+static PyObject *__pyx_kp_s_AdiosWriter_fname_r_gname_r_meth;
 static PyObject *__pyx_n_s_BP;
 static PyObject *__pyx_n_s_BP_AGGREGATE;
 static PyObject *__pyx_n_s_BUFFER_ALLOC_WHEN;
 static PyObject *__pyx_n_s_COMM_SELF;
 static PyObject *__pyx_n_s_COMM_WORLD;
-static PyObject *__pyx_kp_s_Count_dimension_mismatch;
-static PyObject *__pyx_kp_s_Count_is_larger_than_shape;
+static PyObject *__pyx_kp_s_Count_dimension_mismatch_count_d;
 static PyObject *__pyx_n_s_DATASPACES;
 static PyObject *__pyx_n_s_DATATYPE;
 static PyObject *__pyx_n_s_DIMES;
 static PyObject *__pyx_kp_s_Data_type_is_not_supported_yet;
+static PyObject *__pyx_kp_u_Define_a_group_associated_with;
+static PyObject *__pyx_kp_u_Define_a_variable_associated_wi;
+static PyObject *__pyx_n_s_Ellipsis;
 static PyObject *__pyx_n_s_FLAG;
 static PyObject *__pyx_n_s_FLEXPATH;
 static PyObject *__pyx_kp_u_Format_string_allocated_too_shor;
 static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2;
 static PyObject *__pyx_n_s_ICEE;
+static PyObject *__pyx_n_s_IndexError;
+static PyObject *__pyx_n_s_KeyError;
 static PyObject *__pyx_n_s_LATER;
 static PyObject *__pyx_n_s_MPI;
 static PyObject *__pyx_n_s_NO;
 static PyObject *__pyx_n_s_NOW;
+static PyObject *__pyx_kp_s_Name_index_r_is_not_supported;
 static PyObject *__pyx_kp_s_No_valid_variable;
 static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor;
+static PyObject *__pyx_n_s_NotImplementedError;
 static PyObject *__pyx_kp_s_Not_a_valid_var;
 static PyObject *__pyx_kp_s_Not_an_open_file;
 static PyObject *__pyx_kp_s_Not_an_open_var;
 static PyObject *__pyx_kp_s_Not_an_open_variable;
-static PyObject *__pyx_kp_s_Offset_dimension_mismatch;
+static PyObject *__pyx_kp_s_Offset_dimension_mismatch_offset;
 static PyObject *__pyx_kp_s_Only_contiguous_arrays_are_suppo;
+static PyObject *__pyx_kp_u_Perform_read_Read_data_from_an;
+static PyObject *__pyx_n_s_READ_METHOD;
 static PyObject *__pyx_kp_s_Reading;
+static PyObject *__pyx_kp_s_Requested_is_larger_than_the_sha;
 static PyObject *__pyx_n_s_RuntimeError;
-static PyObject *__pyx_kp_s_Step_index_is_out_of_range;
+static PyObject *__pyx_n_s_S;
+static PyObject *__pyx_kp_s_Step_index_is_out_of_range_from;
+static PyObject *__pyx_kp_s_Step_size_d_is_not_supported;
+static PyObject *__pyx_kp_s_Too_many_indices_for_data;
+static PyObject *__pyx_n_s_TypeError;
 static PyObject *__pyx_n_s_UNKNOWN;
+static PyObject *__pyx_kp_s_Unhashable_type;
 static PyObject *__pyx_kp_s_Use_default_BP_method;
 static PyObject *__pyx_kp_s_Users_jyc_project_adios_devel_w;
 static PyObject *__pyx_n_s_ValueError;
+static PyObject *__pyx_kp_s_Value_is_none;
 static PyObject *__pyx_kp_s_WARN_Invalid_read_method_name;
+static PyObject *__pyx_kp_s_Warning_No_support_yet_s_type_d;
 static PyObject *__pyx_n_s_YES;
-static PyObject *__pyx_n_s__17;
-static PyObject *__pyx_kp_s__8;
+static PyObject *__pyx_kp_s__11;
+static PyObject *__pyx_kp_s__31;
+static PyObject *__pyx_kp_s__33;
+static PyObject *__pyx_n_s__45;
+static PyObject *__pyx_kp_s__7;
 static PyObject *__pyx_n_s_adios_mpi;
 static PyObject *__pyx_n_s_advance;
-static PyObject *__pyx_n_s_all;
+static PyObject *__pyx_n_s_any;
+static PyObject *__pyx_n_s_args;
 static PyObject *__pyx_n_s_array;
 static PyObject *__pyx_n_s_attr_namelist;
+static PyObject *__pyx_n_s_attrname;
 static PyObject *__pyx_n_s_attrs;
+static PyObject *__pyx_n_s_atype;
 static PyObject *__pyx_n_s_base_path;
 static PyObject *__pyx_n_s_bool;
 static PyObject *__pyx_n_s_bpls;
 static PyObject *__pyx_n_s_buffer_size;
 static PyObject *__pyx_n_s_byte;
 static PyObject *__pyx_kp_s_bytes;
+static PyObject *__pyx_n_s_bytes_2;
+static PyObject *__pyx_n_s_char;
 static PyObject *__pyx_n_s_close;
 static PyObject *__pyx_n_s_comm;
 static PyObject *__pyx_n_s_complex;
@@ -2008,6 +2513,7 @@ static PyObject *__pyx_n_s_copy;
 static PyObject *__pyx_n_s_count;
 static PyObject *__pyx_n_s_current_step;
 static PyObject *__pyx_n_s_data_size;
+static PyObject *__pyx_n_s_define;
 static PyObject *__pyx_n_s_dimensions;
 static PyObject *__pyx_n_s_dims;
 static PyObject *__pyx_n_s_doc;
@@ -2017,6 +2523,7 @@ static PyObject *__pyx_n_s_dtype;
 static PyObject *__pyx_n_s_end;
 static PyObject *__pyx_n_s_endianness;
 static PyObject *__pyx_n_s_f;
+static PyObject *__pyx_n_s_factory;
 static PyObject *__pyx_n_s_fd_p;
 static PyObject *__pyx_n_s_fh;
 static PyObject *__pyx_n_s_file;
@@ -2031,22 +2538,35 @@ static PyObject *__pyx_n_s_float64;
 static PyObject *__pyx_n_s_fname;
 static PyObject *__pyx_n_s_fp;
 static PyObject *__pyx_n_s_from_steps;
+static PyObject *__pyx_n_s_gdim;
+static PyObject *__pyx_n_s_genexpr;
+static PyObject *__pyx_n_s_get;
+static PyObject *__pyx_n_s_getitem___locals_genexpr;
 static PyObject *__pyx_n_s_global_dimensions;
+static PyObject *__pyx_n_s_gname;
 static PyObject *__pyx_n_s_group;
 static PyObject *__pyx_n_s_group_id;
 static PyObject *__pyx_n_s_group_name;
 static PyObject *__pyx_n_s_import;
+static PyObject *__pyx_n_s_index;
+static PyObject *__pyx_n_s_indices;
+static PyObject *__pyx_n_s_init;
 static PyObject *__pyx_n_s_int16;
 static PyObject *__pyx_n_s_int32;
 static PyObject *__pyx_n_s_int64;
 static PyObject *__pyx_n_s_int8;
 static PyObject *__pyx_n_s_integer;
+static PyObject *__pyx_n_s_is_noxml;
+static PyObject *__pyx_n_s_is_static;
 static PyObject *__pyx_n_s_is_stream;
 static PyObject *__pyx_n_s_itemsize;
+static PyObject *__pyx_n_s_iteritems;
 static PyObject *__pyx_n_s_iterkeys;
 static PyObject *__pyx_n_s_k;
+static PyObject *__pyx_n_s_keys;
 static PyObject *__pyx_n_s_last;
 static PyObject *__pyx_n_s_last_step;
+static PyObject *__pyx_n_s_ldim;
 static PyObject *__pyx_n_s_local_offsets;
 static PyObject *__pyx_n_s_lock_mode;
 static PyObject *__pyx_n_s_long;
@@ -2055,6 +2575,7 @@ static PyObject *__pyx_n_s_main;
 static PyObject *__pyx_n_s_metaclass;
 static PyObject *__pyx_n_s_method;
 static PyObject *__pyx_n_s_method_name;
+static PyObject *__pyx_n_s_method_params;
 static PyObject *__pyx_n_s_mode;
 static PyObject *__pyx_n_s_module;
 static PyObject *__pyx_n_s_mpi4py_MPI;
@@ -2080,13 +2601,25 @@ static PyObject *__pyx_n_s_range;
 static PyObject *__pyx_n_s_read;
 static PyObject *__pyx_n_s_readvar;
 static PyObject *__pyx_n_s_real;
+static PyObject *__pyx_n_s_replace;
+static PyObject *__pyx_n_s_send;
+static PyObject *__pyx_n_s_setitem;
+static PyObject *__pyx_n_s_shape;
 static PyObject *__pyx_n_s_short;
 static PyObject *__pyx_n_s_size;
 static PyObject *__pyx_n_s_split;
+static PyObject *__pyx_n_s_squeeze;
 static PyObject *__pyx_n_s_stats;
+static PyObject *__pyx_n_s_step;
 static PyObject *__pyx_n_s_str;
 static PyObject *__pyx_n_s_string;
+static PyObject *__pyx_n_s_string_array;
+static PyObject *__pyx_n_s_strip;
+static PyObject *__pyx_n_s_strlen;
+static PyObject *__pyx_n_s_subtract;
+static PyObject *__pyx_n_s_t;
 static PyObject *__pyx_n_s_test;
+static PyObject *__pyx_n_s_throw;
 static PyObject *__pyx_n_s_time_index;
 static PyObject *__pyx_n_s_time_steps;
 static PyObject *__pyx_n_s_timeout_sec;
@@ -2104,18 +2637,26 @@ static PyObject *__pyx_n_s_unsigned_short;
 static PyObject *__pyx_n_s_v;
 static PyObject *__pyx_n_s_val;
 static PyObject *__pyx_n_s_value;
+static PyObject *__pyx_n_s_values;
 static PyObject *__pyx_n_s_var;
 static PyObject *__pyx_n_s_var_namelist;
+static PyObject *__pyx_kp_u_var_read_line_887;
 static PyObject *__pyx_n_s_varid;
 static PyObject *__pyx_n_s_varname;
 static PyObject *__pyx_n_s_vars;
 static PyObject *__pyx_n_s_version;
 static PyObject *__pyx_n_s_vp;
 static PyObject *__pyx_n_s_when;
+static PyObject *__pyx_n_s_write;
+static PyObject *__pyx_kp_u_writer_declare_group_line_1221;
+static PyObject *__pyx_kp_u_writer_define_var_line_1243;
+static PyObject *__pyx_n_s_xrange;
 static PyObject *__pyx_n_s_zeros;
+static PyObject *__pyx_n_s_zip;
 static PyObject *__pyx_int_0;
 static PyObject *__pyx_int_1;
 static PyObject *__pyx_int_2;
+static PyObject *__pyx_int_3;
 static PyObject *__pyx_int_4;
 static PyObject *__pyx_int_5;
 static PyObject *__pyx_int_6;
@@ -2123,102 +2664,499 @@ static PyObject *__pyx_int_7;
 static PyObject *__pyx_int_9;
 static PyObject *__pyx_int_10;
 static PyObject *__pyx_int_11;
+static PyObject *__pyx_int_12;
 static PyObject *__pyx_int_50;
 static PyObject *__pyx_int_51;
 static PyObject *__pyx_int_52;
 static PyObject *__pyx_int_54;
 static PyObject *__pyx_int_neg_1;
-static struct PyMPICommObject *__pyx_k_;
-static struct PyMPICommObject *__pyx_k__2;
-static struct PyMPICommObject *__pyx_k__3;
+static struct PyMPICommObject *__pyx_k__4;
 static struct PyMPICommObject *__pyx_k__5;
 static struct PyMPICommObject *__pyx_k__6;
-static ADIOS_LOCKMODE __pyx_k__7;
-static PyObject *__pyx_tuple__9;
-static PyObject *__pyx_tuple__10;
-static PyObject *__pyx_tuple__11;
+static struct PyMPICommObject *__pyx_k__8;
+static struct PyMPICommObject *__pyx_k__9;
+static ADIOS_LOCKMODE __pyx_k__10;
+static struct PyMPICommObject *__pyx_k__22;
+static PyObject *__pyx_k__23;
+static PyObject *__pyx_k__24;
+static PyObject *__pyx_k__25;
+static PyObject *__pyx_k__27;
+static PyObject *__pyx_k__28;
+static PyObject *__pyx_k__29;
+static PyObject *__pyx_slice_;
+static PyObject *__pyx_slice__2;
+static PyObject *__pyx_tuple__3;
+static PyObject *__pyx_slice__16;
+static PyObject *__pyx_slice__19;
+static PyObject *__pyx_slice__20;
+static PyObject *__pyx_slice__21;
 static PyObject *__pyx_tuple__12;
 static PyObject *__pyx_tuple__13;
 static PyObject *__pyx_tuple__14;
 static PyObject *__pyx_tuple__15;
-static PyObject *__pyx_tuple__16;
+static PyObject *__pyx_tuple__17;
 static PyObject *__pyx_tuple__18;
-static PyObject *__pyx_tuple__20;
-static PyObject *__pyx_codeobj__19;
-static PyObject *__pyx_codeobj__21;
+static PyObject *__pyx_tuple__26;
+static PyObject *__pyx_tuple__30;
+static PyObject *__pyx_tuple__32;
+static PyObject *__pyx_tuple__34;
+static PyObject *__pyx_tuple__35;
+static PyObject *__pyx_tuple__36;
+static PyObject *__pyx_tuple__37;
+static PyObject *__pyx_tuple__38;
+static PyObject *__pyx_tuple__39;
+static PyObject *__pyx_tuple__40;
+static PyObject *__pyx_tuple__41;
+static PyObject *__pyx_tuple__42;
+static PyObject *__pyx_tuple__43;
+static PyObject *__pyx_tuple__44;
+static PyObject *__pyx_tuple__46;
+static PyObject *__pyx_tuple__48;
+static PyObject *__pyx_codeobj__47;
+static PyObject *__pyx_codeobj__49;
+
+/* "adios_mpi.pyx":19
+ * from cpython.string cimport PyString_AsString
+ * 
+ * cdef char ** to_cstring_array(list_str):             # <<<<<<<<<<<<<<
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+ *     for i in xrange(len(list_str)):
+ */
+
+static char **__pyx_f_9adios_mpi_to_cstring_array(PyObject *__pyx_v_list_str) {
+  char **__pyx_v_ret;
+  Py_ssize_t __pyx_v_i;
+  char **__pyx_r;
+  __Pyx_RefNannyDeclarations
+  Py_ssize_t __pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  char *__pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("to_cstring_array", 0);
+
+  /* "adios_mpi.pyx":20
+ * 
+ * cdef char ** to_cstring_array(list_str):
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))             # <<<<<<<<<<<<<<
+ *     for i in xrange(len(list_str)):
+ *         ret[i] = PyString_AsString(list_str[i])
+ */
+  __pyx_t_1 = PyObject_Length(__pyx_v_list_str); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_ret = ((char **)malloc((__pyx_t_1 * (sizeof(char *)))));
+
+  /* "adios_mpi.pyx":21
+ * cdef char ** to_cstring_array(list_str):
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+ *     for i in xrange(len(list_str)):             # <<<<<<<<<<<<<<
+ *         ret[i] = PyString_AsString(list_str[i])
+ *     return ret
+ */
+  __pyx_t_1 = PyObject_Length(__pyx_v_list_str); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
+    __pyx_v_i = __pyx_t_2;
+
+    /* "adios_mpi.pyx":22
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+ *     for i in xrange(len(list_str)):
+ *         ret[i] = PyString_AsString(list_str[i])             # <<<<<<<<<<<<<<
+ *     return ret
+ * 
+ */
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_list_str, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = PyString_AsString(__pyx_t_3); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    (__pyx_v_ret[__pyx_v_i]) = __pyx_t_4;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
 
-/* "adios_mpi.pyx":258
+  /* "adios_mpi.pyx":23
+ *     for i in xrange(len(list_str)):
+ *         ret[i] = PyString_AsString(list_str[i])
+ *     return ret             # <<<<<<<<<<<<<<
+ * 
  * ## ====================
+ */
+  __pyx_r = __pyx_v_ret;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":19
+ * from cpython.string cimport PyString_AsString
  * 
- * cpdef init(char * config, MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
- *     return adios_init(config, comm.ob_mpi)
+ * cdef char ** to_cstring_array(list_str):             # <<<<<<<<<<<<<<
+ *     cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+ *     for i in xrange(len(list_str)):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_WriteUnraisable("adios_mpi.to_cstring_array", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":277
  * 
+ * 
+ * cpdef __parse_index(index, ndim):             # <<<<<<<<<<<<<<
+ *     # Fix index, handling ellipsis and incomplete slices.
+ *     if not isinstance(index, tuple):
  */
 
-static PyObject *__pyx_pw_9adios_mpi_1init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_f_9adios_mpi_init(char *__pyx_v_config, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_init *__pyx_optional_args) {
-  struct PyMPICommObject *__pyx_v_comm = __pyx_k_;
+static PyObject *__pyx_pw_9adios_mpi_1__parse_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_9adios_mpi___parse_index(PyObject *__pyx_v_index, PyObject *__pyx_v_ndim, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyObject *__pyx_v_fixed = NULL;
+  PyObject *__pyx_v_length = NULL;
+  PyObject *__pyx_v_slice_ = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  PyObject *(*__pyx_t_5)(PyObject *);
+  PyObject *__pyx_t_6 = NULL;
+  Py_ssize_t __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  int __pyx_t_10;
+  int __pyx_t_11;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("init", 0);
-  if (__pyx_optional_args) {
-    if (__pyx_optional_args->__pyx_n > 0) {
-      __pyx_v_comm = __pyx_optional_args->comm;
+  __Pyx_RefNannySetupContext("__parse_index", 0);
+  __Pyx_INCREF(__pyx_v_index);
+
+  /* "adios_mpi.pyx":279
+ * cpdef __parse_index(index, ndim):
+ *     # Fix index, handling ellipsis and incomplete slices.
+ *     if not isinstance(index, tuple):             # <<<<<<<<<<<<<<
+ *         index = (index,)
+ * 
+ */
+  __pyx_t_1 = PyTuple_Check(__pyx_v_index); 
+  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
+  if (__pyx_t_2) {
+
+    /* "adios_mpi.pyx":280
+ *     # Fix index, handling ellipsis and incomplete slices.
+ *     if not isinstance(index, tuple):
+ *         index = (index,)             # <<<<<<<<<<<<<<
+ * 
+ *     fixed = []
+ */
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(__pyx_v_index);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index);
+    __Pyx_GIVEREF(__pyx_v_index);
+    __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios_mpi.pyx":282
+ *         index = (index,)
+ * 
+ *     fixed = []             # <<<<<<<<<<<<<<
+ *     length = len(index)
+ * 
+ */
+  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_fixed = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "adios_mpi.pyx":283
+ * 
+ *     fixed = []
+ *     length = len(index)             # <<<<<<<<<<<<<<
+ * 
+ *     for slice_ in index:
+ */
+  __pyx_t_4 = PyObject_Length(__pyx_v_index); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_length = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios_mpi.pyx":285
+ *     length = len(index)
+ * 
+ *     for slice_ in index:             # <<<<<<<<<<<<<<
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ */
+  if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) {
+    __pyx_t_3 = __pyx_v_index; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0;
+    __pyx_t_5 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  for (;;) {
+    if (likely(!__pyx_t_5)) {
+      if (likely(PyList_CheckExact(__pyx_t_3))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_3)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_6); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_6 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_6); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_6 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_6 = __pyx_t_5(__pyx_t_3);
+      if (unlikely(!__pyx_t_6)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_6);
+    }
+    __Pyx_XDECREF_SET(__pyx_v_slice_, __pyx_t_6);
+    __pyx_t_6 = 0;
+
+    /* "adios_mpi.pyx":286
+ * 
+ *     for slice_ in index:
+ *         if slice_ is Ellipsis:             # <<<<<<<<<<<<<<
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ *         elif isinstance(slice_, (int, long)):
+ */
+    __pyx_t_2 = (__pyx_v_slice_ == __pyx_builtin_Ellipsis);
+    __pyx_t_1 = (__pyx_t_2 != 0);
+    if (__pyx_t_1) {
+
+      /* "adios_mpi.pyx":287
+ *     for slice_ in index:
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))             # <<<<<<<<<<<<<<
+ *         elif isinstance(slice_, (int, long)):
+ *             fixed.append(slice(slice_, slice_+1, None))
+ */
+      __pyx_t_6 = PyNumber_Subtract(__pyx_v_ndim, __pyx_v_length); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_7 = PyList_GET_SIZE(__pyx_v_fixed); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_9 = PyNumber_Subtract(__pyx_t_6, __pyx_t_8); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyNumber_Add(__pyx_t_9, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_INCREF(__pyx_slice_);
+      PyList_SET_ITEM(__pyx_t_9, 0, __pyx_slice_);
+      __Pyx_GIVEREF(__pyx_slice_);
+      { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_9, __pyx_t_8); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_temp);
+        __Pyx_DECREF(__pyx_t_9);
+        __pyx_t_9 = __pyx_temp;
+      }
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_10 = __Pyx_PyList_Extend(__pyx_v_fixed, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      goto __pyx_L6;
+    }
+
+    /* "adios_mpi.pyx":288
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ *         elif isinstance(slice_, (int, long)):             # <<<<<<<<<<<<<<
+ *             fixed.append(slice(slice_, slice_+1, None))
+ *         else:
+ */
+    __pyx_t_2 = PyInt_Check(__pyx_v_slice_); 
+    __pyx_t_11 = (__pyx_t_2 != 0);
+    if (!__pyx_t_11) {
+    } else {
+      __pyx_t_1 = __pyx_t_11;
+      goto __pyx_L7_bool_binop_done;
     }
+    __pyx_t_11 = PyLong_Check(__pyx_v_slice_); 
+    __pyx_t_2 = (__pyx_t_11 != 0);
+    __pyx_t_1 = __pyx_t_2;
+    __pyx_L7_bool_binop_done:;
+    __pyx_t_2 = (__pyx_t_1 != 0);
+    if (__pyx_t_2) {
+
+      /* "adios_mpi.pyx":289
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ *         elif isinstance(slice_, (int, long)):
+ *             fixed.append(slice(slice_, slice_+1, None))             # <<<<<<<<<<<<<<
+ *         else:
+ *             fixed.append(slice_)
+ */
+      __pyx_t_9 = PyNumber_Add(__pyx_v_slice_, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_8 = PySlice_New(__pyx_v_slice_, __pyx_t_9, Py_None); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_fixed, __pyx_t_8); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L6;
+    }
+    /*else*/ {
+
+      /* "adios_mpi.pyx":291
+ *             fixed.append(slice(slice_, slice_+1, None))
+ *         else:
+ *             fixed.append(slice_)             # <<<<<<<<<<<<<<
+ *         length -= 1
+ * 
+ */
+      __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_fixed, __pyx_v_slice_); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_L6:;
+
+    /* "adios_mpi.pyx":292
+ *         else:
+ *             fixed.append(slice_)
+ *         length -= 1             # <<<<<<<<<<<<<<
+ * 
+ *     index = tuple(fixed)
+ */
+    __pyx_t_8 = PyNumber_InPlaceSubtract(__pyx_v_length, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF_SET(__pyx_v_length, __pyx_t_8);
+    __pyx_t_8 = 0;
+
+    /* "adios_mpi.pyx":285
+ *     length = len(index)
+ * 
+ *     for slice_ in index:             # <<<<<<<<<<<<<<
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+ */
   }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "adios_mpi.pyx":259
+  /* "adios_mpi.pyx":294
+ *         length -= 1
  * 
- * cpdef init(char * config, MPI.Comm comm = MPI.COMM_WORLD):
- *     return adios_init(config, comm.ob_mpi)             # <<<<<<<<<<<<<<
+ *     index = tuple(fixed)             # <<<<<<<<<<<<<<
+ *     if len(index) < ndim:
+ *         index += (slice(None),) * (ndim-len(index))
+ */
+  __pyx_t_3 = PyList_AsTuple(__pyx_v_fixed); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "adios_mpi.pyx":295
  * 
- * cpdef int64_t open(char * group_name,
+ *     index = tuple(fixed)
+ *     if len(index) < ndim:             # <<<<<<<<<<<<<<
+ *         index += (slice(None),) * (ndim-len(index))
+ * 
+ */
+  __pyx_t_4 = PyObject_Length(__pyx_v_index); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_8 = PyObject_RichCompare(__pyx_t_3, __pyx_v_ndim, Py_LT); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  if (__pyx_t_2) {
+
+    /* "adios_mpi.pyx":296
+ *     index = tuple(fixed)
+ *     if len(index) < ndim:
+ *         index += (slice(None),) * (ndim-len(index))             # <<<<<<<<<<<<<<
+ * 
+ *     return index
+ */
+    __pyx_t_4 = PyObject_Length(__pyx_v_index); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_3 = PyNumber_Subtract(__pyx_v_ndim, __pyx_t_8); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __pyx_t_8 = PyNumber_Multiply(__pyx_tuple__3, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_index, __pyx_t_8); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L9;
+  }
+  __pyx_L9:;
+
+  /* "adios_mpi.pyx":298
+ *         index += (slice(None),) * (ndim-len(index))
+ * 
+ *     return index             # <<<<<<<<<<<<<<
+ * 
+ * ## ====================
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(adios_init(__pyx_v_config, __pyx_v_comm->ob_mpi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __Pyx_INCREF(__pyx_v_index);
+  __pyx_r = __pyx_v_index;
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":258
- * ## ====================
+  /* "adios_mpi.pyx":277
  * 
- * cpdef init(char * config, MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
- *     return adios_init(config, comm.ob_mpi)
  * 
+ * cpdef __parse_index(index, ndim):             # <<<<<<<<<<<<<<
+ *     # Fix index, handling ellipsis and incomplete slices.
+ *     if not isinstance(index, tuple):
  */
 
   /* function exit code */
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("adios_mpi.__parse_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_fixed);
+  __Pyx_XDECREF(__pyx_v_length);
+  __Pyx_XDECREF(__pyx_v_slice_);
+  __Pyx_XDECREF(__pyx_v_index);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_1init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_1init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  char *__pyx_v_config;
-  struct PyMPICommObject *__pyx_v_comm = 0;
+static PyObject *__pyx_pw_9adios_mpi_1__parse_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi___parse_index[] = "__parse_index(index, ndim)";
+static PyObject *__pyx_pw_9adios_mpi_1__parse_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_index = 0;
+  PyObject *__pyx_v_ndim = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("init (wrapper)", 0);
+  __Pyx_RefNannySetupContext("__parse_index (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_config,&__pyx_n_s_comm,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_index,&__pyx_n_s_ndim,0};
     PyObject* values[2] = {0,0};
-    values[1] = (PyObject *)__pyx_k_;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -2231,61 +3169,51 @@ static PyObject *__pyx_pw_9adios_mpi_1init(PyObject *__pyx_self, PyObject *__pyx
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_config)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_index)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
-          if (value) { values[1] = value; kw_args--; }
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ndim)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("__parse_index", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__parse_index") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
     } else {
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        break;
-        default: goto __pyx_L5_argtuple_error;
-      }
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_config = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_config) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_comm = ((struct PyMPICommObject *)values[1]);
+    __pyx_v_index = values[0];
+    __pyx_v_ndim = values[1];
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("init", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__parse_index", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
-  __Pyx_AddTraceback("adios_mpi.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.__parse_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_9adios_mpi_init(__pyx_self, __pyx_v_config, __pyx_v_comm);
+  __pyx_r = __pyx_pf_9adios_mpi___parse_index(__pyx_self, __pyx_v_index, __pyx_v_ndim);
 
   /* function exit code */
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_config, struct PyMPICommObject *__pyx_v_comm) {
+static PyObject *__pyx_pf_9adios_mpi___parse_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_index, PyObject *__pyx_v_ndim) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  struct __pyx_opt_args_9adios_mpi_init __pyx_t_2;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("init", 0);
+  __Pyx_RefNannySetupContext("__parse_index", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2.__pyx_n = 1;
-  __pyx_t_2.comm = __pyx_v_comm;
-  __pyx_t_1 = __pyx_f_9adios_mpi_init(__pyx_v_config, 0, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_9adios_mpi___parse_index(__pyx_v_index, __pyx_v_ndim, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2294,7 +3222,7 @@ static PyObject *__pyx_pf_9adios_mpi_init(CYTHON_UNUSED PyObject *__pyx_self, ch
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.__parse_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -2302,48 +3230,204 @@ static PyObject *__pyx_pf_9adios_mpi_init(CYTHON_UNUSED PyObject *__pyx_self, ch
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":261
+/* "adios_mpi.pyx":304
+ * ## ====================
+ * 
+ * cpdef init(char * config, MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
  *     return adios_init(config, comm.ob_mpi)
  * 
- * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
- *                    char * name,
- *                    char * mode,
  */
 
-static PyObject *__pyx_pw_9adios_mpi_3open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int64_t __pyx_f_9adios_mpi_open(char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_open *__pyx_optional_args) {
-  struct PyMPICommObject *__pyx_v_comm = __pyx_k__2;
-  int64_t __pyx_v_fd;
-  CYTHON_UNUSED int __pyx_v_result;
-  int64_t __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_3init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_init(char *__pyx_v_config, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_init *__pyx_optional_args) {
+  struct PyMPICommObject *__pyx_v_comm = __pyx_k__4;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("open", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("init", 0);
   if (__pyx_optional_args) {
     if (__pyx_optional_args->__pyx_n > 0) {
       __pyx_v_comm = __pyx_optional_args->comm;
     }
   }
 
-  /* "adios_mpi.pyx":267
- *     cdef int64_t fd
- *     cdef int result
- *     result = adios_open(&fd, group_name, name, mode, comm.ob_mpi)             # <<<<<<<<<<<<<<
- *     return fd
+  /* "adios_mpi.pyx":305
  * 
- */
-  __pyx_v_result = adios_open((&__pyx_v_fd), __pyx_v_group_name, __pyx_v_name, __pyx_v_mode, __pyx_v_comm->ob_mpi);
-
-  /* "adios_mpi.pyx":268
- *     cdef int result
- *     result = adios_open(&fd, group_name, name, mode, comm.ob_mpi)
- *     return fd             # <<<<<<<<<<<<<<
+ * cpdef init(char * config, MPI.Comm comm = MPI.COMM_WORLD):
+ *     return adios_init(config, comm.ob_mpi)             # <<<<<<<<<<<<<<
  * 
- * cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):
+ * cpdef int64_t open(char * group_name,
  */
-  __pyx_r = __pyx_v_fd;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(adios_init(__pyx_v_config, __pyx_v_comm->ob_mpi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":261
+  /* "adios_mpi.pyx":304
+ * ## ====================
+ * 
+ * cpdef init(char * config, MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
+ *     return adios_init(config, comm.ob_mpi)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_3init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_2init[] = "init(char *config, Comm comm=MPI.COMM_WORLD)";
+static PyObject *__pyx_pw_9adios_mpi_3init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_config;
+  struct PyMPICommObject *__pyx_v_comm = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("init (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_config,&__pyx_n_s_comm,0};
+    PyObject* values[2] = {0,0};
+    values[1] = (PyObject *)__pyx_k__4;
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_config)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
+          if (value) { values[1] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_config = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_config) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_comm = ((struct PyMPICommObject *)values[1]);
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("init", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_2init(__pyx_self, __pyx_v_config, __pyx_v_comm);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_2init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_config, struct PyMPICommObject *__pyx_v_comm) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  struct __pyx_opt_args_9adios_mpi_init __pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("init", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2.__pyx_n = 1;
+  __pyx_t_2.comm = __pyx_v_comm;
+  __pyx_t_1 = __pyx_f_9adios_mpi_init(__pyx_v_config, 0, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":307
+ *     return adios_init(config, comm.ob_mpi)
+ * 
+ * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
+ *                    char * name,
+ *                    char * mode,
+ */
+
+static PyObject *__pyx_pw_9adios_mpi_5open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int64_t __pyx_f_9adios_mpi_open(char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_open *__pyx_optional_args) {
+  struct PyMPICommObject *__pyx_v_comm = __pyx_k__5;
+  int64_t __pyx_v_fd;
+  CYTHON_UNUSED int __pyx_v_result;
+  int64_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("open", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_comm = __pyx_optional_args->comm;
+    }
+  }
+
+  /* "adios_mpi.pyx":313
+ *     cdef int64_t fd
+ *     cdef int result
+ *     result = adios_open(&fd, group_name, name, mode, comm.ob_mpi)             # <<<<<<<<<<<<<<
+ *     return fd
+ * 
+ */
+  __pyx_v_result = adios_open((&__pyx_v_fd), __pyx_v_group_name, __pyx_v_name, __pyx_v_mode, __pyx_v_comm->ob_mpi);
+
+  /* "adios_mpi.pyx":314
+ *     cdef int result
+ *     result = adios_open(&fd, group_name, name, mode, comm.ob_mpi)
+ *     return fd             # <<<<<<<<<<<<<<
+ * 
+ * cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):
+ */
+  __pyx_r = __pyx_v_fd;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":307
  *     return adios_init(config, comm.ob_mpi)
  * 
  * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
@@ -2358,8 +3442,9 @@ static int64_t __pyx_f_9adios_mpi_open(char *__pyx_v_group_name, char *__pyx_v_n
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_3open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_3open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_5open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_4open[] = "open(char *group_name, char *name, char *mode, Comm comm=MPI.COMM_WORLD) -> int64_t";
+static PyObject *__pyx_pw_9adios_mpi_5open(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_group_name;
   char *__pyx_v_name;
   char *__pyx_v_mode;
@@ -2373,7 +3458,7 @@ static PyObject *__pyx_pw_9adios_mpi_3open(PyObject *__pyx_self, PyObject *__pyx
   {
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group_name,&__pyx_n_s_name,&__pyx_n_s_mode,&__pyx_n_s_comm,0};
     PyObject* values[4] = {0,0,0,0};
-    values[3] = (PyObject *)__pyx_k__2;
+    values[3] = (PyObject *)__pyx_k__5;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -2393,12 +3478,12 @@ static PyObject *__pyx_pw_9adios_mpi_3open(PyObject *__pyx_self, PyObject *__pyx
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_mode)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
         if (kw_args > 0) {
@@ -2407,7 +3492,7 @@ static PyObject *__pyx_pw_9adios_mpi_3open(PyObject *__pyx_self, PyObject *__pyx
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "open") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "open") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -2419,21 +3504,21 @@ static PyObject *__pyx_pw_9adios_mpi_3open(PyObject *__pyx_self, PyObject *__pyx
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_group_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_group_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_mode = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_mode) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_group_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_group_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_mode = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_mode) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_comm = ((struct PyMPICommObject *)values[3]);
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("open", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.open", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_9adios_mpi_2open(__pyx_self, __pyx_v_group_name, __pyx_v_name, __pyx_v_mode, __pyx_v_comm);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_4open(__pyx_self, __pyx_v_group_name, __pyx_v_name, __pyx_v_mode, __pyx_v_comm);
 
   /* function exit code */
   goto __pyx_L0;
@@ -2444,7 +3529,7 @@ static PyObject *__pyx_pw_9adios_mpi_3open(PyObject *__pyx_self, PyObject *__pyx
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_2open(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, struct PyMPICommObject *__pyx_v_comm) {
+static PyObject *__pyx_pf_9adios_mpi_4open(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_group_name, char *__pyx_v_name, char *__pyx_v_mode, struct PyMPICommObject *__pyx_v_comm) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int64_t __pyx_t_1;
@@ -2458,7 +3543,7 @@ static PyObject *__pyx_pf_9adios_mpi_2open(CYTHON_UNUSED PyObject *__pyx_self, c
   __pyx_t_2.__pyx_n = 1;
   __pyx_t_2.comm = __pyx_v_comm;
   __pyx_t_1 = __pyx_f_9adios_mpi_open(__pyx_v_group_name, __pyx_v_name, __pyx_v_mode, 0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -2475,7 +3560,7 @@ static PyObject *__pyx_pf_9adios_mpi_2open(CYTHON_UNUSED PyObject *__pyx_self, c
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":270
+/* "adios_mpi.pyx":316
  *     return fd
  * 
  * cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):             # <<<<<<<<<<<<<<
@@ -2483,7 +3568,7 @@ static PyObject *__pyx_pf_9adios_mpi_2open(CYTHON_UNUSED PyObject *__pyx_self, c
  *     cdef int result
  */
 
-static PyObject *__pyx_pw_9adios_mpi_5set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_7set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int64_t __pyx_f_9adios_mpi_set_group_size(int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size, CYTHON_UNUSED int __pyx_skip_dispatch) {
   uint64_t __pyx_v_total_size;
   CYTHON_UNUSED int __pyx_v_result;
@@ -2491,7 +3576,7 @@ static int64_t __pyx_f_9adios_mpi_set_group_size(int64_t __pyx_v_fd_p, uint64_t
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("set_group_size", 0);
 
-  /* "adios_mpi.pyx":273
+  /* "adios_mpi.pyx":319
  *     cdef uint64_t total_size
  *     cdef int result
  *     result = adios_group_size(fd_p, data_size, &total_size)             # <<<<<<<<<<<<<<
@@ -2500,17 +3585,17 @@ static int64_t __pyx_f_9adios_mpi_set_group_size(int64_t __pyx_v_fd_p, uint64_t
  */
   __pyx_v_result = adios_group_size(__pyx_v_fd_p, __pyx_v_data_size, (&__pyx_v_total_size));
 
-  /* "adios_mpi.pyx":274
+  /* "adios_mpi.pyx":320
  *     cdef int result
  *     result = adios_group_size(fd_p, data_size, &total_size)
  *     return total_size             # <<<<<<<<<<<<<<
  * 
- * cpdef int write (int64_t fd_p, char * name, np.ndarray val):
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):
  */
   __pyx_r = __pyx_v_total_size;
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":270
+  /* "adios_mpi.pyx":316
  *     return fd
  * 
  * cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):             # <<<<<<<<<<<<<<
@@ -2525,8 +3610,9 @@ static int64_t __pyx_f_9adios_mpi_set_group_size(int64_t __pyx_v_fd_p, uint64_t
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_5set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_5set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_7set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_6set_group_size[] = "set_group_size(int64_t fd_p, uint64_t data_size) -> int64_t";
+static PyObject *__pyx_pw_9adios_mpi_7set_group_size(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   uint64_t __pyx_v_data_size;
   int __pyx_lineno = 0;
@@ -2555,11 +3641,11 @@ static PyObject *__pyx_pw_9adios_mpi_5set_group_size(PyObject *__pyx_self, PyObj
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_data_size)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("set_group_size", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("set_group_size", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_group_size") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_group_size") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -2567,25 +3653,25 @@ static PyObject *__pyx_pw_9adios_mpi_5set_group_size(PyObject *__pyx_self, PyObj
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_data_size = __Pyx_PyInt_As_uint64_t(values[1]); if (unlikely((__pyx_v_data_size == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_data_size = __Pyx_PyInt_As_uint64_t(values[1]); if (unlikely((__pyx_v_data_size == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("set_group_size", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("set_group_size", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.set_group_size", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_4set_group_size(__pyx_self, __pyx_v_fd_p, __pyx_v_data_size);
+  __pyx_r = __pyx_pf_9adios_mpi_6set_group_size(__pyx_self, __pyx_v_fd_p, __pyx_v_data_size);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4set_group_size(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size) {
+static PyObject *__pyx_pf_9adios_mpi_6set_group_size(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, uint64_t __pyx_v_data_size) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2594,7 +3680,7 @@ static PyObject *__pyx_pf_9adios_mpi_4set_group_size(CYTHON_UNUSED PyObject *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set_group_size", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int64_t(__pyx_f_9adios_mpi_set_group_size(__pyx_v_fd_p, __pyx_v_data_size, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int64_t(__pyx_f_9adios_mpi_set_group_size(__pyx_v_fd_p, __pyx_v_data_size, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2611,91 +3697,146 @@ static PyObject *__pyx_pf_9adios_mpi_4set_group_size(CYTHON_UNUSED PyObject *__p
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":276
+/* "adios_mpi.pyx":322
  *     return total_size
  * 
- * cpdef int write (int64_t fd_p, char * name, np.ndarray val):             # <<<<<<<<<<<<<<
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):             # <<<<<<<<<<<<<<
  *     cdef np.ndarray val_
- *     if val.flags.contiguous:
+ *     if isinstance(val, (np.ndarray)):
  */
 
-static PyObject *__pyx_pw_9adios_mpi_7write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_9adios_mpi_write(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
+static PyObject *__pyx_pw_9adios_mpi_9write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_9adios_mpi_write(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyObject *__pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_write *__pyx_optional_args) {
+  PyObject *__pyx_v_dtype = ((PyObject *)Py_None);
   PyArrayObject *__pyx_v_val_ = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_dtype = __pyx_optional_args->dtype;
+    }
+  }
 
-  /* "adios_mpi.pyx":278
- * cpdef int write (int64_t fd_p, char * name, np.ndarray val):
+  /* "adios_mpi.pyx":324
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):
  *     cdef np.ndarray val_
- *     if val.flags.contiguous:             # <<<<<<<<<<<<<<
- *         val_ = val
- *     else:
+ *     if isinstance(val, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *         if val.flags.contiguous:
+ *             val_ = val
  */
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__pyx_t_3) {
+  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_val, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
 
-    /* "adios_mpi.pyx":279
+    /* "adios_mpi.pyx":325
  *     cdef np.ndarray val_
- *     if val.flags.contiguous:
- *         val_ = val             # <<<<<<<<<<<<<<
+ *     if isinstance(val, (np.ndarray)):
+ *         if val.flags.contiguous:             # <<<<<<<<<<<<<<
+ *             val_ = val
+ *         else:
+ */
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_flags); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (__pyx_t_2) {
+
+      /* "adios_mpi.pyx":326
+ *     if isinstance(val, (np.ndarray)):
+ *         if val.flags.contiguous:
+ *             val_ = val             # <<<<<<<<<<<<<<
+ *         else:
+ *             val_ = np.array(val, copy=True)
+ */
+      if (!(likely(((__pyx_v_val) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_val, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __pyx_v_val;
+      __Pyx_INCREF(__pyx_t_4);
+      __pyx_v_val_ = ((PyArrayObject *)__pyx_t_4);
+      __pyx_t_4 = 0;
+      goto __pyx_L4;
+    }
+    /*else*/ {
+
+      /* "adios_mpi.pyx":328
+ *             val_ = val
+ *         else:
+ *             val_ = np.array(val, copy=True)             # <<<<<<<<<<<<<<
  *     else:
- *         val_ = np.array(val, copy=True)
+ *         val_ = np.array(val, dtype=dtype)
  */
-    __Pyx_INCREF(((PyObject *)__pyx_v_val));
-    __pyx_v_val_ = __pyx_v_val;
+      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_INCREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_val);
+      __Pyx_GIVEREF(__pyx_v_val);
+      __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_copy, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_val_ = ((PyArrayObject *)__pyx_t_6);
+      __pyx_t_6 = 0;
+    }
+    __pyx_L4:;
     goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "adios_mpi.pyx":281
- *         val_ = val
+    /* "adios_mpi.pyx":330
+ *             val_ = np.array(val, copy=True)
  *     else:
- *         val_ = np.array(val, copy=True)             # <<<<<<<<<<<<<<
+ *         val_ = np.array(val, dtype=dtype)             # <<<<<<<<<<<<<<
  * 
  *     return adios_write (fd_p, name, <void *> val_.data)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_INCREF(((PyObject *)__pyx_v_val));
-    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_val));
-    __Pyx_GIVEREF(((PyObject *)__pyx_v_val));
-    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_copy, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_INCREF(__pyx_v_val);
+    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_val);
+    __Pyx_GIVEREF(__pyx_v_val);
+    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_v_dtype) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_val_ = ((PyArrayObject *)__pyx_t_5);
-    __pyx_t_5 = 0;
+    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_val_ = ((PyArrayObject *)__pyx_t_3);
+    __pyx_t_3 = 0;
   }
   __pyx_L3:;
 
-  /* "adios_mpi.pyx":283
- *         val_ = np.array(val, copy=True)
+  /* "adios_mpi.pyx":332
+ *         val_ = np.array(val, dtype=dtype)
  * 
  *     return adios_write (fd_p, name, <void *> val_.data)             # <<<<<<<<<<<<<<
  * 
@@ -2704,20 +3845,20 @@ static int __pyx_f_9adios_mpi_write(int64_t __pyx_v_fd_p, char *__pyx_v_name, Py
   __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, ((void *)__pyx_v_val_->data));
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":276
+  /* "adios_mpi.pyx":322
  *     return total_size
  * 
- * cpdef int write (int64_t fd_p, char * name, np.ndarray val):             # <<<<<<<<<<<<<<
+ * cpdef int write (int64_t fd_p, char * name, val, dtype=None):             # <<<<<<<<<<<<<<
  *     cdef np.ndarray val_
- *     if val.flags.contiguous:
+ *     if isinstance(val, (np.ndarray)):
  */
 
   /* function exit code */
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
   __Pyx_WriteUnraisable("adios_mpi.write", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
   __pyx_r = 0;
   __pyx_L0:;
@@ -2727,11 +3868,13 @@ static int __pyx_f_9adios_mpi_write(int64_t __pyx_v_fd_p, char *__pyx_v_name, Py
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_7write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_7write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_9write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_8write[] = "write(int64_t fd_p, char *name, val, dtype=None) -> int";
+static PyObject *__pyx_pw_9adios_mpi_9write(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
-  PyArrayObject *__pyx_v_val = 0;
+  PyObject *__pyx_v_val = 0;
+  PyObject *__pyx_v_dtype = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -2739,12 +3882,14 @@ static PyObject *__pyx_pw_9adios_mpi_7write(PyObject *__pyx_self, PyObject *__py
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fd_p,&__pyx_n_s_name,&__pyx_n_s_val,0};
-    PyObject* values[3] = {0,0,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fd_p,&__pyx_n_s_name,&__pyx_n_s_val,&__pyx_n_s_dtype,0};
+    PyObject* values[4] = {0,0,0,0};
+    values[3] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
       switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -2759,66 +3904,75 @@ static PyObject *__pyx_pw_9adios_mpi_7write(PyObject *__pyx_self, PyObject *__py
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write", 0, 3, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write", 0, 3, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dtype);
+          if (value) { values[3] = value; kw_args--; }
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
-      goto __pyx_L5_argtuple_error;
     } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_val = ((PyArrayObject *)values[2]);
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = values[2];
+    __pyx_v_dtype = values[3];
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("write", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("write", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_val), __pyx_ptype_5numpy_ndarray, 1, "val", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_9adios_mpi_6write(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  __pyx_r = __pyx_pf_9adios_mpi_8write(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val, __pyx_v_dtype);
 
   /* function exit code */
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_6write(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val) {
+static PyObject *__pyx_pf_9adios_mpi_8write(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyObject *__pyx_v_val, PyObject *__pyx_v_dtype) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_1;
+  struct __pyx_opt_args_9adios_mpi_write __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_write(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __pyx_t_2.__pyx_n = 1;
+  __pyx_t_2.dtype = __pyx_v_dtype;
+  __pyx_t_1 = __pyx_f_9adios_mpi_write(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0, &__pyx_t_2); 
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
+  goto __pyx_L0;
 
   /* function exit code */
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_AddTraceback("adios_mpi.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -2827,7 +3981,7 @@ static PyObject *__pyx_pf_9adios_mpi_6write(CYTHON_UNUSED PyObject *__pyx_self,
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":285
+/* "adios_mpi.pyx":334
  *     return adios_write (fd_p, name, <void *> val_.data)
  * 
  * cpdef int write_int (int64_t fd_p, char * name, int val):             # <<<<<<<<<<<<<<
@@ -2835,13 +3989,13 @@ static PyObject *__pyx_pf_9adios_mpi_6write(CYTHON_UNUSED PyObject *__pyx_self,
  * 
  */
 
-static PyObject *__pyx_pw_9adios_mpi_9write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_11write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_9adios_mpi_write_int(int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_int", 0);
 
-  /* "adios_mpi.pyx":286
+  /* "adios_mpi.pyx":335
  * 
  * cpdef int write_int (int64_t fd_p, char * name, int val):
  *     return adios_write (fd_p, name, &val)             # <<<<<<<<<<<<<<
@@ -2851,7 +4005,7 @@ static int __pyx_f_9adios_mpi_write_int(int64_t __pyx_v_fd_p, char *__pyx_v_name
   __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, (&__pyx_v_val));
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":285
+  /* "adios_mpi.pyx":334
  *     return adios_write (fd_p, name, <void *> val_.data)
  * 
  * cpdef int write_int (int64_t fd_p, char * name, int val):             # <<<<<<<<<<<<<<
@@ -2866,8 +4020,9 @@ static int __pyx_f_9adios_mpi_write_int(int64_t __pyx_v_fd_p, char *__pyx_v_name
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_9write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_9write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_11write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_10write_int[] = "write_int(int64_t fd_p, char *name, int val) -> int";
+static PyObject *__pyx_pw_9adios_mpi_11write_int(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
   int __pyx_v_val;
@@ -2898,16 +4053,16 @@ static PyObject *__pyx_pw_9adios_mpi_9write_int(PyObject *__pyx_self, PyObject *
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_int") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_int") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -2916,26 +4071,26 @@ static PyObject *__pyx_pw_9adios_mpi_9write_int(PyObject *__pyx_self, PyObject *
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
       values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_val = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_val == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_val == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("write_int", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.write_int", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_8write_int(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  __pyx_r = __pyx_pf_9adios_mpi_10write_int(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_8write_int(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val) {
+static PyObject *__pyx_pf_9adios_mpi_10write_int(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, int __pyx_v_val) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2944,7 +4099,7 @@ static PyObject *__pyx_pf_9adios_mpi_8write_int(CYTHON_UNUSED PyObject *__pyx_se
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_int", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_write_int(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_write_int(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2961,7 +4116,7 @@ static PyObject *__pyx_pf_9adios_mpi_8write_int(CYTHON_UNUSED PyObject *__pyx_se
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":288
+/* "adios_mpi.pyx":337
  *     return adios_write (fd_p, name, &val)
  * 
  * cpdef int write_long (int64_t fd_p, char * name, long val):             # <<<<<<<<<<<<<<
@@ -2969,13 +4124,13 @@ static PyObject *__pyx_pf_9adios_mpi_8write_int(CYTHON_UNUSED PyObject *__pyx_se
  * 
  */
 
-static PyObject *__pyx_pw_9adios_mpi_11write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_13write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_9adios_mpi_write_long(int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_long", 0);
 
-  /* "adios_mpi.pyx":289
+  /* "adios_mpi.pyx":338
  * 
  * cpdef int write_long (int64_t fd_p, char * name, long val):
  *     return adios_write (fd_p, name, &val)             # <<<<<<<<<<<<<<
@@ -2985,7 +4140,7 @@ static int __pyx_f_9adios_mpi_write_long(int64_t __pyx_v_fd_p, char *__pyx_v_nam
   __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, (&__pyx_v_val));
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":288
+  /* "adios_mpi.pyx":337
  *     return adios_write (fd_p, name, &val)
  * 
  * cpdef int write_long (int64_t fd_p, char * name, long val):             # <<<<<<<<<<<<<<
@@ -3000,8 +4155,9 @@ static int __pyx_f_9adios_mpi_write_long(int64_t __pyx_v_fd_p, char *__pyx_v_nam
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_11write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_11write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_13write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_12write_long[] = "write_long(int64_t fd_p, char *name, long val) -> int";
+static PyObject *__pyx_pw_9adios_mpi_13write_long(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
   long __pyx_v_val;
@@ -3032,16 +4188,16 @@ static PyObject *__pyx_pw_9adios_mpi_11write_long(PyObject *__pyx_self, PyObject
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_long") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_long") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -3050,26 +4206,26 @@ static PyObject *__pyx_pw_9adios_mpi_11write_long(PyObject *__pyx_self, PyObject
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
       values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_val = __Pyx_PyInt_As_long(values[2]); if (unlikely((__pyx_v_val == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __Pyx_PyInt_As_long(values[2]); if (unlikely((__pyx_v_val == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("write_long", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.write_long", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_10write_long(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  __pyx_r = __pyx_pf_9adios_mpi_12write_long(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_10write_long(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val) {
+static PyObject *__pyx_pf_9adios_mpi_12write_long(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, long __pyx_v_val) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3078,7 +4234,7 @@ static PyObject *__pyx_pf_9adios_mpi_10write_long(CYTHON_UNUSED PyObject *__pyx_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_long", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_write_long(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_write_long(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3095,7 +4251,7 @@ static PyObject *__pyx_pf_9adios_mpi_10write_long(CYTHON_UNUSED PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":291
+/* "adios_mpi.pyx":340
  *     return adios_write (fd_p, name, &val)
  * 
  * cpdef int write_float (int64_t fd_p, char * name, float val):             # <<<<<<<<<<<<<<
@@ -3103,23 +4259,23 @@ static PyObject *__pyx_pf_9adios_mpi_10write_long(CYTHON_UNUSED PyObject *__pyx_
  * 
  */
 
-static PyObject *__pyx_pw_9adios_mpi_13write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_15write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_9adios_mpi_write_float(int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_float", 0);
 
-  /* "adios_mpi.pyx":292
+  /* "adios_mpi.pyx":341
  * 
  * cpdef int write_float (int64_t fd_p, char * name, float val):
  *     return adios_write (fd_p, name, &val)             # <<<<<<<<<<<<<<
  * 
- * cpdef int read(int64_t fd_p, char * name, np.ndarray val):
+ * cpdef int write_double (int64_t fd_p, char * name, double val):
  */
   __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, (&__pyx_v_val));
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":291
+  /* "adios_mpi.pyx":340
  *     return adios_write (fd_p, name, &val)
  * 
  * cpdef int write_float (int64_t fd_p, char * name, float val):             # <<<<<<<<<<<<<<
@@ -3134,8 +4290,9 @@ static int __pyx_f_9adios_mpi_write_float(int64_t __pyx_v_fd_p, char *__pyx_v_na
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_13write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_13write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_15write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_14write_float[] = "write_float(int64_t fd_p, char *name, float val) -> int";
+static PyObject *__pyx_pw_9adios_mpi_15write_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
   float __pyx_v_val;
@@ -3166,16 +4323,16 @@ static PyObject *__pyx_pw_9adios_mpi_13write_float(PyObject *__pyx_self, PyObjec
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_float") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_float") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -3184,26 +4341,26 @@ static PyObject *__pyx_pw_9adios_mpi_13write_float(PyObject *__pyx_self, PyObjec
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
       values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_val = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("write_float", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.write_float", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_12write_float(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  __pyx_r = __pyx_pf_9adios_mpi_14write_float(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_12write_float(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val) {
+static PyObject *__pyx_pf_9adios_mpi_14write_float(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, float __pyx_v_val) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3212,7 +4369,7 @@ static PyObject *__pyx_pf_9adios_mpi_12write_float(CYTHON_UNUSED PyObject *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_float", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_write_float(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_write_float(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3229,15 +4386,150 @@ static PyObject *__pyx_pf_9adios_mpi_12write_float(CYTHON_UNUSED PyObject *__pyx
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":294
+/* "adios_mpi.pyx":343
+ *     return adios_write (fd_p, name, &val)
+ * 
+ * cpdef int write_double (int64_t fd_p, char * name, double val):             # <<<<<<<<<<<<<<
+ *     return adios_write (fd_p, name, &val)
+ * 
+ */
+
+static PyObject *__pyx_pw_9adios_mpi_17write_double(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_9adios_mpi_write_double(int64_t __pyx_v_fd_p, char *__pyx_v_name, double __pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_double", 0);
+
+  /* "adios_mpi.pyx":344
+ * 
+ * cpdef int write_double (int64_t fd_p, char * name, double val):
+ *     return adios_write (fd_p, name, &val)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = adios_write(__pyx_v_fd_p, __pyx_v_name, (&__pyx_v_val));
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":343
  *     return adios_write (fd_p, name, &val)
  * 
+ * cpdef int write_double (int64_t fd_p, char * name, double val):             # <<<<<<<<<<<<<<
+ *     return adios_write (fd_p, name, &val)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_17write_double(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_16write_double[] = "write_double(int64_t fd_p, char *name, double val) -> int";
+static PyObject *__pyx_pw_9adios_mpi_17write_double(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int64_t __pyx_v_fd_p;
+  char *__pyx_v_name;
+  double __pyx_v_val;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_double (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fd_p,&__pyx_n_s_name,&__pyx_n_s_val,0};
+    PyObject* values[3] = {0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fd_p)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("write_double", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  2:
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("write_double", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_double") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+    }
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_val == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("write_double", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.write_double", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_16write_double(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_16write_double(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, double __pyx_v_val) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write_double", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_write_double(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.write_double", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":347
+ * 
+ * 
  * cpdef int read(int64_t fd_p, char * name, np.ndarray val):             # <<<<<<<<<<<<<<
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
  *     print "Reading ... ", val.itemsize * val.size, "(bytes)"
  */
 
-static PyObject *__pyx_pw_9adios_mpi_15read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_19read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_9adios_mpi_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -3251,7 +4543,7 @@ static int __pyx_f_9adios_mpi_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyA
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read", 0);
 
-  /* "adios_mpi.pyx":295
+  /* "adios_mpi.pyx":348
  * 
  * cpdef int read(int64_t fd_p, char * name, np.ndarray val):
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'             # <<<<<<<<<<<<<<
@@ -3260,36 +4552,36 @@ static int __pyx_f_9adios_mpi_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyA
  */
   #ifndef CYTHON_WITHOUT_ASSERTIONS
   if (unlikely(!Py_OptimizeFlag)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_flags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (unlikely(!__pyx_t_3)) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Only_contiguous_arrays_are_suppo);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios_mpi.pyx":296
+  /* "adios_mpi.pyx":349
  * cpdef int read(int64_t fd_p, char * name, np.ndarray val):
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
  *     print "Reading ... ", val.itemsize * val.size, "(bytes)"             # <<<<<<<<<<<<<<
  *     return adios_read(fd_p, name, <void *> val.data, val.itemsize * val.size)
  * 
  */
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_kp_s_Reading);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_s_Reading);
@@ -3300,31 +4592,31 @@ static int __pyx_f_9adios_mpi_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyA
   PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_s_bytes);
   __Pyx_GIVEREF(__pyx_kp_s_bytes);
   __pyx_t_4 = 0;
-  if (__Pyx_Print(0, __pyx_t_1, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_Print(0, __pyx_t_1, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":297
+  /* "adios_mpi.pyx":350
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
  *     print "Reading ... ", val.itemsize * val.size, "(bytes)"
  *     return adios_read(fd_p, name, <void *> val.data, val.itemsize * val.size)             # <<<<<<<<<<<<<<
  * 
  * cpdef int close(int64_t fd_p):
  */
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val), __pyx_n_s_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_5 = __Pyx_PyInt_As_uint64_t(__pyx_t_2); if (unlikely((__pyx_t_5 == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyInt_As_uint64_t(__pyx_t_2); if (unlikely((__pyx_t_5 == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_r = adios_read(__pyx_v_fd_p, __pyx_v_name, ((void *)__pyx_v_val->data), __pyx_t_5);
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":294
- *     return adios_write (fd_p, name, &val)
+  /* "adios_mpi.pyx":347
+ * 
  * 
  * cpdef int read(int64_t fd_p, char * name, np.ndarray val):             # <<<<<<<<<<<<<<
  *     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
@@ -3344,8 +4636,9 @@ static int __pyx_f_9adios_mpi_read(int64_t __pyx_v_fd_p, char *__pyx_v_name, PyA
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_15read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_15read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_19read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_18read[] = "read(int64_t fd_p, char *name, ndarray val) -> int";
+static PyObject *__pyx_pw_9adios_mpi_19read(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_fd_p;
   char *__pyx_v_name;
   PyArrayObject *__pyx_v_val = 0;
@@ -3376,16 +4669,16 @@ static PyObject *__pyx_pw_9adios_mpi_15read(PyObject *__pyx_self, PyObject *__py
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -3394,20 +4687,20 @@ static PyObject *__pyx_pw_9adios_mpi_15read(PyObject *__pyx_self, PyObject *__py
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
       values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
     }
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_val = ((PyArrayObject *)values[2]);
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.read", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_val), __pyx_ptype_5numpy_ndarray, 1, "val", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_9adios_mpi_14read(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_val), __pyx_ptype_5numpy_ndarray, 1, "val", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_18read(__pyx_self, __pyx_v_fd_p, __pyx_v_name, __pyx_v_val);
 
   /* function exit code */
   goto __pyx_L0;
@@ -3418,7 +4711,7 @@ static PyObject *__pyx_pw_9adios_mpi_15read(PyObject *__pyx_self, PyObject *__py
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_14read(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val) {
+static PyObject *__pyx_pf_9adios_mpi_18read(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p, char *__pyx_v_name, PyArrayObject *__pyx_v_val) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3427,7 +4720,7 @@ static PyObject *__pyx_pf_9adios_mpi_14read(CYTHON_UNUSED PyObject *__pyx_self,
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_read(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_read(__pyx_v_fd_p, __pyx_v_name, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3444,7 +4737,7 @@ static PyObject *__pyx_pf_9adios_mpi_14read(CYTHON_UNUSED PyObject *__pyx_self,
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":299
+/* "adios_mpi.pyx":352
  *     return adios_read(fd_p, name, <void *> val.data, val.itemsize * val.size)
  * 
  * cpdef int close(int64_t fd_p):             # <<<<<<<<<<<<<<
@@ -3452,13 +4745,13 @@ static PyObject *__pyx_pf_9adios_mpi_14read(CYTHON_UNUSED PyObject *__pyx_self,
  * 
  */
 
-static PyObject *__pyx_pw_9adios_mpi_17close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_21close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p); /*proto*/
 static int __pyx_f_9adios_mpi_close(int64_t __pyx_v_fd_p, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("close", 0);
 
-  /* "adios_mpi.pyx":300
+  /* "adios_mpi.pyx":353
  * 
  * cpdef int close(int64_t fd_p):
  *     return adios_close(fd_p)             # <<<<<<<<<<<<<<
@@ -3468,7 +4761,7 @@ static int __pyx_f_9adios_mpi_close(int64_t __pyx_v_fd_p, CYTHON_UNUSED int __py
   __pyx_r = adios_close(__pyx_v_fd_p);
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":299
+  /* "adios_mpi.pyx":352
  *     return adios_read(fd_p, name, <void *> val.data, val.itemsize * val.size)
  * 
  * cpdef int close(int64_t fd_p):             # <<<<<<<<<<<<<<
@@ -3483,8 +4776,9 @@ static int __pyx_f_9adios_mpi_close(int64_t __pyx_v_fd_p, CYTHON_UNUSED int __py
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_17close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_17close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p) {
+static PyObject *__pyx_pw_9adios_mpi_21close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p); /*proto*/
+static char __pyx_doc_9adios_mpi_20close[] = "close(int64_t fd_p) -> int";
+static PyObject *__pyx_pw_9adios_mpi_21close(PyObject *__pyx_self, PyObject *__pyx_arg_fd_p) {
   int64_t __pyx_v_fd_p;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
@@ -3493,7 +4787,7 @@ static PyObject *__pyx_pw_9adios_mpi_17close(PyObject *__pyx_self, PyObject *__p
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("close (wrapper)", 0);
   assert(__pyx_arg_fd_p); {
-    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(__pyx_arg_fd_p); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fd_p = __Pyx_PyInt_As_int64_t(__pyx_arg_fd_p); if (unlikely((__pyx_v_fd_p == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -3501,14 +4795,14 @@ static PyObject *__pyx_pw_9adios_mpi_17close(PyObject *__pyx_self, PyObject *__p
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_16close(__pyx_self, ((int64_t)__pyx_v_fd_p));
+  __pyx_r = __pyx_pf_9adios_mpi_20close(__pyx_self, ((int64_t)__pyx_v_fd_p));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_16close(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p) {
+static PyObject *__pyx_pf_9adios_mpi_20close(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_fd_p) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3517,7 +4811,7 @@ static PyObject *__pyx_pf_9adios_mpi_16close(CYTHON_UNUSED PyObject *__pyx_self,
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("close", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_close(__pyx_v_fd_p, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_close(__pyx_v_fd_p, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3534,7 +4828,7 @@ static PyObject *__pyx_pf_9adios_mpi_16close(CYTHON_UNUSED PyObject *__pyx_self,
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":302
+/* "adios_mpi.pyx":355
  *     return adios_close(fd_p)
  * 
  * cpdef int finalize(int mype = 0):             # <<<<<<<<<<<<<<
@@ -3542,7 +4836,7 @@ static PyObject *__pyx_pf_9adios_mpi_16close(CYTHON_UNUSED PyObject *__pyx_self,
  * 
  */
 
-static PyObject *__pyx_pw_9adios_mpi_19finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_23finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_9adios_mpi_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_finalize *__pyx_optional_args) {
   int __pyx_v_mype = ((int)0);
   int __pyx_r;
@@ -3554,7 +4848,7 @@ static int __pyx_f_9adios_mpi_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, st
     }
   }
 
-  /* "adios_mpi.pyx":303
+  /* "adios_mpi.pyx":356
  * 
  * cpdef int finalize(int mype = 0):
  *     return adios_finalize(mype)             # <<<<<<<<<<<<<<
@@ -3564,7 +4858,7 @@ static int __pyx_f_9adios_mpi_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, st
   __pyx_r = adios_finalize(__pyx_v_mype);
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":302
+  /* "adios_mpi.pyx":355
  *     return adios_close(fd_p)
  * 
  * cpdef int finalize(int mype = 0):             # <<<<<<<<<<<<<<
@@ -3579,8 +4873,9 @@ static int __pyx_f_9adios_mpi_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, st
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_19finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_19finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_23finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_22finalize[] = "finalize(int mype=0) -> int";
+static PyObject *__pyx_pw_9adios_mpi_23finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_mype;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
@@ -3608,7 +4903,7 @@ static PyObject *__pyx_pw_9adios_mpi_19finalize(PyObject *__pyx_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "finalize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "finalize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 355; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3618,27 +4913,27 @@ static PyObject *__pyx_pw_9adios_mpi_19finalize(PyObject *__pyx_self, PyObject *
       }
     }
     if (values[0]) {
-      __pyx_v_mype = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_mype == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_mype = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_mype == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 355; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_mype = ((int)0);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("finalize", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("finalize", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 355; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.finalize", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_18finalize(__pyx_self, __pyx_v_mype);
+  __pyx_r = __pyx_pf_9adios_mpi_22finalize(__pyx_self, __pyx_v_mype);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_18finalize(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_mype) {
+static PyObject *__pyx_pf_9adios_mpi_22finalize(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_mype) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3652,7 +4947,7 @@ static PyObject *__pyx_pf_9adios_mpi_18finalize(CYTHON_UNUSED PyObject *__pyx_se
   __pyx_t_2.__pyx_n = 1;
   __pyx_t_2.mype = __pyx_v_mype;
   __pyx_t_1 = __pyx_f_9adios_mpi_finalize(0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 355; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -3669,7 +4964,7 @@ static PyObject *__pyx_pf_9adios_mpi_18finalize(CYTHON_UNUSED PyObject *__pyx_se
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":308
+/* "adios_mpi.pyx":361
  * ## ADIOS No-XML API
  * ## ====================
  * cpdef int init_noxml(MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
@@ -3677,9 +4972,9 @@ static PyObject *__pyx_pf_9adios_mpi_18finalize(CYTHON_UNUSED PyObject *__pyx_se
  * 
  */
 
-static PyObject *__pyx_pw_9adios_mpi_21init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_25init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_9adios_mpi_init_noxml(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_init_noxml *__pyx_optional_args) {
-  struct PyMPICommObject *__pyx_v_comm = __pyx_k__3;
+  struct PyMPICommObject *__pyx_v_comm = __pyx_k__6;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("init_noxml", 0);
@@ -3689,7 +4984,7 @@ static int __pyx_f_9adios_mpi_init_noxml(CYTHON_UNUSED int __pyx_skip_dispatch,
     }
   }
 
-  /* "adios_mpi.pyx":309
+  /* "adios_mpi.pyx":362
  * ## ====================
  * cpdef int init_noxml(MPI.Comm comm = MPI.COMM_WORLD):
  *     return adios_init_noxml(comm.ob_mpi)             # <<<<<<<<<<<<<<
@@ -3699,7 +4994,7 @@ static int __pyx_f_9adios_mpi_init_noxml(CYTHON_UNUSED int __pyx_skip_dispatch,
   __pyx_r = adios_init_noxml(__pyx_v_comm->ob_mpi);
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":308
+  /* "adios_mpi.pyx":361
  * ## ADIOS No-XML API
  * ## ====================
  * cpdef int init_noxml(MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
@@ -3714,8 +5009,9 @@ static int __pyx_f_9adios_mpi_init_noxml(CYTHON_UNUSED int __pyx_skip_dispatch,
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_21init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_21init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_25init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_24init_noxml[] = "init_noxml(Comm comm=MPI.COMM_WORLD) -> int";
+static PyObject *__pyx_pw_9adios_mpi_25init_noxml(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct PyMPICommObject *__pyx_v_comm = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
@@ -3726,7 +5022,7 @@ static PyObject *__pyx_pw_9adios_mpi_21init_noxml(PyObject *__pyx_self, PyObject
   {
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_comm,0};
     PyObject* values[1] = {0};
-    values[0] = (PyObject *)__pyx_k__3;
+    values[0] = (PyObject *)__pyx_k__6;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -3744,7 +5040,7 @@ static PyObject *__pyx_pw_9adios_mpi_21init_noxml(PyObject *__pyx_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init_noxml") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init_noxml") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3757,14 +5053,14 @@ static PyObject *__pyx_pw_9adios_mpi_21init_noxml(PyObject *__pyx_self, PyObject
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("init_noxml", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("init_noxml", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.init_noxml", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_9adios_mpi_20init_noxml(__pyx_self, __pyx_v_comm);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_24init_noxml(__pyx_self, __pyx_v_comm);
 
   /* function exit code */
   goto __pyx_L0;
@@ -3775,7 +5071,7 @@ static PyObject *__pyx_pw_9adios_mpi_21init_noxml(PyObject *__pyx_self, PyObject
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_20init_noxml(CYTHON_UNUSED PyObject *__pyx_self, struct PyMPICommObject *__pyx_v_comm) {
+static PyObject *__pyx_pf_9adios_mpi_24init_noxml(CYTHON_UNUSED PyObject *__pyx_self, struct PyMPICommObject *__pyx_v_comm) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3789,7 +5085,7 @@ static PyObject *__pyx_pf_9adios_mpi_20init_noxml(CYTHON_UNUSED PyObject *__pyx_
   __pyx_t_2.__pyx_n = 1;
   __pyx_t_2.comm = __pyx_v_comm;
   __pyx_t_1 = __pyx_f_9adios_mpi_init_noxml(0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -3806,7 +5102,7 @@ static PyObject *__pyx_pf_9adios_mpi_20init_noxml(CYTHON_UNUSED PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":311
+/* "adios_mpi.pyx":364
  *     return adios_init_noxml(comm.ob_mpi)
  * 
  * cpdef int allocate_buffer(int when,             # <<<<<<<<<<<<<<
@@ -3814,13 +5110,13 @@ static PyObject *__pyx_pf_9adios_mpi_20init_noxml(CYTHON_UNUSED PyObject *__pyx_
  *     return adios_allocate_buffer(<ADIOS_BUFFER_ALLOC_WHEN> when,
  */
 
-static PyObject *__pyx_pw_9adios_mpi_23allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_27allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_9adios_mpi_allocate_buffer(int __pyx_v_when, uint64_t __pyx_v_buffer_size, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("allocate_buffer", 0);
 
-  /* "adios_mpi.pyx":313
+  /* "adios_mpi.pyx":366
  * cpdef int allocate_buffer(int when,
  *                           uint64_t buffer_size):
  *     return adios_allocate_buffer(<ADIOS_BUFFER_ALLOC_WHEN> when,             # <<<<<<<<<<<<<<
@@ -3830,7 +5126,7 @@ static int __pyx_f_9adios_mpi_allocate_buffer(int __pyx_v_when, uint64_t __pyx_v
   __pyx_r = adios_allocate_buffer(((ADIOS_BUFFER_ALLOC_WHEN)__pyx_v_when), __pyx_v_buffer_size);
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":311
+  /* "adios_mpi.pyx":364
  *     return adios_init_noxml(comm.ob_mpi)
  * 
  * cpdef int allocate_buffer(int when,             # <<<<<<<<<<<<<<
@@ -3845,8 +5141,9 @@ static int __pyx_f_9adios_mpi_allocate_buffer(int __pyx_v_when, uint64_t __pyx_v
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_23allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_23allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_27allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_26allocate_buffer[] = "allocate_buffer(int when, uint64_t buffer_size) -> int";
+static PyObject *__pyx_pw_9adios_mpi_27allocate_buffer(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_when;
   uint64_t __pyx_v_buffer_size;
   int __pyx_lineno = 0;
@@ -3875,11 +5172,11 @@ static PyObject *__pyx_pw_9adios_mpi_23allocate_buffer(PyObject *__pyx_self, PyO
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_buffer_size)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("allocate_buffer", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("allocate_buffer", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "allocate_buffer") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "allocate_buffer") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -3887,25 +5184,25 @@ static PyObject *__pyx_pw_9adios_mpi_23allocate_buffer(PyObject *__pyx_self, PyO
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_when = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_when == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_buffer_size = __Pyx_PyInt_As_uint64_t(values[1]); if (unlikely((__pyx_v_buffer_size == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_when = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_when == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_buffer_size = __Pyx_PyInt_As_uint64_t(values[1]); if (unlikely((__pyx_v_buffer_size == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("allocate_buffer", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("allocate_buffer", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.allocate_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_22allocate_buffer(__pyx_self, __pyx_v_when, __pyx_v_buffer_size);
+  __pyx_r = __pyx_pf_9adios_mpi_26allocate_buffer(__pyx_self, __pyx_v_when, __pyx_v_buffer_size);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_22allocate_buffer(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_when, uint64_t __pyx_v_buffer_size) {
+static PyObject *__pyx_pf_9adios_mpi_26allocate_buffer(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_when, uint64_t __pyx_v_buffer_size) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3914,7 +5211,7 @@ static PyObject *__pyx_pf_9adios_mpi_22allocate_buffer(CYTHON_UNUSED PyObject *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("allocate_buffer", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_allocate_buffer(__pyx_v_when, __pyx_v_buffer_size, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_allocate_buffer(__pyx_v_when, __pyx_v_buffer_size, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3931,7 +5228,7 @@ static PyObject *__pyx_pf_9adios_mpi_22allocate_buffer(CYTHON_UNUSED PyObject *_
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":316
+/* "adios_mpi.pyx":369
  *                                  buffer_size)
  * 
  * cpdef int64_t declare_group(char * name,             # <<<<<<<<<<<<<<
@@ -3939,9 +5236,9 @@ static PyObject *__pyx_pf_9adios_mpi_22allocate_buffer(CYTHON_UNUSED PyObject *_
  *                             int stats = 1):
  */
 
-static PyObject *__pyx_pw_9adios_mpi_25declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_29declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int64_t __pyx_f_9adios_mpi_declare_group(char *__pyx_v_name, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_declare_group *__pyx_optional_args) {
-  char *__pyx_v_time_index = ((char *)__pyx_k__4);
+  char *__pyx_v_time_index = ((char *)__pyx_k__7);
   int __pyx_v_stats = ((int)1);
   int64_t __pyx_v_id;
   int64_t __pyx_r;
@@ -3956,7 +5253,7 @@ static int64_t __pyx_f_9adios_mpi_declare_group(char *__pyx_v_name, CYTHON_UNUSE
     }
   }
 
-  /* "adios_mpi.pyx":319
+  /* "adios_mpi.pyx":372
  *                             char * time_index = "",
  *                             int stats = 1):
  *     cdef int64_t id = 0             # <<<<<<<<<<<<<<
@@ -3965,7 +5262,7 @@ static int64_t __pyx_f_9adios_mpi_declare_group(char *__pyx_v_name, CYTHON_UNUSE
  */
   __pyx_v_id = 0;
 
-  /* "adios_mpi.pyx":320
+  /* "adios_mpi.pyx":373
  *                             int stats = 1):
  *     cdef int64_t id = 0
  *     adios_declare_group (&id,             # <<<<<<<<<<<<<<
@@ -3974,7 +5271,7 @@ static int64_t __pyx_f_9adios_mpi_declare_group(char *__pyx_v_name, CYTHON_UNUSE
  */
   adios_declare_group((&__pyx_v_id), __pyx_v_name, __pyx_v_time_index, ((ADIOS_FLAG)__pyx_v_stats));
 
-  /* "adios_mpi.pyx":324
+  /* "adios_mpi.pyx":377
  *                          time_index,
  *                          <ADIOS_FLAG> stats)
  *     return id             # <<<<<<<<<<<<<<
@@ -3984,7 +5281,7 @@ static int64_t __pyx_f_9adios_mpi_declare_group(char *__pyx_v_name, CYTHON_UNUSE
   __pyx_r = __pyx_v_id;
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":316
+  /* "adios_mpi.pyx":369
  *                                  buffer_size)
  * 
  * cpdef int64_t declare_group(char * name,             # <<<<<<<<<<<<<<
@@ -3999,8 +5296,9 @@ static int64_t __pyx_f_9adios_mpi_declare_group(char *__pyx_v_name, CYTHON_UNUSE
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_25declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_25declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_29declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_28declare_group[] = "declare_group(char *name, char *time_index='', int stats=1) -> int64_t";
+static PyObject *__pyx_pw_9adios_mpi_29declare_group(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_name;
   char *__pyx_v_time_index;
   int __pyx_v_stats;
@@ -4040,7 +5338,7 @@ static PyObject *__pyx_pw_9adios_mpi_25declare_group(PyObject *__pyx_self, PyObj
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "declare_group") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "declare_group") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -4051,34 +5349,34 @@ static PyObject *__pyx_pw_9adios_mpi_25declare_group(PyObject *__pyx_self, PyObj
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     if (values[1]) {
-      __pyx_v_time_index = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_time_index) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_time_index = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_time_index) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_time_index = ((char *)__pyx_k__4);
+      __pyx_v_time_index = ((char *)__pyx_k__7);
     }
     if (values[2]) {
-      __pyx_v_stats = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_stats == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_stats = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_stats == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_stats = ((int)1);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("declare_group", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("declare_group", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.declare_group", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_24declare_group(__pyx_self, __pyx_v_name, __pyx_v_time_index, __pyx_v_stats);
+  __pyx_r = __pyx_pf_9adios_mpi_28declare_group(__pyx_self, __pyx_v_name, __pyx_v_time_index, __pyx_v_stats);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_24declare_group(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_name, char *__pyx_v_time_index, int __pyx_v_stats) {
+static PyObject *__pyx_pf_9adios_mpi_28declare_group(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_name, char *__pyx_v_time_index, int __pyx_v_stats) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int64_t __pyx_t_1;
@@ -4093,7 +5391,7 @@ static PyObject *__pyx_pf_9adios_mpi_24declare_group(CYTHON_UNUSED PyObject *__p
   __pyx_t_2.time_index = __pyx_v_time_index;
   __pyx_t_2.stats = __pyx_v_stats;
   __pyx_t_1 = __pyx_f_9adios_mpi_declare_group(__pyx_v_name, 0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int64_t(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -4110,7 +5408,7 @@ static PyObject *__pyx_pf_9adios_mpi_24declare_group(CYTHON_UNUSED PyObject *__p
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":326
+/* "adios_mpi.pyx":379
  *     return id
  * 
  * cpdef int define_var(int64_t group_id,             # <<<<<<<<<<<<<<
@@ -4118,11 +5416,11 @@ static PyObject *__pyx_pf_9adios_mpi_24declare_group(CYTHON_UNUSED PyObject *__p
  *                      char * path,
  */
 
-static PyObject *__pyx_pw_9adios_mpi_27define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_9adios_mpi_define_var(int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_define_var *__pyx_optional_args) {
-  char *__pyx_v_dimensions = ((char *)__pyx_k__4);
-  char *__pyx_v_global_dimensions = ((char *)__pyx_k__4);
-  char *__pyx_v_local_offsets = ((char *)__pyx_k__4);
+static PyObject *__pyx_pw_9adios_mpi_31define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_9adios_mpi_define_var(int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_define_var *__pyx_optional_args) {
+  char *__pyx_v_dimensions = ((char *)__pyx_k__7);
+  char *__pyx_v_global_dimensions = ((char *)__pyx_k__7);
+  char *__pyx_v_local_offsets = ((char *)__pyx_k__7);
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("define_var", 0);
@@ -4138,17 +5436,17 @@ static int __pyx_f_9adios_mpi_define_var(int64_t __pyx_v_group_id, char *__pyx_v
     }
   }
 
-  /* "adios_mpi.pyx":333
+  /* "adios_mpi.pyx":386
  *                      char * global_dimensions = "",
  *                      char * local_offsets = ""):
  *     return adios_define_var(group_id,             # <<<<<<<<<<<<<<
  *                             name, path,
- *                             <ADIOS_DATATYPES> type,
+ *                             <ADIOS_DATATYPES> atype,
  */
-  __pyx_r = adios_define_var(__pyx_v_group_id, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_v_type), __pyx_v_dimensions, __pyx_v_global_dimensions, __pyx_v_local_offsets);
+  __pyx_r = adios_define_var(__pyx_v_group_id, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_v_atype), __pyx_v_dimensions, __pyx_v_global_dimensions, __pyx_v_local_offsets);
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":326
+  /* "adios_mpi.pyx":379
  *     return id
  * 
  * cpdef int define_var(int64_t group_id,             # <<<<<<<<<<<<<<
@@ -4163,12 +5461,13 @@ static int __pyx_f_9adios_mpi_define_var(int64_t __pyx_v_group_id, char *__pyx_v
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_27define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_27define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_31define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_30define_var[] = "define_var(int64_t group_id, char *name, char *path, int atype, char *dimensions='', char *global_dimensions='', char *local_offsets='') -> int";
+static PyObject *__pyx_pw_9adios_mpi_31define_var(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_group_id;
   char *__pyx_v_name;
   char *__pyx_v_path;
-  int __pyx_v_type;
+  int __pyx_v_atype;
   char *__pyx_v_dimensions;
   char *__pyx_v_global_dimensions;
   char *__pyx_v_local_offsets;
@@ -4179,7 +5478,7 @@ static PyObject *__pyx_pw_9adios_mpi_27define_var(PyObject *__pyx_self, PyObject
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("define_var (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group_id,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_type,&__pyx_n_s_dimensions,&__pyx_n_s_global_dimensions,&__pyx_n_s_local_offsets,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group_id,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_atype,&__pyx_n_s_dimensions,&__pyx_n_s_global_dimensions,&__pyx_n_s_local_offsets,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -4203,17 +5502,17 @@ static PyObject *__pyx_pw_9adios_mpi_27define_var(PyObject *__pyx_self, PyObject
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_type)) != 0)) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_atype)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
         if (kw_args > 0) {
@@ -4232,7 +5531,7 @@ static PyObject *__pyx_pw_9adios_mpi_27define_var(PyObject *__pyx_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_var") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_var") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -4247,42 +5546,42 @@ static PyObject *__pyx_pw_9adios_mpi_27define_var(PyObject *__pyx_self, PyObject
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_group_id = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group_id == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_type = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_group_id = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group_id == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_atype = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_atype == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     if (values[4]) {
-      __pyx_v_dimensions = __Pyx_PyObject_AsString(values[4]); if (unlikely((!__pyx_v_dimensions) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_dimensions = __Pyx_PyObject_AsString(values[4]); if (unlikely((!__pyx_v_dimensions) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_dimensions = ((char *)__pyx_k__4);
+      __pyx_v_dimensions = ((char *)__pyx_k__7);
     }
     if (values[5]) {
-      __pyx_v_global_dimensions = __Pyx_PyObject_AsString(values[5]); if (unlikely((!__pyx_v_global_dimensions) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_global_dimensions = __Pyx_PyObject_AsString(values[5]); if (unlikely((!__pyx_v_global_dimensions) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_global_dimensions = ((char *)__pyx_k__4);
+      __pyx_v_global_dimensions = ((char *)__pyx_k__7);
     }
     if (values[6]) {
-      __pyx_v_local_offsets = __Pyx_PyObject_AsString(values[6]); if (unlikely((!__pyx_v_local_offsets) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_local_offsets = __Pyx_PyObject_AsString(values[6]); if (unlikely((!__pyx_v_local_offsets) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_local_offsets = ((char *)__pyx_k__4);
+      __pyx_v_local_offsets = ((char *)__pyx_k__7);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("define_var", 0, 4, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.define_var", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_26define_var(__pyx_self, __pyx_v_group_id, __pyx_v_name, __pyx_v_path, __pyx_v_type, __pyx_v_dimensions, __pyx_v_global_dimensions, __pyx_v_local_offsets);
+  __pyx_r = __pyx_pf_9adios_mpi_30define_var(__pyx_self, __pyx_v_group_id, __pyx_v_name, __pyx_v_path, __pyx_v_atype, __pyx_v_dimensions, __pyx_v_global_dimensions, __pyx_v_local_offsets);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_26define_var(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_dimensions, char *__pyx_v_global_dimensions, char *__pyx_v_local_offsets) {
+static PyObject *__pyx_pf_9adios_mpi_30define_var(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group_id, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_dimensions, char *__pyx_v_global_dimensions, char *__pyx_v_local_offsets) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -4297,8 +5596,8 @@ static PyObject *__pyx_pf_9adios_mpi_26define_var(CYTHON_UNUSED PyObject *__pyx_
   __pyx_t_2.dimensions = __pyx_v_dimensions;
   __pyx_t_2.global_dimensions = __pyx_v_global_dimensions;
   __pyx_t_2.local_offsets = __pyx_v_local_offsets;
-  __pyx_t_1 = __pyx_f_9adios_mpi_define_var(__pyx_v_group_id, __pyx_v_name, __pyx_v_path, __pyx_v_type, 0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_9adios_mpi_define_var(__pyx_v_group_id, __pyx_v_name, __pyx_v_path, __pyx_v_atype, 0, &__pyx_t_2); 
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -4315,7 +5614,7 @@ static PyObject *__pyx_pf_9adios_mpi_26define_var(CYTHON_UNUSED PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":340
+/* "adios_mpi.pyx":393
  *                             local_offsets)
  * 
  * cpdef int define_attribute (int64_t group,             # <<<<<<<<<<<<<<
@@ -4323,23 +5622,23 @@ static PyObject *__pyx_pf_9adios_mpi_26define_var(CYTHON_UNUSED PyObject *__pyx_
  *                             char * path,
  */
 
-static PyObject *__pyx_pw_9adios_mpi_29define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_9adios_mpi_define_attribute(int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_value, char *__pyx_v_var, CYTHON_UNUSED int __pyx_skip_dispatch) {
+static PyObject *__pyx_pw_9adios_mpi_33define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_9adios_mpi_define_attribute(int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_value, char *__pyx_v_var, CYTHON_UNUSED int __pyx_skip_dispatch) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("define_attribute", 0);
 
-  /* "adios_mpi.pyx":346
+  /* "adios_mpi.pyx":399
  *                             char * value,
  *                             char * var):
  *     return adios_define_attribute (group,             # <<<<<<<<<<<<<<
  *                                    name,
  *                                    path,
  */
-  __pyx_r = adios_define_attribute(__pyx_v_group, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_v_type), __pyx_v_value, __pyx_v_var);
+  __pyx_r = adios_define_attribute(__pyx_v_group, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_v_atype), __pyx_v_value, __pyx_v_var);
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":340
+  /* "adios_mpi.pyx":393
  *                             local_offsets)
  * 
  * cpdef int define_attribute (int64_t group,             # <<<<<<<<<<<<<<
@@ -4354,12 +5653,13 @@ static int __pyx_f_9adios_mpi_define_attribute(int64_t __pyx_v_group, char *__py
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_29define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_29define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_33define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_32define_attribute[] = "define_attribute(int64_t group, char *name, char *path, int atype, char *value, char *var) -> int";
+static PyObject *__pyx_pw_9adios_mpi_33define_attribute(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int64_t __pyx_v_group;
   char *__pyx_v_name;
   char *__pyx_v_path;
-  int __pyx_v_type;
+  int __pyx_v_atype;
   char *__pyx_v_value;
   char *__pyx_v_var;
   int __pyx_lineno = 0;
@@ -4369,7 +5669,7 @@ static PyObject *__pyx_pw_9adios_mpi_29define_attribute(PyObject *__pyx_self, Py
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("define_attribute (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_type,&__pyx_n_s_value,&__pyx_n_s_var,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_atype,&__pyx_n_s_value,&__pyx_n_s_var,0};
     PyObject* values[6] = {0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -4392,31 +5692,31 @@ static PyObject *__pyx_pw_9adios_mpi_29define_attribute(PyObject *__pyx_self, Py
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_type)) != 0)) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_atype)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
         if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
         if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_var)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_attribute") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_attribute") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 6) {
       goto __pyx_L5_argtuple_error;
@@ -4428,29 +5728,29 @@ static PyObject *__pyx_pw_9adios_mpi_29define_attribute(PyObject *__pyx_self, Py
       values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
       values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
     }
-    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 341; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_type = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_value = __Pyx_PyObject_AsString(values[4]); if (unlikely((!__pyx_v_value) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_var = __Pyx_PyObject_AsString(values[5]); if (unlikely((!__pyx_v_var) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_atype = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_atype == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_value = __Pyx_PyObject_AsString(values[4]); if (unlikely((!__pyx_v_value) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_var = __Pyx_PyObject_AsString(values[5]); if (unlikely((!__pyx_v_var) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("define_attribute", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.define_attribute", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_28define_attribute(__pyx_self, __pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_type, __pyx_v_value, __pyx_v_var);
+  __pyx_r = __pyx_pf_9adios_mpi_32define_attribute(__pyx_self, __pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_atype, __pyx_v_value, __pyx_v_var);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_28define_attribute(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_type, char *__pyx_v_value, char *__pyx_v_var) {
+static PyObject *__pyx_pf_9adios_mpi_32define_attribute(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, int __pyx_v_atype, char *__pyx_v_value, char *__pyx_v_var) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -4459,7 +5759,7 @@ static PyObject *__pyx_pf_9adios_mpi_28define_attribute(CYTHON_UNUSED PyObject *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("define_attribute", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_define_attribute(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_type, __pyx_v_value, __pyx_v_var, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_define_attribute(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_atype, __pyx_v_value, __pyx_v_var, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -4476,72 +5776,527 @@ static PyObject *__pyx_pf_9adios_mpi_28define_attribute(CYTHON_UNUSED PyObject *
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":353
+/* "adios_mpi.pyx":406
  *                                    var)
  * 
- * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
- *                          char * method,
- *                          char * parameters = "",
+ * cpdef int define_attribute_byvalue (int64_t group,             # <<<<<<<<<<<<<<
+ *                                     char * name,
+ *                                     char * path,
  */
 
-static PyObject *__pyx_pw_9adios_mpi_31select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_9adios_mpi_select_method(int64_t __pyx_v_group, char *__pyx_v_method, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_select_method *__pyx_optional_args) {
-  char *__pyx_v_parameters = ((char *)__pyx_k__4);
-  char *__pyx_v_base_path = ((char *)__pyx_k__4);
+static PyObject *__pyx_pw_9adios_mpi_35define_attribute_byvalue(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_9adios_mpi_define_attribute_byvalue(int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, PyObject *__pyx_v_val, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyArrayObject *__pyx_v_val_ = 0;
+  PyObject *__pyx_v_atype = NULL;
+  char *__pyx_v_pt1;
+  char **__pyx_v_pt2;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("select_method", 0);
-  if (__pyx_optional_args) {
-    if (__pyx_optional_args->__pyx_n > 0) {
-      __pyx_v_parameters = __pyx_optional_args->parameters;
-      if (__pyx_optional_args->__pyx_n > 1) {
-        __pyx_v_base_path = __pyx_optional_args->base_path;
-      }
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  char *__pyx_t_7;
+  ADIOS_DATATYPES __pyx_t_8;
+  Py_ssize_t __pyx_t_9;
+  int __pyx_t_10;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define_attribute_byvalue", 0);
+
+  /* "adios_mpi.pyx":411
+ *                                     val):
+ *     cdef np.ndarray val_
+ *     if isinstance(val, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *         if val.flags.contiguous:
+ *             val_ = val
+ */
+  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_val, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
+
+    /* "adios_mpi.pyx":412
+ *     cdef np.ndarray val_
+ *     if isinstance(val, (np.ndarray)):
+ *         if val.flags.contiguous:             # <<<<<<<<<<<<<<
+ *             val_ = val
+ *         else:
+ */
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_flags); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_contiguous); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (__pyx_t_2) {
+
+      /* "adios_mpi.pyx":413
+ *     if isinstance(val, (np.ndarray)):
+ *         if val.flags.contiguous:
+ *             val_ = val             # <<<<<<<<<<<<<<
+ *         else:
+ *             val_ = np.array(val, copy=True)
+ */
+      if (!(likely(((__pyx_v_val) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_val, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __pyx_v_val;
+      __Pyx_INCREF(__pyx_t_4);
+      __pyx_v_val_ = ((PyArrayObject *)__pyx_t_4);
+      __pyx_t_4 = 0;
+      goto __pyx_L4;
+    }
+    /*else*/ {
+
+      /* "adios_mpi.pyx":415
+ *             val_ = val
+ *         else:
+ *             val_ = np.array(val, copy=True)             # <<<<<<<<<<<<<<
+ *     else:
+ *         val_ = np.array(val)
+ */
+      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_INCREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_val);
+      __Pyx_GIVEREF(__pyx_v_val);
+      __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_copy, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_val_ = ((PyArrayObject *)__pyx_t_6);
+      __pyx_t_6 = 0;
     }
+    __pyx_L4:;
+    goto __pyx_L3;
   }
+  /*else*/ {
 
-  /* "adios_mpi.pyx":357
- *                          char * parameters = "",
- *                          char * base_path = ""):
- *     return adios_select_method (group,             # <<<<<<<<<<<<<<
- *                                 method,
- *                                 parameters,
+    /* "adios_mpi.pyx":417
+ *             val_ = np.array(val, copy=True)
+ *     else:
+ *         val_ = np.array(val)             # <<<<<<<<<<<<<<
+ * 
+ *     atype = np2adiostype(val_.dtype)
  */
-  __pyx_r = adios_select_method(__pyx_v_group, __pyx_v_method, __pyx_v_parameters, __pyx_v_base_path);
-  goto __pyx_L0;
+    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_5)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_5);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+      }
+    }
+    if (!__pyx_t_5) {
+      __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_val); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+    } else {
+      __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
+      __Pyx_INCREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_v_val);
+      __Pyx_GIVEREF(__pyx_v_val);
+      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_val_ = ((PyArrayObject *)__pyx_t_6);
+    __pyx_t_6 = 0;
+  }
+  __pyx_L3:;
 
-  /* "adios_mpi.pyx":353
- *                                    var)
+  /* "adios_mpi.pyx":419
+ *         val_ = np.array(val)
  * 
- * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
- *                          char * method,
- *                          char * parameters = "",
+ *     atype = np2adiostype(val_.dtype)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef char * pt1
  */
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val_), __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __pyx_f_9adios_mpi_np2adiostype(((PyArray_Descr *)__pyx_t_6), 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_v_atype = __pyx_t_4;
+  __pyx_t_4 = 0;
 
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios_mpi.pyx":423
+ *     cdef char * pt1
+ *     cdef char ** pt2
+ *     if (val_.dtype.char == 'S'):             # <<<<<<<<<<<<<<
+ *         if (val_.size == 1):
+ *             pt1 = PyString_AsString(val)
+ */
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val_), __pyx_n_s_dtype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_char); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_t_6, __pyx_n_s_S, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  if (__pyx_t_2) {
 
-/* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_31select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_31select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int64_t __pyx_v_group;
-  char *__pyx_v_method;
-  char *__pyx_v_parameters;
-  char *__pyx_v_base_path;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("select_method (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_method,&__pyx_n_s_parameters,&__pyx_n_s_base_path,0};
-    PyObject* values[4] = {0,0,0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
+    /* "adios_mpi.pyx":424
+ *     cdef char ** pt2
+ *     if (val_.dtype.char == 'S'):
+ *         if (val_.size == 1):             # <<<<<<<<<<<<<<
+ *             pt1 = PyString_AsString(val)
+ *             adios_define_attribute_byvalue (group,
+ */
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val_), __pyx_n_s_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_6, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (__pyx_t_2) {
+
+      /* "adios_mpi.pyx":425
+ *     if (val_.dtype.char == 'S'):
+ *         if (val_.size == 1):
+ *             pt1 = PyString_AsString(val)             # <<<<<<<<<<<<<<
+ *             adios_define_attribute_byvalue (group,
+ *                                             name,
+ */
+      __pyx_t_7 = PyString_AsString(__pyx_v_val); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_pt1 = __pyx_t_7;
+
+      /* "adios_mpi.pyx":429
+ *                                             name,
+ *                                             path,
+ *                                             DATATYPE.string,             # <<<<<<<<<<<<<<
+ *                                             1,
+ *                                             <void *> pt1)
+ */
+      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_string); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = ((ADIOS_DATATYPES)PyInt_AsLong(__pyx_t_6)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+      /* "adios_mpi.pyx":426
+ *         if (val_.size == 1):
+ *             pt1 = PyString_AsString(val)
+ *             adios_define_attribute_byvalue (group,             # <<<<<<<<<<<<<<
+ *                                             name,
+ *                                             path,
+ */
+      adios_define_attribute_byvalue(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_t_8, 1, ((void *)__pyx_v_pt1));
+      goto __pyx_L6;
+    }
+    /*else*/ {
+
+      /* "adios_mpi.pyx":433
+ *                                             <void *> pt1)
+ *         else:
+ *             pt2 = to_cstring_array(val)             # <<<<<<<<<<<<<<
+ *             adios_define_attribute_byvalue (group,
+ *                                             name,
+ */
+      __pyx_v_pt2 = __pyx_f_9adios_mpi_to_cstring_array(__pyx_v_val);
+
+      /* "adios_mpi.pyx":437
+ *                                             name,
+ *                                             path,
+ *                                             DATATYPE.string_array,             # <<<<<<<<<<<<<<
+ *                                             len(val),
+ *                                             <void *> pt2)
+ */
+      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_string_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_8 = ((ADIOS_DATATYPES)PyInt_AsLong(__pyx_t_4)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+      /* "adios_mpi.pyx":438
+ *                                             path,
+ *                                             DATATYPE.string_array,
+ *                                             len(val),             # <<<<<<<<<<<<<<
+ *                                             <void *> pt2)
+ *             free(pt2)
+ */
+      __pyx_t_9 = PyObject_Length(__pyx_v_val); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+      /* "adios_mpi.pyx":434
+ *         else:
+ *             pt2 = to_cstring_array(val)
+ *             adios_define_attribute_byvalue (group,             # <<<<<<<<<<<<<<
+ *                                             name,
+ *                                             path,
+ */
+      adios_define_attribute_byvalue(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_t_8, __pyx_t_9, ((void *)__pyx_v_pt2));
+
+      /* "adios_mpi.pyx":440
+ *                                             len(val),
+ *                                             <void *> pt2)
+ *             free(pt2)             # <<<<<<<<<<<<<<
+ *     else:
+ *         adios_define_attribute_byvalue (group,
+ */
+      free(__pyx_v_pt2);
+    }
+    __pyx_L6:;
+    goto __pyx_L5;
+  }
+  /*else*/ {
+
+    /* "adios_mpi.pyx":445
+ *                                         name,
+ *                                         path,
+ *                                         <ADIOS_DATATYPES> atype,             # <<<<<<<<<<<<<<
+ *                                         val_.size,
+ *                                         <void *> val_.data)
+ */
+    __pyx_t_8 = ((ADIOS_DATATYPES)PyInt_AsLong(__pyx_v_atype)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "adios_mpi.pyx":446
+ *                                         path,
+ *                                         <ADIOS_DATATYPES> atype,
+ *                                         val_.size,             # <<<<<<<<<<<<<<
+ *                                         <void *> val_.data)
+ * 
+ */
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_val_), __pyx_n_s_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "adios_mpi.pyx":442
+ *             free(pt2)
+ *     else:
+ *         adios_define_attribute_byvalue (group,             # <<<<<<<<<<<<<<
+ *                                         name,
+ *                                         path,
+ */
+    adios_define_attribute_byvalue(__pyx_v_group, __pyx_v_name, __pyx_v_path, ((ADIOS_DATATYPES)__pyx_t_8), __pyx_t_10, ((void *)__pyx_v_val_->data));
+  }
+  __pyx_L5:;
+
+  /* "adios_mpi.pyx":406
+ *                                    var)
+ * 
+ * cpdef int define_attribute_byvalue (int64_t group,             # <<<<<<<<<<<<<<
+ *                                     char * name,
+ *                                     char * path,
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_WriteUnraisable("adios_mpi.define_attribute_byvalue", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_val_);
+  __Pyx_XDECREF(__pyx_v_atype);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_35define_attribute_byvalue(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_34define_attribute_byvalue[] = "define_attribute_byvalue(int64_t group, char *name, char *path, val) -> int";
+static PyObject *__pyx_pw_9adios_mpi_35define_attribute_byvalue(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int64_t __pyx_v_group;
+  char *__pyx_v_name;
+  char *__pyx_v_path;
+  PyObject *__pyx_v_val = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define_attribute_byvalue (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_name,&__pyx_n_s_path,&__pyx_n_s_val,0};
+    PyObject* values[4] = {0,0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_group)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_attribute_byvalue", 1, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  2:
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_attribute_byvalue", 1, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  3:
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_attribute_byvalue", 1, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_attribute_byvalue") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+    }
+    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_path = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = values[3];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("define_attribute_byvalue", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.define_attribute_byvalue", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_34define_attribute_byvalue(__pyx_self, __pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_val);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_34define_attribute_byvalue(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_name, char *__pyx_v_path, PyObject *__pyx_v_val) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define_attribute_byvalue", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_9adios_mpi_define_attribute_byvalue(__pyx_v_group, __pyx_v_name, __pyx_v_path, __pyx_v_val, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.define_attribute_byvalue", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":449
+ *                                         <void *> val_.data)
+ * 
+ * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
+ *                          char * method,
+ *                          char * parameters = "",
+ */
+
+static PyObject *__pyx_pw_9adios_mpi_37select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_9adios_mpi_select_method(int64_t __pyx_v_group, char *__pyx_v_method, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_select_method *__pyx_optional_args) {
+  char *__pyx_v_parameters = ((char *)__pyx_k__7);
+  char *__pyx_v_base_path = ((char *)__pyx_k__7);
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("select_method", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_parameters = __pyx_optional_args->parameters;
+      if (__pyx_optional_args->__pyx_n > 1) {
+        __pyx_v_base_path = __pyx_optional_args->base_path;
+      }
+    }
+  }
+
+  /* "adios_mpi.pyx":453
+ *                          char * parameters = "",
+ *                          char * base_path = ""):
+ *     return adios_select_method (group,             # <<<<<<<<<<<<<<
+ *                                 method,
+ *                                 parameters,
+ */
+  __pyx_r = adios_select_method(__pyx_v_group, __pyx_v_method, __pyx_v_parameters, __pyx_v_base_path);
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":449
+ *                                         <void *> val_.data)
+ * 
+ * cpdef int select_method (int64_t group,             # <<<<<<<<<<<<<<
+ *                          char * method,
+ *                          char * parameters = "",
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_37select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_36select_method[] = "select_method(int64_t group, char *method, char *parameters='', char *base_path='') -> int";
+static PyObject *__pyx_pw_9adios_mpi_37select_method(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int64_t __pyx_v_group;
+  char *__pyx_v_method;
+  char *__pyx_v_parameters;
+  char *__pyx_v_base_path;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("select_method (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_group,&__pyx_n_s_method,&__pyx_n_s_parameters,&__pyx_n_s_base_path,0};
+    PyObject* values[4] = {0,0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
       switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -4559,7 +6314,7 @@ static PyObject *__pyx_pw_9adios_mpi_31select_method(PyObject *__pyx_self, PyObj
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("select_method", 0, 2, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("select_method", 0, 2, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (kw_args > 0) {
@@ -4573,7 +6328,7 @@ static PyObject *__pyx_pw_9adios_mpi_31select_method(PyObject *__pyx_self, PyObj
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "select_method") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "select_method") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -4585,35 +6340,35 @@ static PyObject *__pyx_pw_9adios_mpi_31select_method(PyObject *__pyx_self, PyObj
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_method = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_group = __Pyx_PyInt_As_int64_t(values[0]); if (unlikely((__pyx_v_group == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_method = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     if (values[2]) {
-      __pyx_v_parameters = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_parameters) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 355; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_parameters = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_parameters) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_parameters = ((char *)__pyx_k__4);
+      __pyx_v_parameters = ((char *)__pyx_k__7);
     }
     if (values[3]) {
-      __pyx_v_base_path = __Pyx_PyObject_AsString(values[3]); if (unlikely((!__pyx_v_base_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_base_path = __Pyx_PyObject_AsString(values[3]); if (unlikely((!__pyx_v_base_path) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_base_path = ((char *)__pyx_k__4);
+      __pyx_v_base_path = ((char *)__pyx_k__7);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("select_method", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("select_method", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.select_method", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_30select_method(__pyx_self, __pyx_v_group, __pyx_v_method, __pyx_v_parameters, __pyx_v_base_path);
+  __pyx_r = __pyx_pf_9adios_mpi_36select_method(__pyx_self, __pyx_v_group, __pyx_v_method, __pyx_v_parameters, __pyx_v_base_path);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_30select_method(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_method, char *__pyx_v_parameters, char *__pyx_v_base_path) {
+static PyObject *__pyx_pf_9adios_mpi_36select_method(CYTHON_UNUSED PyObject *__pyx_self, int64_t __pyx_v_group, char *__pyx_v_method, char *__pyx_v_parameters, char *__pyx_v_base_path) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -4628,7 +6383,7 @@ static PyObject *__pyx_pf_9adios_mpi_30select_method(CYTHON_UNUSED PyObject *__p
   __pyx_t_2.parameters = __pyx_v_parameters;
   __pyx_t_2.base_path = __pyx_v_base_path;
   __pyx_t_1 = __pyx_f_9adios_mpi_select_method(__pyx_v_group, __pyx_v_method, 0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -4645,396 +6400,538 @@ static PyObject *__pyx_pf_9adios_mpi_30select_method(CYTHON_UNUSED PyObject *__p
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":367
+/* "adios_mpi.pyx":463
  * ## ====================
  * 
- * cdef type adios2nptype(ADIOS_DATATYPES t):             # <<<<<<<<<<<<<<
- *     cdef type ntype = None
- *     if t == adios_byte:
+ * cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):             # <<<<<<<<<<<<<<
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None
  */
 
-static PyObject *__pyx_f_9adios_mpi_adios2nptype(ADIOS_DATATYPES __pyx_v_t) {
-  PyObject *__pyx_v_ntype = 0;
-  PyObject *__pyx_r = NULL;
+static PyObject *__pyx_pw_9adios_mpi_39adios2npdtype(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyArray_Descr *__pyx_f_9adios_mpi_adios2npdtype(ADIOS_DATATYPES __pyx_v_t, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_adios2npdtype *__pyx_optional_args) {
+  int __pyx_v_strlen = ((int)1);
+  PyArray_Descr *__pyx_v_ntype = 0;
+  PyArray_Descr *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("adios2nptype", 0);
+  __Pyx_RefNannySetupContext("adios2npdtype", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_strlen = __pyx_optional_args->strlen;
+    }
+  }
 
-  /* "adios_mpi.pyx":368
- * 
- * cdef type adios2nptype(ADIOS_DATATYPES t):
- *     cdef type ntype = None             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":465
+ * cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None             # <<<<<<<<<<<<<<
  *     if t == adios_byte:
- *         ntype = np.int8
+ *         ntype = np.dtype(np.int8)
  */
   __Pyx_INCREF(Py_None);
-  __pyx_v_ntype = ((PyObject*)Py_None);
+  __pyx_v_ntype = ((PyArray_Descr *)Py_None);
 
-  /* "adios_mpi.pyx":393
- *     elif t == adios_complex:
- *         ntype = np.complex64
- *     elif t == adios_double_complex:             # <<<<<<<<<<<<<<
- *         ntype = np.complex128
+  /* "adios_mpi.pyx":492
+ *     elif t == adios_double_complex:
+ *         ntype = np.dtype(np.complex128)
+ *     elif t == adios_string:             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype((np.str_, strlen))
  *     else:
  */
   switch (__pyx_v_t) {
 
-    /* "adios_mpi.pyx":369
- * cdef type adios2nptype(ADIOS_DATATYPES t):
- *     cdef type ntype = None
+    /* "adios_mpi.pyx":466
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None
  *     if t == adios_byte:             # <<<<<<<<<<<<<<
- *         ntype = np.int8
+ *         ntype = np.dtype(np.int8)
  *     elif t == adios_short:
  */
     case adios_byte:
 
-    /* "adios_mpi.pyx":370
- *     cdef type ntype = None
+    /* "adios_mpi.pyx":467
+ *     cdef np.dtype ntype = None
  *     if t == adios_byte:
- *         ntype = np.int8             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.int8)             # <<<<<<<<<<<<<<
  *     elif t == adios_short:
- *         ntype = np.int16
+ *         ntype = np.dtype(np.int16)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios_mpi.pyx":371
+    /* "adios_mpi.pyx":468
  *     if t == adios_byte:
- *         ntype = np.int8
+ *         ntype = np.dtype(np.int8)
  *     elif t == adios_short:             # <<<<<<<<<<<<<<
- *         ntype = np.int16
+ *         ntype = np.dtype(np.int16)
  *     elif t == adios_integer:
  */
     case adios_short:
 
-    /* "adios_mpi.pyx":372
- *         ntype = np.int8
+    /* "adios_mpi.pyx":469
+ *         ntype = np.dtype(np.int8)
  *     elif t == adios_short:
- *         ntype = np.int16             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.int16)             # <<<<<<<<<<<<<<
  *     elif t == adios_integer:
- *         ntype = np.int32
+ *         ntype = np.dtype(np.int32)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios_mpi.pyx":373
+    /* "adios_mpi.pyx":470
  *     elif t == adios_short:
- *         ntype = np.int16
+ *         ntype = np.dtype(np.int16)
  *     elif t == adios_integer:             # <<<<<<<<<<<<<<
- *         ntype = np.int32
+ *         ntype = np.dtype(np.int32)
  *     elif t == adios_long:
  */
     case adios_integer:
 
-    /* "adios_mpi.pyx":374
- *         ntype = np.int16
+    /* "adios_mpi.pyx":471
+ *         ntype = np.dtype(np.int16)
  *     elif t == adios_integer:
- *         ntype = np.int32             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.int32)             # <<<<<<<<<<<<<<
  *     elif t == adios_long:
- *         ntype = np.int64
+ *         ntype = np.dtype(np.int64)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios_mpi.pyx":375
+    /* "adios_mpi.pyx":472
  *     elif t == adios_integer:
- *         ntype = np.int32
+ *         ntype = np.dtype(np.int32)
  *     elif t == adios_long:             # <<<<<<<<<<<<<<
- *         ntype = np.int64
+ *         ntype = np.dtype(np.int64)
  *     elif t == adios_unsigned_byte:
  */
     case adios_long:
 
-    /* "adios_mpi.pyx":376
- *         ntype = np.int32
+    /* "adios_mpi.pyx":473
+ *         ntype = np.dtype(np.int32)
  *     elif t == adios_long:
- *         ntype = np.int64             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.int64)             # <<<<<<<<<<<<<<
  *     elif t == adios_unsigned_byte:
- *         ntype = np.uint8
+ *         ntype = np.dtype(np.uint8)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios_mpi.pyx":377
+    /* "adios_mpi.pyx":474
  *     elif t == adios_long:
- *         ntype = np.int64
+ *         ntype = np.dtype(np.int64)
  *     elif t == adios_unsigned_byte:             # <<<<<<<<<<<<<<
- *         ntype = np.uint8
+ *         ntype = np.dtype(np.uint8)
  *     elif t == adios_unsigned_short:
  */
     case adios_unsigned_byte:
 
-    /* "adios_mpi.pyx":378
- *         ntype = np.int64
+    /* "adios_mpi.pyx":475
+ *         ntype = np.dtype(np.int64)
  *     elif t == adios_unsigned_byte:
- *         ntype = np.uint8             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.uint8)             # <<<<<<<<<<<<<<
  *     elif t == adios_unsigned_short:
- *         ntype = np.uint16
+ *         ntype = np.dtype(np.uint16)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios_mpi.pyx":379
+    /* "adios_mpi.pyx":476
  *     elif t == adios_unsigned_byte:
- *         ntype = np.uint8
+ *         ntype = np.dtype(np.uint8)
  *     elif t == adios_unsigned_short:             # <<<<<<<<<<<<<<
- *         ntype = np.uint16
+ *         ntype = np.dtype(np.uint16)
  *     elif t == adios_unsigned_integer:
  */
     case adios_unsigned_short:
 
-    /* "adios_mpi.pyx":380
- *         ntype = np.uint8
+    /* "adios_mpi.pyx":477
+ *         ntype = np.dtype(np.uint8)
  *     elif t == adios_unsigned_short:
- *         ntype = np.uint16             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.uint16)             # <<<<<<<<<<<<<<
  *     elif t == adios_unsigned_integer:
- *         ntype = np.uint32
+ *         ntype = np.dtype(np.uint32)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios_mpi.pyx":381
+    /* "adios_mpi.pyx":478
  *     elif t == adios_unsigned_short:
- *         ntype = np.uint16
+ *         ntype = np.dtype(np.uint16)
  *     elif t == adios_unsigned_integer:             # <<<<<<<<<<<<<<
- *         ntype = np.uint32
+ *         ntype = np.dtype(np.uint32)
  *     elif t == adios_unsigned_long:
  */
     case adios_unsigned_integer:
 
-    /* "adios_mpi.pyx":382
- *         ntype = np.uint16
+    /* "adios_mpi.pyx":479
+ *         ntype = np.dtype(np.uint16)
  *     elif t == adios_unsigned_integer:
- *         ntype = np.uint32             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.uint32)             # <<<<<<<<<<<<<<
  *     elif t == adios_unsigned_long:
- *         ntype = np.uint64
+ *         ntype = np.dtype(np.uint64)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
-    break;
-
-    /* "adios_mpi.pyx":383
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
+    __pyx_t_2 = 0;
+    break;
+
+    /* "adios_mpi.pyx":480
  *     elif t == adios_unsigned_integer:
- *         ntype = np.uint32
+ *         ntype = np.dtype(np.uint32)
  *     elif t == adios_unsigned_long:             # <<<<<<<<<<<<<<
- *         ntype = np.uint64
+ *         ntype = np.dtype(np.uint64)
  *     elif t == adios_real:
  */
     case adios_unsigned_long:
 
-    /* "adios_mpi.pyx":384
- *         ntype = np.uint32
+    /* "adios_mpi.pyx":481
+ *         ntype = np.dtype(np.uint32)
  *     elif t == adios_unsigned_long:
- *         ntype = np.uint64             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.uint64)             # <<<<<<<<<<<<<<
  *     elif t == adios_real:
- *         ntype = np.float32
+ *         ntype = np.dtype(np.float32)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios_mpi.pyx":385
+    /* "adios_mpi.pyx":482
  *     elif t == adios_unsigned_long:
- *         ntype = np.uint64
+ *         ntype = np.dtype(np.uint64)
  *     elif t == adios_real:             # <<<<<<<<<<<<<<
- *         ntype = np.float32
+ *         ntype = np.dtype(np.float32)
  *     elif t == adios_double:
  */
     case adios_real:
 
-    /* "adios_mpi.pyx":386
- *         ntype = np.uint64
+    /* "adios_mpi.pyx":483
+ *         ntype = np.dtype(np.uint64)
  *     elif t == adios_real:
- *         ntype = np.float32             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.float32)             # <<<<<<<<<<<<<<
  *     elif t == adios_double:
- *         ntype = np.float64
+ *         ntype = np.dtype(np.float64)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios_mpi.pyx":387
+    /* "adios_mpi.pyx":484
  *     elif t == adios_real:
- *         ntype = np.float32
+ *         ntype = np.dtype(np.float32)
  *     elif t == adios_double:             # <<<<<<<<<<<<<<
- *         ntype = np.float64
+ *         ntype = np.dtype(np.float64)
  *     elif t == adios_long_double:
  */
     case adios_double:
 
-    /* "adios_mpi.pyx":388
- *         ntype = np.float32
+    /* "adios_mpi.pyx":485
+ *         ntype = np.dtype(np.float32)
  *     elif t == adios_double:
- *         ntype = np.float64             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.float64)             # <<<<<<<<<<<<<<
  *     elif t == adios_long_double:
- *         ntype = np.float128
+ *         ntype = np.dtype(np.float128)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios_mpi.pyx":389
+    /* "adios_mpi.pyx":486
  *     elif t == adios_double:
- *         ntype = np.float64
+ *         ntype = np.dtype(np.float64)
  *     elif t == adios_long_double:             # <<<<<<<<<<<<<<
- *         ntype = np.float128
+ *         ntype = np.dtype(np.float128)
  *     elif t == adios_complex:
  */
     case adios_long_double:
 
-    /* "adios_mpi.pyx":390
- *         ntype = np.float64
+    /* "adios_mpi.pyx":487
+ *         ntype = np.dtype(np.float64)
  *     elif t == adios_long_double:
- *         ntype = np.float128             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.float128)             # <<<<<<<<<<<<<<
  *     elif t == adios_complex:
- *         ntype = np.complex64
+ *         ntype = np.dtype(np.complex64)
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
     __pyx_t_2 = 0;
     break;
 
-    /* "adios_mpi.pyx":391
+    /* "adios_mpi.pyx":488
  *     elif t == adios_long_double:
- *         ntype = np.float128
+ *         ntype = np.dtype(np.float128)
  *     elif t == adios_complex:             # <<<<<<<<<<<<<<
- *         ntype = np.complex64
+ *         ntype = np.dtype(np.complex64)
  *     elif t == adios_double_complex:
  */
     case adios_complex:
 
-    /* "adios_mpi.pyx":392
- *         ntype = np.float128
+    /* "adios_mpi.pyx":489
+ *         ntype = np.dtype(np.float128)
  *     elif t == adios_complex:
- *         ntype = np.complex64             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.complex64)             # <<<<<<<<<<<<<<
  *     elif t == adios_double_complex:
- *         ntype = np.complex128
+ *         ntype = np.dtype(np.complex128)
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_1));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_1));
     __pyx_t_1 = 0;
     break;
 
-    /* "adios_mpi.pyx":393
+    /* "adios_mpi.pyx":490
  *     elif t == adios_complex:
- *         ntype = np.complex64
+ *         ntype = np.dtype(np.complex64)
  *     elif t == adios_double_complex:             # <<<<<<<<<<<<<<
- *         ntype = np.complex128
- *     else:
+ *         ntype = np.dtype(np.complex128)
+ *     elif t == adios_string:
  */
     case adios_double_complex:
 
-    /* "adios_mpi.pyx":394
- *         ntype = np.complex64
+    /* "adios_mpi.pyx":491
+ *         ntype = np.dtype(np.complex64)
+ *     elif t == adios_double_complex:
+ *         ntype = np.dtype(np.complex128)             # <<<<<<<<<<<<<<
+ *     elif t == adios_string:
+ *         ntype = np.dtype((np.str_, strlen))
+ */
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_2));
+    __pyx_t_2 = 0;
+    break;
+
+    /* "adios_mpi.pyx":492
  *     elif t == adios_double_complex:
- *         ntype = np.complex128             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype(np.complex128)
+ *     elif t == adios_string:             # <<<<<<<<<<<<<<
+ *         ntype = np.dtype((np.str_, strlen))
+ *     else:
+ */
+    case adios_string:
+
+    /* "adios_mpi.pyx":493
+ *         ntype = np.dtype(np.complex128)
+ *     elif t == adios_string:
+ *         ntype = np.dtype((np.str_, strlen))             # <<<<<<<<<<<<<<
  *     else:
  *         ntype = None
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_str); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_strlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(PyType_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)__pyx_t_2));
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_1 = 0;
     __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_3);
+    __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5numpy_dtype)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)__pyx_t_3));
+    __pyx_t_3 = 0;
     break;
     default:
 
-    /* "adios_mpi.pyx":396
- *         ntype = np.complex128
+    /* "adios_mpi.pyx":495
+ *         ntype = np.dtype((np.str_, strlen))
  *     else:
  *         ntype = None             # <<<<<<<<<<<<<<
  * 
  *     return ntype
  */
     __Pyx_INCREF(Py_None);
-    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyObject*)Py_None));
+    __Pyx_DECREF_SET(__pyx_v_ntype, ((PyArray_Descr *)Py_None));
     break;
   }
 
-  /* "adios_mpi.pyx":398
+  /* "adios_mpi.pyx":497
  *         ntype = None
  * 
  *     return ntype             # <<<<<<<<<<<<<<
@@ -5046,28 +6943,126 @@ static PyObject *__pyx_f_9adios_mpi_adios2nptype(ADIOS_DATATYPES __pyx_v_t) {
   __pyx_r = __pyx_v_ntype;
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":367
+  /* "adios_mpi.pyx":463
  * ## ====================
  * 
- * cdef type adios2nptype(ADIOS_DATATYPES t):             # <<<<<<<<<<<<<<
- *     cdef type ntype = None
- *     if t == adios_byte:
+ * cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):             # <<<<<<<<<<<<<<
+ *     """ strlen apply only to string type """
+ *     cdef np.dtype ntype = None
  */
 
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_AddTraceback("adios_mpi.adios2nptype", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios_mpi.adios2npdtype", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_ntype);
+  __Pyx_XDECREF((PyObject *)__pyx_v_ntype);
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_39adios2npdtype(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_38adios2npdtype[] = "adios2npdtype(ADIOS_DATATYPES t, int strlen=1) -> dtype\n strlen apply only to string type ";
+static PyObject *__pyx_pw_9adios_mpi_39adios2npdtype(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  ADIOS_DATATYPES __pyx_v_t;
+  int __pyx_v_strlen;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("adios2npdtype (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_t,&__pyx_n_s_strlen,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_t)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_strlen);
+          if (value) { values[1] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "adios2npdtype") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_t = ((ADIOS_DATATYPES)PyInt_AsLong(values[0])); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[1]) {
+      __pyx_v_strlen = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_strlen == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_strlen = ((int)1);
+    }
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("adios2npdtype", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.adios2npdtype", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_38adios2npdtype(__pyx_self, __pyx_v_t, __pyx_v_strlen);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_38adios2npdtype(CYTHON_UNUSED PyObject *__pyx_self, ADIOS_DATATYPES __pyx_v_t, int __pyx_v_strlen) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  struct __pyx_opt_args_9adios_mpi_adios2npdtype __pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("adios2npdtype", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2.__pyx_n = 1;
+  __pyx_t_2.strlen = __pyx_v_strlen;
+  __pyx_t_1 = ((PyObject *)__pyx_f_9adios_mpi_adios2npdtype(__pyx_v_t, 0, &__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.adios2npdtype", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":400
+/* "adios_mpi.pyx":499
  *     return ntype
  * 
  * cdef printfile(ADIOS_FILE * f):             # <<<<<<<<<<<<<<
@@ -5088,16 +7083,16 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("printfile", 0);
 
-  /* "adios_mpi.pyx":401
+  /* "adios_mpi.pyx":500
  * 
  * cdef printfile(ADIOS_FILE * f):
  *     print '%15s : %lu' % ('fh', f.fh)             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('nvars', f.nvars)
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])
  */
-  __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_f->fh); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_f->fh); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_fh);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_fh);
@@ -5105,22 +7100,22 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":402
+  /* "adios_mpi.pyx":501
  * cdef printfile(ADIOS_FILE * f):
  *     print '%15s : %lu' % ('fh', f.fh)
  *     print '%15s : %d' % ('nvars', f.nvars)             # <<<<<<<<<<<<<<
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])
  *     print '%15s : %d' % ('nattrs', f.nattrs)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->nvars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->nvars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_nvars);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_nvars);
@@ -5128,30 +7123,30 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":403
+  /* "adios_mpi.pyx":502
  *     print '%15s : %lu' % ('fh', f.fh)
  *     print '%15s : %d' % ('nvars', f.nvars)
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('nattrs', f.nattrs)
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = __pyx_v_f->nvars;
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
-    __pyx_t_2 = __Pyx_PyBytes_FromString((__pyx_v_f->var_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyBytes_FromString((__pyx_v_f->var_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_var_namelist);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_var_namelist);
@@ -5159,22 +7154,22 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":404
+  /* "adios_mpi.pyx":503
  *     print '%15s : %d' % ('nvars', f.nvars)
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])
  *     print '%15s : %d' % ('nattrs', f.nattrs)             # <<<<<<<<<<<<<<
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])
  *     print '%15s : %d' % ('current_step', f.current_step)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->nattrs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->nattrs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_nattrs);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_nattrs);
@@ -5182,30 +7177,30 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":405
+  /* "adios_mpi.pyx":504
  *     print '%15s : %s' % ('var_namelist', [f.var_namelist[i] for i in range(f.nvars)])
  *     print '%15s : %d' % ('nattrs', f.nattrs)
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('current_step', f.current_step)
  *     print '%15s : %d' % ('last_step', f.last_step)
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = __pyx_v_f->nattrs;
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
-    __pyx_t_2 = __Pyx_PyBytes_FromString((__pyx_v_f->attr_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyBytes_FromString((__pyx_v_f->attr_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_attr_namelist);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_attr_namelist);
@@ -5213,22 +7208,22 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":406
+  /* "adios_mpi.pyx":505
  *     print '%15s : %d' % ('nattrs', f.nattrs)
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])
  *     print '%15s : %d' % ('current_step', f.current_step)             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('last_step', f.last_step)
  *     print '%15s : %s' % ('path', f.path)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->current_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->current_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_current_step);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_current_step);
@@ -5236,22 +7231,22 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":407
+  /* "adios_mpi.pyx":506
  *     print '%15s : %s' % ('attr_namelist', [f.attr_namelist[i] for i in range(f.nattrs)])
  *     print '%15s : %d' % ('current_step', f.current_step)
  *     print '%15s : %d' % ('last_step', f.last_step)             # <<<<<<<<<<<<<<
  *     print '%15s : %s' % ('path', f.path)
  *     print '%15s : %d' % ('endianness', f.endianness)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_last_step);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_last_step);
@@ -5259,22 +7254,22 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":408
+  /* "adios_mpi.pyx":507
  *     print '%15s : %d' % ('current_step', f.current_step)
  *     print '%15s : %d' % ('last_step', f.last_step)
  *     print '%15s : %s' % ('path', f.path)             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('endianness', f.endianness)
  *     print '%15s : %d' % ('version', f.version)
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_f->path); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_f->path); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_path);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_path);
@@ -5282,22 +7277,22 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":409
+  /* "adios_mpi.pyx":508
  *     print '%15s : %d' % ('last_step', f.last_step)
  *     print '%15s : %s' % ('path', f.path)
  *     print '%15s : %d' % ('endianness', f.endianness)             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('version', f.version)
  *     print '%15s : %lu' % ('file_size', f.file_size)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->endianness); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->endianness); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_endianness);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_endianness);
@@ -5305,22 +7300,22 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":410
+  /* "adios_mpi.pyx":509
  *     print '%15s : %s' % ('path', f.path)
  *     print '%15s : %d' % ('endianness', f.endianness)
  *     print '%15s : %d' % ('version', f.version)             # <<<<<<<<<<<<<<
  *     print '%15s : %lu' % ('file_size', f.file_size)
  * 
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_version);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_version);
@@ -5328,22 +7323,22 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":411
+  /* "adios_mpi.pyx":510
  *     print '%15s : %d' % ('endianness', f.endianness)
  *     print '%15s : %d' % ('version', f.version)
  *     print '%15s : %lu' % ('file_size', f.file_size)             # <<<<<<<<<<<<<<
  * 
  * cdef printvar(ADIOS_VARINFO * v):
  */
-  __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_f->file_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_f->file_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_file_size);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_file_size);
@@ -5351,13 +7346,13 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":400
+  /* "adios_mpi.pyx":499
  *     return ntype
  * 
  * cdef printfile(ADIOS_FILE * f):             # <<<<<<<<<<<<<<
@@ -5379,12 +7374,12 @@ static PyObject *__pyx_f_9adios_mpi_printfile(ADIOS_FILE *__pyx_v_f) {
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":413
+/* "adios_mpi.pyx":512
  *     print '%15s : %lu' % ('file_size', f.file_size)
  * 
  * cdef printvar(ADIOS_VARINFO * v):             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('varid', v.varid)
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  */
 
 static PyObject *__pyx_f_9adios_mpi_printvar(ADIOS_VARINFO *__pyx_v_v) {
@@ -5400,16 +7395,16 @@ static PyObject *__pyx_f_9adios_mpi_printvar(ADIOS_VARINFO *__pyx_v_v) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("printvar", 0);
 
-  /* "adios_mpi.pyx":414
+  /* "adios_mpi.pyx":513
  * 
  * cdef printvar(ADIOS_VARINFO * v):
  *     print '%15s : %d' % ('varid', v.varid)             # <<<<<<<<<<<<<<
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  *     print '%15s : %d' % ('ndim', v.ndim)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_varid);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_varid);
@@ -5417,22 +7412,22 @@ static PyObject *__pyx_f_9adios_mpi_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":415
+  /* "adios_mpi.pyx":514
  * cdef printvar(ADIOS_VARINFO * v):
  *     print '%15s : %d' % ('varid', v.varid)
- *     print '%15s : %s' % ('type', adios2nptype(v.type))             # <<<<<<<<<<<<<<
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('ndim', v.ndim)
  *     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])
  */
-  __pyx_t_1 = ((PyObject *)__pyx_f_9adios_mpi_adios2nptype(__pyx_v_v->type)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)__pyx_f_9adios_mpi_adios2npdtype(__pyx_v_v->type, 0, NULL)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_type);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_type);
@@ -5440,22 +7435,22 @@ static PyObject *__pyx_f_9adios_mpi_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":416
+  /* "adios_mpi.pyx":515
  *     print '%15s : %d' % ('varid', v.varid)
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  *     print '%15s : %d' % ('ndim', v.ndim)             # <<<<<<<<<<<<<<
  *     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])
  *     print '%15s : %d' % ('nsteps', v.nsteps)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_ndim);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_ndim);
@@ -5463,30 +7458,30 @@ static PyObject *__pyx_f_9adios_mpi_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":417
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+  /* "adios_mpi.pyx":516
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  *     print '%15s : %d' % ('ndim', v.ndim)
  *     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('nsteps', v.nsteps)
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = __pyx_v_v->ndim;
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
-    __pyx_t_2 = __Pyx_PyInt_From_uint64_t((__pyx_v_v->dims[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyInt_From_uint64_t((__pyx_v_v->dims[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_dims);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_dims);
@@ -5494,22 +7489,22 @@ static PyObject *__pyx_f_9adios_mpi_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":418
+  /* "adios_mpi.pyx":517
  *     print '%15s : %d' % ('ndim', v.ndim)
  *     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])
  *     print '%15s : %d' % ('nsteps', v.nsteps)             # <<<<<<<<<<<<<<
  * 
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):
  */
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_v->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_nsteps);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_nsteps);
@@ -5517,18 +7512,18 @@ static PyObject *__pyx_f_9adios_mpi_printvar(ADIOS_VARINFO *__pyx_v_v) {
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_d, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":413
+  /* "adios_mpi.pyx":512
  *     print '%15s : %lu' % ('file_size', f.file_size)
  * 
  * cdef printvar(ADIOS_VARINFO * v):             # <<<<<<<<<<<<<<
  *     print '%15s : %d' % ('varid', v.varid)
- *     print '%15s : %s' % ('type', adios2nptype(v.type))
+ *     print '%15s : %s' % ('type', adios2npdtype(v.type))
  */
 
   /* function exit code */
@@ -5545,167 +7540,205 @@ static PyObject *__pyx_f_9adios_mpi_printvar(ADIOS_VARINFO *__pyx_v_v) {
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":420
+/* "adios_mpi.pyx":519
  *     print '%15s : %d' % ('nsteps', v.nsteps)
  * 
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):             # <<<<<<<<<<<<<<
  *     if (name == "BP"):
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  */
 
 static ADIOS_READ_METHOD __pyx_f_9adios_mpi_str2adiosreadmethod(PyObject *__pyx_v_name) {
-  ADIOS_READ_METHOD __pyx_v_method;
+  PyObject *__pyx_v_method = NULL;
   ADIOS_READ_METHOD __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  ADIOS_READ_METHOD __pyx_t_5;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("str2adiosreadmethod", 0);
 
-  /* "adios_mpi.pyx":421
+  /* "adios_mpi.pyx":520
  * 
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):
  *     if (name == "BP"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  *     elif (name == "BP_AGGREGATE"):
  */
-  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_BP, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_BP, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (__pyx_t_1 != 0);
   if (__pyx_t_2) {
 
-    /* "adios_mpi.pyx":422
+    /* "adios_mpi.pyx":521
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):
  *     if (name == "BP"):
- *         method = ADIOS_READ_METHOD_BP             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.BP             # <<<<<<<<<<<<<<
  *     elif (name == "BP_AGGREGATE"):
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE
+ *         method = READ_METHOD.BP_AGGREGATE
  */
-    __pyx_v_method = ADIOS_READ_METHOD_BP;
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_BP); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_v_method = __pyx_t_4;
+    __pyx_t_4 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":423
+  /* "adios_mpi.pyx":522
  *     if (name == "BP"):
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  *     elif (name == "BP_AGGREGATE"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE
+ *         method = READ_METHOD.BP_AGGREGATE
  *     elif (name == "DATASPACES"):
  */
-  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_BP_AGGREGATE, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_BP_AGGREGATE, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = (__pyx_t_2 != 0);
   if (__pyx_t_1) {
 
-    /* "adios_mpi.pyx":424
- *         method = ADIOS_READ_METHOD_BP
+    /* "adios_mpi.pyx":523
+ *         method = READ_METHOD.BP
  *     elif (name == "BP_AGGREGATE"):
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.BP_AGGREGATE             # <<<<<<<<<<<<<<
  *     elif (name == "DATASPACES"):
- *         method = ADIOS_READ_METHOD_DATASPACES
+ *         method = READ_METHOD.DATASPACES
  */
-    __pyx_v_method = ADIOS_READ_METHOD_BP_AGGREGATE;
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_BP_AGGREGATE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_v_method = __pyx_t_3;
+    __pyx_t_3 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":425
+  /* "adios_mpi.pyx":524
  *     elif (name == "BP_AGGREGATE"):
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE
+ *         method = READ_METHOD.BP_AGGREGATE
  *     elif (name == "DATASPACES"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_DATASPACES
+ *         method = READ_METHOD.DATASPACES
  *     elif (name == "DIMES"):
  */
-  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_DATASPACES, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_DATASPACES, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (__pyx_t_1 != 0);
   if (__pyx_t_2) {
 
-    /* "adios_mpi.pyx":426
- *         method = ADIOS_READ_METHOD_BP_AGGREGATE
+    /* "adios_mpi.pyx":525
+ *         method = READ_METHOD.BP_AGGREGATE
  *     elif (name == "DATASPACES"):
- *         method = ADIOS_READ_METHOD_DATASPACES             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.DATASPACES             # <<<<<<<<<<<<<<
  *     elif (name == "DIMES"):
- *         method = ADIOS_READ_METHOD_DIMES
+ *         method = READ_METHOD.DIMES
  */
-    __pyx_v_method = ADIOS_READ_METHOD_DATASPACES;
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_DATASPACES); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_v_method = __pyx_t_4;
+    __pyx_t_4 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":427
+  /* "adios_mpi.pyx":526
  *     elif (name == "DATASPACES"):
- *         method = ADIOS_READ_METHOD_DATASPACES
+ *         method = READ_METHOD.DATASPACES
  *     elif (name == "DIMES"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_DIMES
+ *         method = READ_METHOD.DIMES
  *     elif (name == "FLEXPATH"):
  */
-  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_DIMES, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_DIMES, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = (__pyx_t_2 != 0);
   if (__pyx_t_1) {
 
-    /* "adios_mpi.pyx":428
- *         method = ADIOS_READ_METHOD_DATASPACES
+    /* "adios_mpi.pyx":527
+ *         method = READ_METHOD.DATASPACES
  *     elif (name == "DIMES"):
- *         method = ADIOS_READ_METHOD_DIMES             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.DIMES             # <<<<<<<<<<<<<<
  *     elif (name == "FLEXPATH"):
- *         method = ADIOS_READ_METHOD_FLEXPATH
+ *         method = READ_METHOD.FLEXPATH
  */
-    __pyx_v_method = ADIOS_READ_METHOD_DIMES;
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_DIMES); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_v_method = __pyx_t_3;
+    __pyx_t_3 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":429
+  /* "adios_mpi.pyx":528
  *     elif (name == "DIMES"):
- *         method = ADIOS_READ_METHOD_DIMES
+ *         method = READ_METHOD.DIMES
  *     elif (name == "FLEXPATH"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_FLEXPATH
+ *         method = READ_METHOD.FLEXPATH
  *     elif (name == "ICEE"):
  */
-  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_FLEXPATH, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_FLEXPATH, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (__pyx_t_1 != 0);
   if (__pyx_t_2) {
 
-    /* "adios_mpi.pyx":430
- *         method = ADIOS_READ_METHOD_DIMES
+    /* "adios_mpi.pyx":529
+ *         method = READ_METHOD.DIMES
  *     elif (name == "FLEXPATH"):
- *         method = ADIOS_READ_METHOD_FLEXPATH             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.FLEXPATH             # <<<<<<<<<<<<<<
  *     elif (name == "ICEE"):
- *         method = ADIOS_READ_METHOD_ICEE
+ *         method = READ_METHOD.ICEE
  */
-    __pyx_v_method = ADIOS_READ_METHOD_FLEXPATH;
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_FLEXPATH); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_v_method = __pyx_t_4;
+    __pyx_t_4 = 0;
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":431
+  /* "adios_mpi.pyx":530
  *     elif (name == "FLEXPATH"):
- *         method = ADIOS_READ_METHOD_FLEXPATH
+ *         method = READ_METHOD.FLEXPATH
  *     elif (name == "ICEE"):             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_ICEE
+ *         method = READ_METHOD.ICEE
  *     else:
  */
-  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_ICEE, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__Pyx_PyBytes_Equals(__pyx_v_name, __pyx_n_s_ICEE, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = (__pyx_t_2 != 0);
   if (__pyx_t_1) {
 
-    /* "adios_mpi.pyx":432
- *         method = ADIOS_READ_METHOD_FLEXPATH
+    /* "adios_mpi.pyx":531
+ *         method = READ_METHOD.FLEXPATH
  *     elif (name == "ICEE"):
- *         method = ADIOS_READ_METHOD_ICEE             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.ICEE             # <<<<<<<<<<<<<<
  *     else:
  *         print '[WARN] Invalid read method name:', name, '. Use default BP method'
  */
-    __pyx_v_method = ADIOS_READ_METHOD_ICEE;
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_ICEE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_v_method = __pyx_t_3;
+    __pyx_t_3 = 0;
     goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "adios_mpi.pyx":434
- *         method = ADIOS_READ_METHOD_ICEE
+    /* "adios_mpi.pyx":533
+ *         method = READ_METHOD.ICEE
  *     else:
  *         print '[WARN] Invalid read method name:', name, '. Use default BP method'             # <<<<<<<<<<<<<<
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  * 
  */
-    __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_kp_s_WARN_Invalid_read_method_name);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_s_WARN_Invalid_read_method_name);
@@ -5716,57 +7749,66 @@ static ADIOS_READ_METHOD __pyx_f_9adios_mpi_str2adiosreadmethod(PyObject *__pyx_
     __Pyx_INCREF(__pyx_kp_s_Use_default_BP_method);
     PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_s_Use_default_BP_method);
     __Pyx_GIVEREF(__pyx_kp_s_Use_default_BP_method);
-    if (__Pyx_Print(0, __pyx_t_3, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_Print(0, __pyx_t_3, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "adios_mpi.pyx":435
+    /* "adios_mpi.pyx":534
  *     else:
  *         print '[WARN] Invalid read method name:', name, '. Use default BP method'
- *         method = ADIOS_READ_METHOD_BP             # <<<<<<<<<<<<<<
+ *         method = READ_METHOD.BP             # <<<<<<<<<<<<<<
  * 
  *     return method
  */
-    __pyx_v_method = ADIOS_READ_METHOD_BP;
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_READ_METHOD); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_BP); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_v_method = __pyx_t_4;
+    __pyx_t_4 = 0;
   }
   __pyx_L3:;
 
-  /* "adios_mpi.pyx":437
- *         method = ADIOS_READ_METHOD_BP
+  /* "adios_mpi.pyx":536
+ *         method = READ_METHOD.BP
  * 
  *     return method             # <<<<<<<<<<<<<<
  * 
- * cpdef np2adiostype(type nptype):
+ * cpdef np2adiostype(np.dtype nptype):
  */
-  __pyx_r = __pyx_v_method;
+  __pyx_t_5 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_t_5;
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":420
+  /* "adios_mpi.pyx":519
  *     print '%15s : %d' % ('nsteps', v.nsteps)
  * 
  * cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):             # <<<<<<<<<<<<<<
  *     if (name == "BP"):
- *         method = ADIOS_READ_METHOD_BP
+ *         method = READ_METHOD.BP
  */
 
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("adios_mpi.str2adiosreadmethod", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_method);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":439
+/* "adios_mpi.pyx":538
  *     return method
  * 
- * cpdef np2adiostype(type nptype):             # <<<<<<<<<<<<<<
- *     """ Ignored: int_, intc, intp """
- * 
+ * cpdef np2adiostype(np.dtype nptype):             # <<<<<<<<<<<<<<
+ *     """ Convert Numpy.dtype to Adios Datatype
+ *     """
  */
 
-static PyObject *__pyx_pw_9adios_mpi_33np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype); /*proto*/
-static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHON_UNUSED int __pyx_skip_dispatch) {
+static PyObject *__pyx_pw_9adios_mpi_41np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyArray_Descr *__pyx_v_nptype, CYTHON_UNUSED int __pyx_skip_dispatch) {
   PyObject *__pyx_v_atype = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -5778,49 +7820,49 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("np2adiostype", 0);
 
-  /* "adios_mpi.pyx":442
- *     """ Ignored: int_, intc, intp """
+  /* "adios_mpi.pyx":542
+ *     """
  * 
  *     cdef atype = DATATYPE.unknown             # <<<<<<<<<<<<<<
  * 
  *     if (nptype == np.bool_):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unknown); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unknown); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_atype = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":444
+  /* "adios_mpi.pyx":544
  *     cdef atype = DATATYPE.unknown
  * 
  *     if (nptype == np.bool_):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int8):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_bool); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_bool); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":445
+    /* "adios_mpi.pyx":545
  * 
  *     if (nptype == np.bool_):
  *         atype = DATATYPE.integer             # <<<<<<<<<<<<<<
  *     elif (nptype == np.int8):
  *         atype = DATATYPE.byte
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_integer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_integer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5828,34 +7870,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":446
+  /* "adios_mpi.pyx":546
  *     if (nptype == np.bool_):
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int8):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.byte
  *     elif (nptype == np.int16):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":447
+    /* "adios_mpi.pyx":547
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int8):
  *         atype = DATATYPE.byte             # <<<<<<<<<<<<<<
  *     elif (nptype == np.int16):
  *         atype = DATATYPE.short
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_byte); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_byte); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -5863,34 +7905,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":448
+  /* "adios_mpi.pyx":548
  *     elif (nptype == np.int8):
  *         atype = DATATYPE.byte
  *     elif (nptype == np.int16):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.short
  *     elif (nptype == np.int32):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":449
+    /* "adios_mpi.pyx":549
  *         atype = DATATYPE.byte
  *     elif (nptype == np.int16):
  *         atype = DATATYPE.short             # <<<<<<<<<<<<<<
  *     elif (nptype == np.int32):
  *         atype = DATATYPE.integer
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_short); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_short); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5898,34 +7940,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":450
+  /* "adios_mpi.pyx":550
  *     elif (nptype == np.int16):
  *         atype = DATATYPE.short
  *     elif (nptype == np.int32):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int64):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":451
+    /* "adios_mpi.pyx":551
  *         atype = DATATYPE.short
  *     elif (nptype == np.int32):
  *         atype = DATATYPE.integer             # <<<<<<<<<<<<<<
  *     elif (nptype == np.int64):
  *         atype = DATATYPE.long
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_integer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_integer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -5933,34 +7975,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":452
+  /* "adios_mpi.pyx":552
  *     elif (nptype == np.int32):
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int64):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.long
  *     elif (nptype == np.uint8):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":453
+    /* "adios_mpi.pyx":553
  *         atype = DATATYPE.integer
  *     elif (nptype == np.int64):
  *         atype = DATATYPE.long             # <<<<<<<<<<<<<<
  *     elif (nptype == np.uint8):
  *         atype = DATATYPE.unsigned_byte
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_long); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_long); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -5968,34 +8010,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":454
+  /* "adios_mpi.pyx":554
  *     elif (nptype == np.int64):
  *         atype = DATATYPE.long
  *     elif (nptype == np.uint8):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.unsigned_byte
  *     elif (nptype == np.uint16):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":455
+    /* "adios_mpi.pyx":555
  *         atype = DATATYPE.long
  *     elif (nptype == np.uint8):
  *         atype = DATATYPE.unsigned_byte             # <<<<<<<<<<<<<<
  *     elif (nptype == np.uint16):
  *         atype = DATATYPE.unsigned_short
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unsigned_byte); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unsigned_byte); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -6003,34 +8045,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":456
+  /* "adios_mpi.pyx":556
  *     elif (nptype == np.uint8):
  *         atype = DATATYPE.unsigned_byte
  *     elif (nptype == np.uint16):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.unsigned_short
  *     elif (nptype == np.uint32):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":457
+    /* "adios_mpi.pyx":557
  *         atype = DATATYPE.unsigned_byte
  *     elif (nptype == np.uint16):
  *         atype = DATATYPE.unsigned_short             # <<<<<<<<<<<<<<
  *     elif (nptype == np.uint32):
  *         atype = DATATYPE.unsigned_integer
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_unsigned_short); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_unsigned_short); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -6038,34 +8080,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":458
+  /* "adios_mpi.pyx":558
  *     elif (nptype == np.uint16):
  *         atype = DATATYPE.unsigned_short
  *     elif (nptype == np.uint32):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.unsigned_integer
  *     elif (nptype == np.uint64):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":459
+    /* "adios_mpi.pyx":559
  *         atype = DATATYPE.unsigned_short
  *     elif (nptype == np.uint32):
  *         atype = DATATYPE.unsigned_integer             # <<<<<<<<<<<<<<
  *     elif (nptype == np.uint64):
  *         atype = DATATYPE.unsigned_long
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unsigned_integer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unsigned_integer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -6073,34 +8115,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":460
+  /* "adios_mpi.pyx":560
  *     elif (nptype == np.uint32):
  *         atype = DATATYPE.unsigned_integer
  *     elif (nptype == np.uint64):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.unsigned_long
  *     elif (nptype == np.float_):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uint64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":461
+    /* "adios_mpi.pyx":561
  *         atype = DATATYPE.unsigned_integer
  *     elif (nptype == np.uint64):
  *         atype = DATATYPE.unsigned_long             # <<<<<<<<<<<<<<
  *     elif (nptype == np.float_):
  *         atype = DATATYPE.double
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_unsigned_long); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_unsigned_long); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -6108,34 +8150,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":462
+  /* "adios_mpi.pyx":562
  *     elif (nptype == np.uint64):
  *         atype = DATATYPE.unsigned_long
  *     elif (nptype == np.float_):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.double
  *     elif (nptype == np.float16):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":463
+    /* "adios_mpi.pyx":563
  *         atype = DATATYPE.unsigned_long
  *     elif (nptype == np.float_):
  *         atype = DATATYPE.double             # <<<<<<<<<<<<<<
  *     elif (nptype == np.float16):
  *         atype = DATATYPE.real
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -6143,34 +8185,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":464
+  /* "adios_mpi.pyx":564
  *     elif (nptype == np.float_):
  *         atype = DATATYPE.double
  *     elif (nptype == np.float16):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.real
  *     elif (nptype == np.float32):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":465
+    /* "adios_mpi.pyx":565
  *         atype = DATATYPE.double
  *     elif (nptype == np.float16):
  *         atype = DATATYPE.real             # <<<<<<<<<<<<<<
  *     elif (nptype == np.float32):
  *         atype = DATATYPE.real
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_real); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_real); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -6178,34 +8220,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":466
+  /* "adios_mpi.pyx":566
  *     elif (nptype == np.float16):
  *         atype = DATATYPE.real
  *     elif (nptype == np.float32):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.real
  *     elif (nptype == np.float64):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":467
+    /* "adios_mpi.pyx":567
  *         atype = DATATYPE.real
  *     elif (nptype == np.float32):
  *         atype = DATATYPE.real             # <<<<<<<<<<<<<<
  *     elif (nptype == np.float64):
  *         atype = DATATYPE.double
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_real); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_real); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -6213,34 +8255,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":468
+  /* "adios_mpi.pyx":568
  *     elif (nptype == np.float32):
  *         atype = DATATYPE.real
  *     elif (nptype == np.float64):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.double
  *     elif (nptype == np.complex_):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":469
+    /* "adios_mpi.pyx":569
  *         atype = DATATYPE.real
  *     elif (nptype == np.float64):
  *         atype = DATATYPE.double             # <<<<<<<<<<<<<<
  *     elif (nptype == np.complex_):
  *         atype = DATATYPE.double_complex
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -6248,34 +8290,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":470
+  /* "adios_mpi.pyx":570
  *     elif (nptype == np.float64):
  *         atype = DATATYPE.double
  *     elif (nptype == np.complex_):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.double_complex
  *     elif (nptype == np.complex64):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":471
+    /* "adios_mpi.pyx":571
  *         atype = DATATYPE.double
  *     elif (nptype == np.complex_):
  *         atype = DATATYPE.double_complex             # <<<<<<<<<<<<<<
  *     elif (nptype == np.complex64):
  *         atype = DATATYPE.complex
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -6283,34 +8325,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":472
+  /* "adios_mpi.pyx":572
  *     elif (nptype == np.complex_):
  *         atype = DATATYPE.double_complex
  *     elif (nptype == np.complex64):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.complex
  *     elif (nptype == np.complex128):
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex64); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":473
+    /* "adios_mpi.pyx":573
  *         atype = DATATYPE.double_complex
  *     elif (nptype == np.complex64):
  *         atype = DATATYPE.complex             # <<<<<<<<<<<<<<
  *     elif (nptype == np.complex128):
  *         atype = DATATYPE.double_complex
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_complex_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
@@ -6318,34 +8360,34 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":474
+  /* "adios_mpi.pyx":574
  *     elif (nptype == np.complex64):
  *         atype = DATATYPE.complex
  *     elif (nptype == np.complex128):             # <<<<<<<<<<<<<<
  *         atype = DATATYPE.double_complex
- *     elif (nptype == np.str_):
+ *     elif (nptype.char == 'S'):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_complex128); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":475
+    /* "adios_mpi.pyx":575
  *         atype = DATATYPE.complex
  *     elif (nptype == np.complex128):
  *         atype = DATATYPE.double_complex             # <<<<<<<<<<<<<<
- *     elif (nptype == np.str_):
- *         atype = DATATYPE.byte
+ *     elif (nptype.char == 'S'):
+ *         atype = DATATYPE.string
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double_complex); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
@@ -6353,60 +8395,72 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
     goto __pyx_L3;
   }
 
-  /* "adios_mpi.pyx":476
+  /* "adios_mpi.pyx":576
  *     elif (nptype == np.complex128):
  *         atype = DATATYPE.double_complex
- *     elif (nptype == np.str_):             # <<<<<<<<<<<<<<
- *         atype = DATATYPE.byte
- * 
+ *     elif (nptype.char == 'S'):             # <<<<<<<<<<<<<<
+ *         atype = DATATYPE.string
+ *     else:
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_nptype), __pyx_n_s_char); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_str); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_RichCompare(((PyObject *)__pyx_v_nptype), __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_t_2, __pyx_n_s_S, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (__pyx_t_3) {
 
-    /* "adios_mpi.pyx":477
+    /* "adios_mpi.pyx":577
  *         atype = DATATYPE.double_complex
- *     elif (nptype == np.str_):
- *         atype = DATATYPE.byte             # <<<<<<<<<<<<<<
- * 
- *     return atype
+ *     elif (nptype.char == 'S'):
+ *         atype = DATATYPE.string             # <<<<<<<<<<<<<<
+ *     else:
+ *         atype = DATATYPE.unknown
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_byte); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_string); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_1);
     __pyx_t_1 = 0;
     goto __pyx_L3;
   }
+  /*else*/ {
+
+    /* "adios_mpi.pyx":579
+ *         atype = DATATYPE.string
+ *     else:
+ *         atype = DATATYPE.unknown             # <<<<<<<<<<<<<<
+ * 
+ *     return atype
+ */
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_unknown); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_atype, __pyx_t_2);
+    __pyx_t_2 = 0;
+  }
   __pyx_L3:;
 
-  /* "adios_mpi.pyx":479
- *         atype = DATATYPE.byte
+  /* "adios_mpi.pyx":581
+ *         atype = DATATYPE.unknown
  * 
  *     return atype             # <<<<<<<<<<<<<<
  * 
- * ## ====================
+ * cpdef str adiostype2string (ADIOS_DATATYPES type):
  */
   __Pyx_XDECREF(__pyx_r);
   __Pyx_INCREF(__pyx_v_atype);
   __pyx_r = __pyx_v_atype;
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":439
+  /* "adios_mpi.pyx":538
  *     return method
  * 
- * cpdef np2adiostype(type nptype):             # <<<<<<<<<<<<<<
- *     """ Ignored: int_, intc, intp """
- * 
+ * cpdef np2adiostype(np.dtype nptype):             # <<<<<<<<<<<<<<
+ *     """ Convert Numpy.dtype to Adios Datatype
+ *     """
  */
 
   /* function exit code */
@@ -6423,17 +8477,17 @@ static PyObject *__pyx_f_9adios_mpi_np2adiostype(PyObject *__pyx_v_nptype, CYTHO
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_33np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype); /*proto*/
-static char __pyx_doc_9adios_mpi_32np2adiostype[] = " Ignored: int_, intc, intp ";
-static PyObject *__pyx_pw_9adios_mpi_33np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype) {
+static PyObject *__pyx_pw_9adios_mpi_41np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype); /*proto*/
+static char __pyx_doc_9adios_mpi_40np2adiostype[] = "np2adiostype(dtype nptype)\n Convert Numpy.dtype to Adios Datatype\n    ";
+static PyObject *__pyx_pw_9adios_mpi_41np2adiostype(PyObject *__pyx_self, PyObject *__pyx_v_nptype) {
   CYTHON_UNUSED int __pyx_lineno = 0;
   CYTHON_UNUSED const char *__pyx_filename = NULL;
   CYTHON_UNUSED int __pyx_clineno = 0;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("np2adiostype (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_nptype), (&PyType_Type), 1, "nptype", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_9adios_mpi_32np2adiostype(__pyx_self, ((PyObject*)__pyx_v_nptype));
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_nptype), __pyx_ptype_5numpy_dtype, 1, "nptype", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_40np2adiostype(__pyx_self, ((PyArray_Descr *)__pyx_v_nptype));
 
   /* function exit code */
   goto __pyx_L0;
@@ -6444,7 +8498,7 @@ static PyObject *__pyx_pw_9adios_mpi_33np2adiostype(PyObject *__pyx_self, PyObje
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_32np2adiostype(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_nptype) {
+static PyObject *__pyx_pf_9adios_mpi_40np2adiostype(CYTHON_UNUSED PyObject *__pyx_self, PyArray_Descr *__pyx_v_nptype) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -6453,7 +8507,7 @@ static PyObject *__pyx_pf_9adios_mpi_32np2adiostype(CYTHON_UNUSED PyObject *__py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("np2adiostype", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_9adios_mpi_np2adiostype(__pyx_v_nptype, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_9adios_mpi_np2adiostype(__pyx_v_nptype, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -6470,68 +8524,183 @@ static PyObject *__pyx_pf_9adios_mpi_32np2adiostype(CYTHON_UNUSED PyObject *__py
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":486
+/* "adios_mpi.pyx":583
+ *     return atype
+ * 
+ * cpdef str adiostype2string (ADIOS_DATATYPES type):             # <<<<<<<<<<<<<<
+ *     return str(adios_type_to_string(<ADIOS_DATATYPES> type))
  * 
- * """ Call adios_read_init_method """
- * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
- *                     MPI.Comm comm = MPI.COMM_WORLD,
- *                     char * parameters = ""):
  */
 
-static PyObject *__pyx_pw_9adios_mpi_35read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_f_9adios_mpi_read_init(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_read_init *__pyx_optional_args) {
-  char *__pyx_v_method_name = ((char *)__pyx_k_BP);
-  struct PyMPICommObject *__pyx_v_comm = __pyx_k__5;
-  char *__pyx_v_parameters = ((char *)__pyx_k__4);
-  PyObject *__pyx_v_method = 0;
-  int __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_43adiostype2string(PyObject *__pyx_self, PyObject *__pyx_arg_type); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_adiostype2string(ADIOS_DATATYPES __pyx_v_type, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
-  ADIOS_READ_METHOD __pyx_t_3;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_init", 0);
-  if (__pyx_optional_args) {
-    if (__pyx_optional_args->__pyx_n > 0) {
-      __pyx_v_method_name = __pyx_optional_args->method_name;
-      if (__pyx_optional_args->__pyx_n > 1) {
-        __pyx_v_comm = __pyx_optional_args->comm;
-        if (__pyx_optional_args->__pyx_n > 2) {
-          __pyx_v_parameters = __pyx_optional_args->parameters;
-        }
-      }
-    }
-  }
+  __Pyx_RefNannySetupContext("adiostype2string", 0);
 
-  /* "adios_mpi.pyx":489
- *                     MPI.Comm comm = MPI.COMM_WORLD,
- *                     char * parameters = ""):
- *     cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
- *     return adios_read_init_method (method, comm.ob_mpi, parameters)
+  /* "adios_mpi.pyx":584
  * 
+ * cpdef str adiostype2string (ADIOS_DATATYPES type):
+ *     return str(adios_type_to_string(<ADIOS_DATATYPES> type))             # <<<<<<<<<<<<<<
+ * 
+ * ## ====================
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBytes_FromString(adios_type_to_string(((ADIOS_DATATYPES)__pyx_v_type))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_9adios_mpi_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_method = __pyx_t_2;
-  __pyx_t_2 = 0;
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios_mpi.pyx":490
- *                     char * parameters = ""):
- *     cdef method = str2adiosreadmethod(method_name)
+  /* "adios_mpi.pyx":583
+ *     return atype
+ * 
+ * cpdef str adiostype2string (ADIOS_DATATYPES type):             # <<<<<<<<<<<<<<
+ *     return str(adios_type_to_string(<ADIOS_DATATYPES> type))
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("adios_mpi.adiostype2string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_43adiostype2string(PyObject *__pyx_self, PyObject *__pyx_arg_type); /*proto*/
+static char __pyx_doc_9adios_mpi_42adiostype2string[] = "adiostype2string(ADIOS_DATATYPES type) -> str";
+static PyObject *__pyx_pw_9adios_mpi_43adiostype2string(PyObject *__pyx_self, PyObject *__pyx_arg_type) {
+  ADIOS_DATATYPES __pyx_v_type;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("adiostype2string (wrapper)", 0);
+  assert(__pyx_arg_type); {
+    __pyx_v_type = ((ADIOS_DATATYPES)PyInt_AsLong(__pyx_arg_type)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.adiostype2string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_42adiostype2string(__pyx_self, ((ADIOS_DATATYPES)__pyx_v_type));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_42adiostype2string(CYTHON_UNUSED PyObject *__pyx_self, ADIOS_DATATYPES __pyx_v_type) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("adiostype2string", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_9adios_mpi_adiostype2string(__pyx_v_type, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.adiostype2string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":591
+ * 
+ * """ Call adios_read_init_method """
+ * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
+ *                     MPI.Comm comm = MPI.COMM_WORLD,
+ *                     char * parameters = ""):
+ */
+
+static PyObject *__pyx_pw_9adios_mpi_45read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_9adios_mpi_read_init(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_read_init *__pyx_optional_args) {
+  char *__pyx_v_method_name = ((char *)__pyx_k_BP);
+  struct PyMPICommObject *__pyx_v_comm = __pyx_k__8;
+  char *__pyx_v_parameters = ((char *)__pyx_k__7);
+  PyObject *__pyx_v_method = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  ADIOS_READ_METHOD __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_init", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_method_name = __pyx_optional_args->method_name;
+      if (__pyx_optional_args->__pyx_n > 1) {
+        __pyx_v_comm = __pyx_optional_args->comm;
+        if (__pyx_optional_args->__pyx_n > 2) {
+          __pyx_v_parameters = __pyx_optional_args->parameters;
+        }
+      }
+    }
+  }
+
+  /* "adios_mpi.pyx":594
+ *                     MPI.Comm comm = MPI.COMM_WORLD,
+ *                     char * parameters = ""):
+ *     cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
+ *     return adios_read_init_method (method, comm.ob_mpi, parameters)
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_9adios_mpi_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_method = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":595
+ *                     char * parameters = ""):
+ *     cdef method = str2adiosreadmethod(method_name)
  *     return adios_read_init_method (method, comm.ob_mpi, parameters)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_3 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = adios_read_init_method(__pyx_t_3, __pyx_v_comm->ob_mpi, __pyx_v_parameters);
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":486
+  /* "adios_mpi.pyx":591
  * 
  * """ Call adios_read_init_method """
  * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
@@ -6552,8 +8721,9 @@ static int __pyx_f_9adios_mpi_read_init(CYTHON_UNUSED int __pyx_skip_dispatch, s
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_35read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_35read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_45read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_44read_init[] = "read_init(char *method_name='BP', Comm comm=MPI.COMM_WORLD, char *parameters='') -> int";
+static PyObject *__pyx_pw_9adios_mpi_45read_init(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_method_name;
   struct PyMPICommObject *__pyx_v_comm = 0;
   char *__pyx_v_parameters;
@@ -6566,7 +8736,7 @@ static PyObject *__pyx_pw_9adios_mpi_35read_init(PyObject *__pyx_self, PyObject
   {
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method_name,&__pyx_n_s_comm,&__pyx_n_s_parameters,0};
     PyObject* values[3] = {0,0,0};
-    values[1] = (PyObject *)__pyx_k__5;
+    values[1] = (PyObject *)__pyx_k__8;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -6596,7 +8766,7 @@ static PyObject *__pyx_pw_9adios_mpi_35read_init(PyObject *__pyx_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_init") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_init") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -6608,27 +8778,27 @@ static PyObject *__pyx_pw_9adios_mpi_35read_init(PyObject *__pyx_self, PyObject
       }
     }
     if (values[0]) {
-      __pyx_v_method_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_method_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_method_name = ((char *)__pyx_k_BP);
     }
     __pyx_v_comm = ((struct PyMPICommObject *)values[1]);
     if (values[2]) {
-      __pyx_v_parameters = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_parameters) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_parameters = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_parameters) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_parameters = ((char *)__pyx_k__4);
+      __pyx_v_parameters = ((char *)__pyx_k__7);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_init", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read_init", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.read_init", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_9adios_mpi_34read_init(__pyx_self, __pyx_v_method_name, __pyx_v_comm, __pyx_v_parameters);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_44read_init(__pyx_self, __pyx_v_method_name, __pyx_v_comm, __pyx_v_parameters);
 
   /* function exit code */
   goto __pyx_L0;
@@ -6639,7 +8809,7 @@ static PyObject *__pyx_pw_9adios_mpi_35read_init(PyObject *__pyx_self, PyObject
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_34read_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name, struct PyMPICommObject *__pyx_v_comm, char *__pyx_v_parameters) {
+static PyObject *__pyx_pf_9adios_mpi_44read_init(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name, struct PyMPICommObject *__pyx_v_comm, char *__pyx_v_parameters) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -6655,7 +8825,7 @@ static PyObject *__pyx_pf_9adios_mpi_34read_init(CYTHON_UNUSED PyObject *__pyx_s
   __pyx_t_2.comm = __pyx_v_comm;
   __pyx_t_2.parameters = __pyx_v_parameters;
   __pyx_t_1 = __pyx_f_9adios_mpi_read_init(0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -6672,7 +8842,7 @@ static PyObject *__pyx_pf_9adios_mpi_34read_init(CYTHON_UNUSED PyObject *__pyx_s
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":494
+/* "adios_mpi.pyx":599
  * 
  * """ Call adios_read_finalize_method """
  * cpdef int read_finalize(char * method_name = "BP"):             # <<<<<<<<<<<<<<
@@ -6680,7 +8850,7 @@ static PyObject *__pyx_pf_9adios_mpi_34read_init(CYTHON_UNUSED PyObject *__pyx_s
  *     return adios_read_finalize_method (method)
  */
 
-static PyObject *__pyx_pw_9adios_mpi_37read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_47read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_9adios_mpi_read_finalize(CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_read_finalize *__pyx_optional_args) {
   char *__pyx_v_method_name = ((char *)__pyx_k_BP);
   PyObject *__pyx_v_method = 0;
@@ -6699,33 +8869,33 @@ static int __pyx_f_9adios_mpi_read_finalize(CYTHON_UNUSED int __pyx_skip_dispatc
     }
   }
 
-  /* "adios_mpi.pyx":495
+  /* "adios_mpi.pyx":600
  * """ Call adios_read_finalize_method """
  * cpdef int read_finalize(char * method_name = "BP"):
  *     cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
  *     return adios_read_finalize_method (method)
  * 
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_9adios_mpi_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_9adios_mpi_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_method = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":496
+  /* "adios_mpi.pyx":601
  * cpdef int read_finalize(char * method_name = "BP"):
  *     cdef method = str2adiosreadmethod(method_name)
  *     return adios_read_finalize_method (method)             # <<<<<<<<<<<<<<
  * 
- * """ Python class for ADIOS_FILE structure """
+ * ## Python class for ADIOS_FILE structure
  */
-  __pyx_t_3 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = adios_read_finalize_method(__pyx_t_3);
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":494
+  /* "adios_mpi.pyx":599
  * 
  * """ Call adios_read_finalize_method """
  * cpdef int read_finalize(char * method_name = "BP"):             # <<<<<<<<<<<<<<
@@ -6746,8 +8916,9 @@ static int __pyx_f_9adios_mpi_read_finalize(CYTHON_UNUSED int __pyx_skip_dispatc
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_37read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_37read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_47read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_46read_finalize[] = "read_finalize(char *method_name='BP') -> int";
+static PyObject *__pyx_pw_9adios_mpi_47read_finalize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_method_name;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
@@ -6775,7 +8946,7 @@ static PyObject *__pyx_pw_9adios_mpi_37read_finalize(PyObject *__pyx_self, PyObj
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_finalize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_finalize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -6785,27 +8956,27 @@ static PyObject *__pyx_pw_9adios_mpi_37read_finalize(PyObject *__pyx_self, PyObj
       }
     }
     if (values[0]) {
-      __pyx_v_method_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_method_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_method_name = ((char *)__pyx_k_BP);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_finalize", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read_finalize", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.read_finalize", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_36read_finalize(__pyx_self, __pyx_v_method_name);
+  __pyx_r = __pyx_pf_9adios_mpi_46read_finalize(__pyx_self, __pyx_v_method_name);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_36read_finalize(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name) {
+static PyObject *__pyx_pf_9adios_mpi_46read_finalize(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_method_name) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -6819,7 +8990,7 @@ static PyObject *__pyx_pf_9adios_mpi_36read_finalize(CYTHON_UNUSED PyObject *__p
   __pyx_t_2.__pyx_n = 1;
   __pyx_t_2.method_name = __pyx_v_method_name;
   __pyx_t_1 = __pyx_f_9adios_mpi_read_finalize(0, &__pyx_t_2); 
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -6836,529 +9007,430 @@ static PyObject *__pyx_pf_9adios_mpi_36read_finalize(CYTHON_UNUSED PyObject *__p
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":519
+/* "adios_mpi.pyx":640
+ *     property name:
+ *         """ The filename (or stream name) associated with. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
- *     """ Initialization. Call adios_read_open and populate public members """
- *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
- *                  char * method_name = "BP",
- *                  MPI.Comm comm = MPI.COMM_WORLD,
  */
 
 /* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  char *__pyx_v_fname;
-  char *__pyx_v_method_name;
-  struct PyMPICommObject *__pyx_v_comm = 0;
-  PyObject *__pyx_v_is_stream = 0;
-  ADIOS_LOCKMODE __pyx_v_lock_mode;
-  float __pyx_v_timeout_sec;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  int __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_4file_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_4name_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_method_name,&__pyx_n_s_comm,&__pyx_n_s_is_stream,&__pyx_n_s_lock_mode,&__pyx_n_s_timeout_sec,0};
-    PyObject* values[6] = {0,0,0,0,0,0};
-    values[2] = (PyObject *)__pyx_k__6;
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_4name___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
-    /* "adios_mpi.pyx":522
- *                  char * method_name = "BP",
- *                  MPI.Comm comm = MPI.COMM_WORLD,
- *                  is_stream = False,             # <<<<<<<<<<<<<<
- *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
- *                  float timeout_sec = 0.0):
- */
-    values[3] = ((PyObject *)Py_False);
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
-        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
-        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
-        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method_name);
-          if (value) { values[1] = value; kw_args--; }
-        }
-        case  2:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
-          if (value) { values[2] = value; kw_args--; }
-        }
-        case  3:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_is_stream);
-          if (value) { values[3] = value; kw_args--; }
-        }
-        case  4:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lock_mode);
-          if (value) { values[4] = value; kw_args--; }
-        }
-        case  5:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_timeout_sec);
-          if (value) { values[5] = value; kw_args--; }
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else {
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
-        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
-        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
-        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-    }
-    __pyx_v_fname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_fname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    if (values[1]) {
-      __pyx_v_method_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else {
-      __pyx_v_method_name = ((char *)__pyx_k_BP);
-    }
-    __pyx_v_comm = ((struct PyMPICommObject *)values[2]);
-    __pyx_v_is_stream = values[3];
-    if (values[4]) {
-      __pyx_v_lock_mode = ((ADIOS_LOCKMODE)PyInt_AsLong(values[4])); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else {
-      __pyx_v_lock_mode = __pyx_k__7;
-    }
-    if (values[5]) {
-      __pyx_v_timeout_sec = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_timeout_sec == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else {
-      __pyx_v_timeout_sec = ((float)0.0);
-    }
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("adios_mpi.file.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
-  return -1;
-  __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_9adios_mpi_4file___init__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), __pyx_v_fname, __pyx_v_method_name, __pyx_v_comm, __pyx_v_is_stream, __pyx_v_lock_mode, __pyx_v_timeout_sec);
+  return __pyx_r;
+}
 
-  /* "adios_mpi.pyx":519
+static PyObject *__pyx_pf_9adios_mpi_4file_4name___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":641
+ *         """ The filename (or stream name) associated with. """
+ *         def __get__(self):
+ *             return self.name             # <<<<<<<<<<<<<<
+ * 
+ *     property nvars:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->name);
+  __pyx_r = __pyx_v_self->name;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":640
+ *     property name:
+ *         """ The filename (or stream name) associated with. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
- *     """ Initialization. Call adios_read_open and populate public members """
- *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
- *                  char * method_name = "BP",
- *                  MPI.Comm comm = MPI.COMM_WORLD,
  */
 
   /* function exit code */
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_9adios_mpi_4file___init__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, char *__pyx_v_fname, char *__pyx_v_method_name, struct PyMPICommObject *__pyx_v_comm, PyObject *__pyx_v_is_stream, ADIOS_LOCKMODE __pyx_v_lock_mode, float __pyx_v_timeout_sec) {
-  PyObject *__pyx_v_method = 0;
-  PyObject *__pyx_v_varname = NULL;
-  int __pyx_v_i;
-  int __pyx_r;
+/* "adios_mpi.pyx":645
+ *     property nvars:
+ *         """ The number of variables. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nvars
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_4file_5nvars_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_5nvars_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  ADIOS_READ_METHOD __pyx_t_4;
-  int __pyx_t_5;
-  uint64_t __pyx_t_6;
-  int __pyx_t_7;
-  Py_ssize_t __pyx_t_8;
-  PyObject *__pyx_t_9 = NULL;
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_5nvars___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_4file_5nvars___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__init__", 0);
-
-  /* "adios_mpi.pyx":525
- *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
- *                  float timeout_sec = 0.0):
- *         self.fp = NULL             # <<<<<<<<<<<<<<
- *         self.var = {}
- *         self.attr = {}
- */
-  __pyx_v_self->fp = NULL;
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "adios_mpi.pyx":526
- *                  float timeout_sec = 0.0):
- *         self.fp = NULL
- *         self.var = {}             # <<<<<<<<<<<<<<
- *         self.attr = {}
- *         self.is_stream = is_stream
+  /* "adios_mpi.pyx":646
+ *         """ The number of variables. """
+ *         def __get__(self):
+ *             return self.nvars             # <<<<<<<<<<<<<<
+ * 
+ *     property nattrs:
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nvars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 646; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->var);
-  __Pyx_DECREF(__pyx_v_self->var);
-  __pyx_v_self->var = ((PyObject*)__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios_mpi.pyx":527
- *         self.fp = NULL
- *         self.var = {}
- *         self.attr = {}             # <<<<<<<<<<<<<<
- *         self.is_stream = is_stream
- *         cdef method = str2adiosreadmethod(method_name)
+  /* "adios_mpi.pyx":645
+ *     property nvars:
+ *         """ The number of variables. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nvars
+ * 
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->attr);
-  __Pyx_DECREF(__pyx_v_self->attr);
-  __pyx_v_self->attr = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":528
- *         self.var = {}
- *         self.attr = {}
- *         self.is_stream = is_stream             # <<<<<<<<<<<<<<
- *         cdef method = str2adiosreadmethod(method_name)
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.file.nvars.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":650
+ *     property nattrs:
+ *         """ The number of attributes. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nattrs
  * 
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_is_stream); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->is_stream = __pyx_t_2;
 
-  /* "adios_mpi.pyx":529
- *         self.attr = {}
- *         self.is_stream = is_stream
- *         cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_4file_6nattrs_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_6nattrs_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_6nattrs___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_4file_6nattrs___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":651
+ *         """ The number of attributes. """
+ *         def __get__(self):
+ *             return self.nattrs             # <<<<<<<<<<<<<<
  * 
- *         if (is_stream):
+ *     property current_step:
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nattrs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 651; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyInt_FromLong(__pyx_f_9adios_mpi_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_method = __pyx_t_3;
-  __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios_mpi.pyx":531
- *         cdef method = str2adiosreadmethod(method_name)
+  /* "adios_mpi.pyx":650
+ *     property nattrs:
+ *         """ The number of attributes. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nattrs
  * 
- *         if (is_stream):             # <<<<<<<<<<<<<<
- *             self.fp = adios_read_open(fname, method, comm.ob_mpi,
- *                                       lock_mode, timeout_sec)
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_is_stream); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__pyx_t_2) {
 
-    /* "adios_mpi.pyx":532
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.file.nattrs.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":655
+ *     property current_step:
+ *         """ The current timestep index. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.current_step
  * 
- *         if (is_stream):
- *             self.fp = adios_read_open(fname, method, comm.ob_mpi,             # <<<<<<<<<<<<<<
- *                                       lock_mode, timeout_sec)
- *         else:
  */
-    __pyx_t_4 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "adios_mpi.pyx":533
- *         if (is_stream):
- *             self.fp = adios_read_open(fname, method, comm.ob_mpi,
- *                                       lock_mode, timeout_sec)             # <<<<<<<<<<<<<<
- *         else:
- *             self.fp = adios_read_open_file(fname, method, comm.ob_mpi)
- */
-    __pyx_v_self->fp = adios_read_open(__pyx_v_fname, __pyx_t_4, __pyx_v_comm->ob_mpi, __pyx_v_lock_mode, __pyx_v_timeout_sec);
-    goto __pyx_L3;
-  }
-  /*else*/ {
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_4file_12current_step_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_12current_step_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_12current_step___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
-    /* "adios_mpi.pyx":535
- *                                       lock_mode, timeout_sec)
- *         else:
- *             self.fp = adios_read_open_file(fname, method, comm.ob_mpi)             # <<<<<<<<<<<<<<
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_4file_12current_step___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":656
+ *         """ The current timestep index. """
+ *         def __get__(self):
+ *             return self.current_step             # <<<<<<<<<<<<<<
  * 
- *         assert self.fp != NULL, 'Not an open file'
+ *     property last_step:
  */
-    __pyx_t_4 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_self->fp = adios_read_open_file(__pyx_v_fname, __pyx_t_4, __pyx_v_comm->ob_mpi);
-  }
-  __pyx_L3:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->current_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios_mpi.pyx":537
- *             self.fp = adios_read_open_file(fname, method, comm.ob_mpi)
+  /* "adios_mpi.pyx":655
+ *     property current_step:
+ *         """ The current timestep index. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.current_step
  * 
- *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.file.current_step.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":660
+ *     property last_step:
+ *         """ The last timestep index. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.last_step
  * 
- *         self.name = fname.split('/')[-1]  ## basename
  */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-  }
-  #endif
 
-  /* "adios_mpi.pyx":539
- *         assert self.fp != NULL, 'Not an open file'
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_4file_9last_step_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_9last_step_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_9last_step___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_4file_9last_step___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":661
+ *         """ The last timestep index. """
+ *         def __get__(self):
+ *             return self.last_step             # <<<<<<<<<<<<<<
  * 
- *         self.name = fname.split('/')[-1]  ## basename             # <<<<<<<<<<<<<<
- *         self.nvars = self.fp.nvars
- *         self.nattrs = self.fp.nattrs
+ *     property endianness:
  */
-  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_fname); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, -1, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->name);
-  __Pyx_DECREF(__pyx_v_self->name);
-  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios_mpi.pyx":540
+  /* "adios_mpi.pyx":660
+ *     property last_step:
+ *         """ The last timestep index. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.last_step
  * 
- *         self.name = fname.split('/')[-1]  ## basename
- *         self.nvars = self.fp.nvars             # <<<<<<<<<<<<<<
- *         self.nattrs = self.fp.nattrs
- *         self.current_step = self.fp.current_step
  */
-  __pyx_t_5 = __pyx_v_self->fp->nvars;
-  __pyx_v_self->nvars = __pyx_t_5;
 
-  /* "adios_mpi.pyx":541
- *         self.name = fname.split('/')[-1]  ## basename
- *         self.nvars = self.fp.nvars
- *         self.nattrs = self.fp.nattrs             # <<<<<<<<<<<<<<
- *         self.current_step = self.fp.current_step
- *         self.last_step = self.fp.last_step
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.file.last_step.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":665
+ *     property endianness:
+ *         """ The endianness of the stored data. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.endianness
+ * 
  */
-  __pyx_t_5 = __pyx_v_self->fp->nattrs;
-  __pyx_v_self->nattrs = __pyx_t_5;
-
-  /* "adios_mpi.pyx":542
- *         self.nvars = self.fp.nvars
- *         self.nattrs = self.fp.nattrs
- *         self.current_step = self.fp.current_step             # <<<<<<<<<<<<<<
- *         self.last_step = self.fp.last_step
- *         self.endianness = self.fp.endianness
- */
-  __pyx_t_5 = __pyx_v_self->fp->current_step;
-  __pyx_v_self->current_step = __pyx_t_5;
-
-  /* "adios_mpi.pyx":543
- *         self.nattrs = self.fp.nattrs
- *         self.current_step = self.fp.current_step
- *         self.last_step = self.fp.last_step             # <<<<<<<<<<<<<<
- *         self.endianness = self.fp.endianness
- *         self.version = self.fp.version
- */
-  __pyx_t_5 = __pyx_v_self->fp->last_step;
-  __pyx_v_self->last_step = __pyx_t_5;
 
-  /* "adios_mpi.pyx":544
- *         self.current_step = self.fp.current_step
- *         self.last_step = self.fp.last_step
- *         self.endianness = self.fp.endianness             # <<<<<<<<<<<<<<
- *         self.version = self.fp.version
- *         self.file_size = self.fp.file_size
- */
-  __pyx_t_5 = __pyx_v_self->fp->endianness;
-  __pyx_v_self->endianness = __pyx_t_5;
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_4file_10endianness_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_10endianness_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_10endianness___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
-  /* "adios_mpi.pyx":545
- *         self.last_step = self.fp.last_step
- *         self.endianness = self.fp.endianness
- *         self.version = self.fp.version             # <<<<<<<<<<<<<<
- *         self.file_size = self.fp.file_size
- * 
- */
-  __pyx_t_5 = __pyx_v_self->fp->version;
-  __pyx_v_self->version = __pyx_t_5;
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "adios_mpi.pyx":546
- *         self.endianness = self.fp.endianness
- *         self.version = self.fp.version
- *         self.file_size = self.fp.file_size             # <<<<<<<<<<<<<<
- * 
- *         for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:
- */
-  __pyx_t_6 = __pyx_v_self->fp->file_size;
-  __pyx_v_self->file_size = __pyx_t_6;
+static PyObject *__pyx_pf_9adios_mpi_4file_10endianness___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "adios_mpi.pyx":548
- *         self.file_size = self.fp.file_size
- * 
- *         for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:             # <<<<<<<<<<<<<<
- *             self.var[varname] = var(self, varname)
+  /* "adios_mpi.pyx":666
+ *         """ The endianness of the stored data. """
+ *         def __get__(self):
+ *             return self.endianness             # <<<<<<<<<<<<<<
  * 
+ *     property version:
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->endianness); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 666; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = __pyx_v_self->nvars;
-  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_5; __pyx_t_7+=1) {
-    __pyx_v_i = __pyx_t_7;
-    __pyx_t_3 = __Pyx_PyBytes_FromString((__pyx_v_self->fp->var_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  }
-  __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_8 = 0;
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  for (;;) {
-    if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_3)) break;
-    #if CYTHON_COMPILING_IN_CPYTHON
-    __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #else
-    __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #endif
-    __Pyx_XDECREF_SET(__pyx_v_varname, __pyx_t_1);
-    __pyx_t_1 = 0;
-
-    /* "adios_mpi.pyx":549
- * 
- *         for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:
- *             self.var[varname] = var(self, varname)             # <<<<<<<<<<<<<<
- * 
- *     def __del__(self):
- */
-    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_INCREF(((PyObject *)__pyx_v_self));
-    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
-    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
-    __Pyx_INCREF(__pyx_v_varname);
-    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_varname);
-    __Pyx_GIVEREF(__pyx_v_varname);
-    __pyx_t_9 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_var)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_9);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (unlikely(__pyx_v_self->var == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-    if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_v_varname, __pyx_t_9) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-
-    /* "adios_mpi.pyx":548
- *         self.file_size = self.fp.file_size
- * 
- *         for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:             # <<<<<<<<<<<<<<
- *             self.var[varname] = var(self, varname)
- * 
- */
-  }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios_mpi.pyx":519
+  /* "adios_mpi.pyx":665
+ *     property endianness:
+ *         """ The endianness of the stored data. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.endianness
  * 
- *     """ Initialization. Call adios_read_open and populate public members """
- *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
- *                  char * method_name = "BP",
- *                  MPI.Comm comm = MPI.COMM_WORLD,
  */
 
   /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_9);
-  __Pyx_AddTraceback("adios_mpi.file.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_AddTraceback("adios_mpi.file.endianness.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_method);
-  __Pyx_XDECREF(__pyx_v_varname);
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":551
- *             self.var[varname] = var(self, varname)
- * 
- *     def __del__(self):             # <<<<<<<<<<<<<<
- *             self.close()
+/* "adios_mpi.pyx":670
+ *     property version:
+ *         """ The version of Adios. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.version
  * 
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_9adios_mpi_4file_7version_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_7version_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_2__del__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_7version___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4file_2__del__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_4file_7version___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "adios_mpi.pyx":552
- * 
- *     def __del__(self):
- *             self.close()             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":671
+ *         """ The version of Adios. """
+ *         def __get__(self):
+ *             return self.version             # <<<<<<<<<<<<<<
  * 
- *     """ Call adios_read_close """
+ *     property file_sizec:
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_9adios_mpi_file *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios_mpi.pyx":551
- *             self.var[varname] = var(self, varname)
- * 
- *     def __del__(self):             # <<<<<<<<<<<<<<
- *             self.close()
+  /* "adios_mpi.pyx":670
+ *     property version:
+ *         """ The version of Adios. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.version
  * 
  */
 
   /* function exit code */
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.__del__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.file.version.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -7366,151 +9438,125 @@ static PyObject *__pyx_pf_9adios_mpi_4file_2__del__(struct __pyx_obj_9adios_mpi_
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":555
+/* "adios_mpi.pyx":675
+ *     property file_sizec:
+ *         """ The size of Adios file. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.file_size
  * 
- *     """ Call adios_read_close """
- *     cpdef close(self):             # <<<<<<<<<<<<<<
- *         assert self.fp != NULL, 'Not an open file'
- *         adios_read_close(self.fp)
  */
 
-static PyObject *__pyx_pw_9adios_mpi_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_f_9adios_mpi_4file_close(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_skip_dispatch) {
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_4file_10file_sizec_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_10file_sizec_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_10file_sizec___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_4file_10file_sizec___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("close", 0);
-  /* Check if called by wrapper */
-  if (unlikely(__pyx_skip_dispatch)) ;
-  /* Check if overridden in Python */
-  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_4file_5close)) {
-      __Pyx_XDECREF(__pyx_r);
-      __Pyx_INCREF(__pyx_t_1);
-      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
-      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
-        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
-        if (likely(__pyx_t_4)) {
-          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(function);
-          __Pyx_DECREF_SET(__pyx_t_3, function);
-        }
-      }
-      if (__pyx_t_4) {
-        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      } else {
-        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_2;
-      __pyx_t_2 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L0;
-    }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  }
-
-  /* "adios_mpi.pyx":556
- *     """ Call adios_read_close """
- *     cpdef close(self):
- *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
- *         adios_read_close(self.fp)
- *         self.fp = NULL
- */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-  }
-  #endif
-
-  /* "adios_mpi.pyx":557
- *     cpdef close(self):
- *         assert self.fp != NULL, 'Not an open file'
- *         adios_read_close(self.fp)             # <<<<<<<<<<<<<<
- *         self.fp = NULL
- * 
- */
-  adios_read_close(__pyx_v_self->fp);
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "adios_mpi.pyx":558
- *         assert self.fp != NULL, 'Not an open file'
- *         adios_read_close(self.fp)
- *         self.fp = NULL             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":676
+ *         """ The size of Adios file. """
+ *         def __get__(self):
+ *             return self.file_size             # <<<<<<<<<<<<<<
  * 
- *     """ Print self """
+ *     property is_stream:
  */
-  __pyx_v_self->fp = NULL;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->file_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  /* "adios_mpi.pyx":555
+  /* "adios_mpi.pyx":675
+ *     property file_sizec:
+ *         """ The size of Adios file. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.file_size
  * 
- *     """ Call adios_read_close """
- *     cpdef close(self):             # <<<<<<<<<<<<<<
- *         assert self.fp != NULL, 'Not an open file'
- *         adios_read_close(self.fp)
  */
 
   /* function exit code */
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("adios_mpi.file.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
+  __Pyx_AddTraceback("adios_mpi.file.file_sizec.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "adios_mpi.pyx":680
+ *     property is_stream:
+ *         """ Indicating reader type; file reader or stream reader """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_stream
+ * 
+ */
+
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_9adios_mpi_4file_9is_stream_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_9is_stream_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("close (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_4close(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_9is_stream___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4file_4close(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_4file_9is_stream___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("close", 0);
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":681
+ *         """ Indicating reader type; file reader or stream reader """
+ *         def __get__(self):
+ *             return self.is_stream             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, char * fname,
+ */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_9adios_mpi_4file_close(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_stream); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
+  /* "adios_mpi.pyx":680
+ *     property is_stream:
+ *         """ Indicating reader type; file reader or stream reader """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_stream
+ * 
+ */
+
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.file.is_stream.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -7518,546 +9564,738 @@ static PyObject *__pyx_pf_9adios_mpi_4file_4close(struct __pyx_obj_9adios_mpi_fi
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":561
+/* "adios_mpi.pyx":683
+ *             return self.is_stream
  * 
- *     """ Print self """
- *     cpdef printself(self):             # <<<<<<<<<<<<<<
- *         assert self.fp != NULL, 'Not an open file'
- *         print '=== AdiosFile ==='
+ *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
+ *                  char * method_name = 'BP',
+ *                  MPI.Comm comm = MPI.COMM_WORLD,
  */
 
-static PyObject *__pyx_pw_9adios_mpi_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_f_9adios_mpi_4file_printself(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_skip_dispatch) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_4file_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_9adios_mpi_4file_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_fname;
+  char *__pyx_v_method_name;
+  struct PyMPICommObject *__pyx_v_comm = 0;
+  PyObject *__pyx_v_is_stream = 0;
+  ADIOS_LOCKMODE __pyx_v_lock_mode;
+  float __pyx_v_timeout_sec;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("printself", 0);
-  /* Check if called by wrapper */
-  if (unlikely(__pyx_skip_dispatch)) ;
-  /* Check if overridden in Python */
-  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_printself); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_4file_7printself)) {
-      __Pyx_XDECREF(__pyx_r);
-      __Pyx_INCREF(__pyx_t_1);
-      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
-      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
-        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
-        if (likely(__pyx_t_4)) {
-          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(function);
-          __Pyx_DECREF_SET(__pyx_t_3, function);
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_method_name,&__pyx_n_s_comm,&__pyx_n_s_is_stream,&__pyx_n_s_lock_mode,&__pyx_n_s_timeout_sec,0};
+    PyObject* values[6] = {0,0,0,0,0,0};
+    values[2] = (PyObject *)__pyx_k__9;
+
+    /* "adios_mpi.pyx":686
+ *                  char * method_name = 'BP',
+ *                  MPI.Comm comm = MPI.COMM_WORLD,
+ *                  is_stream = False,             # <<<<<<<<<<<<<<
+ *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
+ *                  float timeout_sec = 0.0):
+ */
+    values[3] = ((PyObject *)Py_False);
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method_name);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
+          if (value) { values[2] = value; kw_args--; }
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_is_stream);
+          if (value) { values[3] = value; kw_args--; }
+        }
+        case  4:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lock_mode);
+          if (value) { values[4] = value; kw_args--; }
+        }
+        case  5:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_timeout_sec);
+          if (value) { values[5] = value; kw_args--; }
         }
       }
-      if (__pyx_t_4) {
-        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      } else {
-        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
       }
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_2;
-      __pyx_t_2 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  }
-
-  /* "adios_mpi.pyx":562
- *     """ Print self """
- *     cpdef printself(self):
- *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
- *         print '=== AdiosFile ==='
- *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
- */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_fname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_fname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[1]) {
+      __pyx_v_method_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_method_name = ((char *)__pyx_k_BP);
+    }
+    __pyx_v_comm = ((struct PyMPICommObject *)values[2]);
+    __pyx_v_is_stream = values[3];
+    if (values[4]) {
+      __pyx_v_lock_mode = ((ADIOS_LOCKMODE)PyInt_AsLong(values[4])); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 687; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_lock_mode = __pyx_k__10;
+    }
+    if (values[5]) {
+      __pyx_v_timeout_sec = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_timeout_sec == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 688; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_timeout_sec = ((float)0.0);
     }
   }
-  #endif
-
-  /* "adios_mpi.pyx":563
- *     cpdef printself(self):
- *         assert self.fp != NULL, 'Not an open file'
- *         print '=== AdiosFile ==='             # <<<<<<<<<<<<<<
- *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
- *         printfile(self.fp)
- */
-  if (__Pyx_PrintOne(0, __pyx_kp_s_AdiosFile) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  /* "adios_mpi.pyx":564
- *         assert self.fp != NULL, 'Not an open file'
- *         print '=== AdiosFile ==='
- *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)             # <<<<<<<<<<<<<<
- *         printfile(self.fp)
- * 
- */
-  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->fp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(__pyx_n_s_fp);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_fp);
-  __Pyx_GIVEREF(__pyx_n_s_fp);
-  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
-  /* "adios_mpi.pyx":565
- *         print '=== AdiosFile ==='
- *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
- *         printfile(self.fp)             # <<<<<<<<<<<<<<
- * 
- *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):
- */
-  __pyx_t_1 = __pyx_f_9adios_mpi_printfile(__pyx_v_self->fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.file.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_4file___init__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), __pyx_v_fname, __pyx_v_method_name, __pyx_v_comm, __pyx_v_is_stream, __pyx_v_lock_mode, __pyx_v_timeout_sec);
 
-  /* "adios_mpi.pyx":561
+  /* "adios_mpi.pyx":683
+ *             return self.is_stream
  * 
- *     """ Print self """
- *     cpdef printself(self):             # <<<<<<<<<<<<<<
- *         assert self.fp != NULL, 'Not an open file'
- *         print '=== AdiosFile ==='
+ *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
+ *                  char * method_name = 'BP',
+ *                  MPI.Comm comm = MPI.COMM_WORLD,
  */
 
   /* function exit code */
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("adios_mpi.file.printself", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
+  __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("printself (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_6printself(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
-
-  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4file_6printself(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
+static int __pyx_pf_9adios_mpi_4file___init__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, char *__pyx_v_fname, char *__pyx_v_method_name, struct PyMPICommObject *__pyx_v_comm, PyObject *__pyx_v_is_stream, ADIOS_LOCKMODE __pyx_v_lock_mode, float __pyx_v_timeout_sec) {
+  PyObject *__pyx_v_method = 0;
+  PyObject *__pyx_v_name = NULL;
+  int __pyx_v_i;
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  ADIOS_READ_METHOD __pyx_t_4;
+  int __pyx_t_5;
+  uint64_t __pyx_t_6;
+  int __pyx_t_7;
+  Py_ssize_t __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("printself", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_9adios_mpi_4file_printself(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.printself", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios_mpi.pyx":689
+ *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
+ *                  float timeout_sec = 0.0):
+ *         self.fp = NULL             # <<<<<<<<<<<<<<
+ *         self.var = {}
+ *         self.attr = {}
+ */
+  __pyx_v_self->fp = NULL;
 
-/* "adios_mpi.pyx":567
- *         printfile(self.fp)
+  /* "adios_mpi.pyx":690
+ *                  float timeout_sec = 0.0):
+ *         self.fp = NULL
+ *         self.var = {}             # <<<<<<<<<<<<<<
+ *         self.attr = {}
+ *         self.is_stream = is_stream
+ */
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 690; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->var);
+  __Pyx_DECREF(__pyx_v_self->var);
+  __pyx_v_self->var = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":691
+ *         self.fp = NULL
+ *         self.var = {}
+ *         self.attr = {}             # <<<<<<<<<<<<<<
+ *         self.is_stream = is_stream
+ *         cdef method = str2adiosreadmethod(method_name)
+ */
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->attr);
+  __Pyx_DECREF(__pyx_v_self->attr);
+  __pyx_v_self->attr = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":692
+ *         self.var = {}
+ *         self.attr = {}
+ *         self.is_stream = is_stream             # <<<<<<<<<<<<<<
+ *         cdef method = str2adiosreadmethod(method_name)
  * 
- *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
- *         return adios_advance_step(self.fp, last, timeout_sec)
+ */
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_is_stream); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_self->is_stream = __pyx_t_2;
+
+  /* "adios_mpi.pyx":693
+ *         self.attr = {}
+ *         self.is_stream = is_stream
+ *         cdef method = str2adiosreadmethod(method_name)             # <<<<<<<<<<<<<<
  * 
+ *         if (is_stream):
  */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_method_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 693; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyInt_FromLong(__pyx_f_9adios_mpi_str2adiosreadmethod(((PyObject*)__pyx_t_1))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 693; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_method = __pyx_t_3;
+  __pyx_t_3 = 0;
 
-static PyObject *__pyx_pw_9adios_mpi_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_f_9adios_mpi_4file_advance(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_4file_advance *__pyx_optional_args) {
-  int __pyx_v_last = ((int)0);
-  float __pyx_v_timeout_sec = ((float)0.0);
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *__pyx_t_8 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("advance", 0);
-  if (__pyx_optional_args) {
-    if (__pyx_optional_args->__pyx_n > 0) {
-      __pyx_v_last = __pyx_optional_args->last;
-      if (__pyx_optional_args->__pyx_n > 1) {
-        __pyx_v_timeout_sec = __pyx_optional_args->timeout_sec;
-      }
-    }
+  /* "adios_mpi.pyx":695
+ *         cdef method = str2adiosreadmethod(method_name)
+ * 
+ *         if (is_stream):             # <<<<<<<<<<<<<<
+ *             self.fp = adios_read_open(fname, method, comm.ob_mpi,
+ *                                       lock_mode, timeout_sec)
+ */
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_is_stream); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 695; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__pyx_t_2) {
+
+    /* "adios_mpi.pyx":696
+ * 
+ *         if (is_stream):
+ *             self.fp = adios_read_open(fname, method, comm.ob_mpi,             # <<<<<<<<<<<<<<
+ *                                       lock_mode, timeout_sec)
+ *         else:
+ */
+    __pyx_t_4 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 696; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "adios_mpi.pyx":697
+ *         if (is_stream):
+ *             self.fp = adios_read_open(fname, method, comm.ob_mpi,
+ *                                       lock_mode, timeout_sec)             # <<<<<<<<<<<<<<
+ *         else:
+ *             self.fp = adios_read_open_file(fname, method, comm.ob_mpi)
+ */
+    __pyx_v_self->fp = adios_read_open(__pyx_v_fname, __pyx_t_4, __pyx_v_comm->ob_mpi, __pyx_v_lock_mode, __pyx_v_timeout_sec);
+    goto __pyx_L3;
   }
-  /* Check if called by wrapper */
-  if (unlikely(__pyx_skip_dispatch)) ;
-  /* Check if overridden in Python */
-  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_4file_9advance)) {
-      __Pyx_XDECREF(__pyx_r);
-      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_last); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_timeout_sec); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_INCREF(__pyx_t_1);
-      __pyx_t_5 = __pyx_t_1; __pyx_t_6 = NULL;
-      __pyx_t_7 = 0;
-      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
-        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
-        if (likely(__pyx_t_6)) {
-          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
-          __Pyx_INCREF(__pyx_t_6);
-          __Pyx_INCREF(function);
-          __Pyx_DECREF_SET(__pyx_t_5, function);
-          __pyx_t_7 = 1;
-        }
-      }
-      __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      if (__pyx_t_6) {
-        PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
-      }
-      PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_4);
-      __Pyx_GIVEREF(__pyx_t_4);
-      __pyx_t_3 = 0;
-      __pyx_t_4 = 0;
-      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_r = __pyx_t_2;
-      __pyx_t_2 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L0;
-    }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  /*else*/ {
+
+    /* "adios_mpi.pyx":699
+ *                                       lock_mode, timeout_sec)
+ *         else:
+ *             self.fp = adios_read_open_file(fname, method, comm.ob_mpi)             # <<<<<<<<<<<<<<
+ * 
+ *         assert self.fp != NULL, 'Not an open file'
+ */
+    __pyx_t_4 = ((ADIOS_READ_METHOD)PyInt_AsLong(__pyx_v_method)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_self->fp = adios_read_open_file(__pyx_v_fname, __pyx_t_4, __pyx_v_comm->ob_mpi);
   }
+  __pyx_L3:;
 
-  /* "adios_mpi.pyx":568
+  /* "adios_mpi.pyx":701
+ *             self.fp = adios_read_open_file(fname, method, comm.ob_mpi)
  * 
- *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):
- *         return adios_advance_step(self.fp, last, timeout_sec)             # <<<<<<<<<<<<<<
+ *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
  * 
- * """ Python class for ADIOS_VARINFO structure """
+ *         self.name = fname.split('/')[-1]  ## basename
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(adios_advance_step(__pyx_v_self->fp, __pyx_v_last, __pyx_v_timeout_sec)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(!Py_OptimizeFlag)) {
+    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
+      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+  }
+  #endif
+
+  /* "adios_mpi.pyx":703
+ *         assert self.fp != NULL, 'Not an open file'
+ * 
+ *         self.name = fname.split('/')[-1]  ## basename             # <<<<<<<<<<<<<<
+ *         self.nvars = self.fp.nvars
+ *         self.nattrs = self.fp.nattrs
+ */
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_fname); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 703; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 703; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 703; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, -1, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 703; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 703; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->name);
+  __Pyx_DECREF(__pyx_v_self->name);
+  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
   __pyx_t_1 = 0;
-  goto __pyx_L0;
 
-  /* "adios_mpi.pyx":567
- *         printfile(self.fp)
- * 
- *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
- *         return adios_advance_step(self.fp, last, timeout_sec)
+  /* "adios_mpi.pyx":704
  * 
+ *         self.name = fname.split('/')[-1]  ## basename
+ *         self.nvars = self.fp.nvars             # <<<<<<<<<<<<<<
+ *         self.nattrs = self.fp.nattrs
+ *         self.current_step = self.fp.current_step
  */
+  __pyx_t_5 = __pyx_v_self->fp->nvars;
+  __pyx_v_self->nvars = __pyx_t_5;
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_XDECREF(__pyx_t_8);
-  __Pyx_AddTraceback("adios_mpi.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios_mpi.pyx":705
+ *         self.name = fname.split('/')[-1]  ## basename
+ *         self.nvars = self.fp.nvars
+ *         self.nattrs = self.fp.nattrs             # <<<<<<<<<<<<<<
+ *         self.current_step = self.fp.current_step
+ *         self.last_step = self.fp.last_step
+ */
+  __pyx_t_5 = __pyx_v_self->fp->nattrs;
+  __pyx_v_self->nattrs = __pyx_t_5;
 
-/* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_v_last;
-  float __pyx_v_timeout_sec;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_last,&__pyx_n_s_timeout_sec,0};
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_last);
-          if (value) { values[0] = value; kw_args--; }
-        }
-        case  1:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_timeout_sec);
-          if (value) { values[1] = value; kw_args--; }
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else {
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-    }
-    if (values[0]) {
-      __pyx_v_last = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_last == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else {
-      __pyx_v_last = ((int)0);
-    }
-    if (values[1]) {
-      __pyx_v_timeout_sec = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_timeout_sec == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else {
-      __pyx_v_timeout_sec = ((float)0.0);
+  /* "adios_mpi.pyx":706
+ *         self.nvars = self.fp.nvars
+ *         self.nattrs = self.fp.nattrs
+ *         self.current_step = self.fp.current_step             # <<<<<<<<<<<<<<
+ *         self.last_step = self.fp.last_step
+ *         self.endianness = self.fp.endianness
+ */
+  __pyx_t_5 = __pyx_v_self->fp->current_step;
+  __pyx_v_self->current_step = __pyx_t_5;
+
+  /* "adios_mpi.pyx":707
+ *         self.nattrs = self.fp.nattrs
+ *         self.current_step = self.fp.current_step
+ *         self.last_step = self.fp.last_step             # <<<<<<<<<<<<<<
+ *         self.endianness = self.fp.endianness
+ *         self.version = self.fp.version
+ */
+  __pyx_t_5 = __pyx_v_self->fp->last_step;
+  __pyx_v_self->last_step = __pyx_t_5;
+
+  /* "adios_mpi.pyx":708
+ *         self.current_step = self.fp.current_step
+ *         self.last_step = self.fp.last_step
+ *         self.endianness = self.fp.endianness             # <<<<<<<<<<<<<<
+ *         self.version = self.fp.version
+ *         self.file_size = self.fp.file_size
+ */
+  __pyx_t_5 = __pyx_v_self->fp->endianness;
+  __pyx_v_self->endianness = __pyx_t_5;
+
+  /* "adios_mpi.pyx":709
+ *         self.last_step = self.fp.last_step
+ *         self.endianness = self.fp.endianness
+ *         self.version = self.fp.version             # <<<<<<<<<<<<<<
+ *         self.file_size = self.fp.file_size
+ * 
+ */
+  __pyx_t_5 = __pyx_v_self->fp->version;
+  __pyx_v_self->version = __pyx_t_5;
+
+  /* "adios_mpi.pyx":710
+ *         self.endianness = self.fp.endianness
+ *         self.version = self.fp.version
+ *         self.file_size = self.fp.file_size             # <<<<<<<<<<<<<<
+ * 
+ *         for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:
+ */
+  __pyx_t_6 = __pyx_v_self->fp->file_size;
+  __pyx_v_self->file_size = __pyx_t_6;
+
+  /* "adios_mpi.pyx":712
+ *         self.file_size = self.fp.file_size
+ * 
+ *         for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:             # <<<<<<<<<<<<<<
+ *             self.var[name] = var(self, name)
+ * 
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = __pyx_v_self->nvars;
+  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_5; __pyx_t_7+=1) {
+    __pyx_v_i = __pyx_t_7;
+    __pyx_t_3 = __Pyx_PyBytes_FromString((__pyx_v_self->fp->var_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  for (;;) {
+    if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_3)) break;
+    #if CYTHON_COMPILING_IN_CPYTHON
+    __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #else
+    __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_name, __pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "adios_mpi.pyx":713
+ * 
+ *         for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:
+ *             self.var[name] = var(self, name)             # <<<<<<<<<<<<<<
+ * 
+ *         for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:
+ */
+    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __Pyx_INCREF(__pyx_v_name);
+    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_name);
+    __Pyx_GIVEREF(__pyx_v_name);
+    __pyx_t_9 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_var)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
+    if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_v_name, __pyx_t_9) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+    /* "adios_mpi.pyx":712
+ *         self.file_size = self.fp.file_size
+ * 
+ *         for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:             # <<<<<<<<<<<<<<
+ *             self.var[name] = var(self, name)
+ * 
+ */
   }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("advance", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("adios_mpi.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_4file_8advance(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), __pyx_v_last, __pyx_v_timeout_sec);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios_mpi.pyx":715
+ *             self.var[name] = var(self, name)
+ * 
+ *         for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:             # <<<<<<<<<<<<<<
+ *             self.attr[name] = attr(self, name)
+ * 
+ */
+  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_5 = __pyx_v_self->nattrs;
+  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_5; __pyx_t_7+=1) {
+    __pyx_v_i = __pyx_t_7;
+    __pyx_t_9 = __Pyx_PyBytes_FromString((__pyx_v_self->fp->attr_namelist[__pyx_v_i])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_9))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  }
+  __pyx_t_9 = __pyx_t_3; __Pyx_INCREF(__pyx_t_9); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_9)) break;
+    #if CYTHON_COMPILING_IN_CPYTHON
+    __pyx_t_3 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #else
+    __pyx_t_3 = PySequence_ITEM(__pyx_t_9, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_name, __pyx_t_3);
+    __pyx_t_3 = 0;
 
-static PyObject *__pyx_pf_9adios_mpi_4file_8advance(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_v_last, float __pyx_v_timeout_sec) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  struct __pyx_opt_args_9adios_mpi_4file_advance __pyx_t_2;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("advance", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2.__pyx_n = 2;
-  __pyx_t_2.last = __pyx_v_last;
-  __pyx_t_2.timeout_sec = __pyx_v_timeout_sec;
-  __pyx_t_1 = __pyx_vtabptr_9adios_mpi_file->advance(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+    /* "adios_mpi.pyx":716
+ * 
+ *         for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:
+ *             self.attr[name] = attr(self, name)             # <<<<<<<<<<<<<<
+ * 
+ *     def __del__(self):
+ */
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __Pyx_INCREF(__pyx_v_name);
+    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_name);
+    __Pyx_GIVEREF(__pyx_v_name);
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_attr)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(__pyx_v_self->attr == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    if (unlikely(PyDict_SetItem(__pyx_v_self->attr, __pyx_v_name, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "adios_mpi.pyx":715
+ *             self.var[name] = var(self, name)
+ * 
+ *         for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:             # <<<<<<<<<<<<<<
+ *             self.attr[name] = attr(self, name)
+ * 
+ */
+  }
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "adios_mpi.pyx":683
+ *             return self.is_stream
+ * 
+ *     def __init__(self, char * fname,             # <<<<<<<<<<<<<<
+ *                  char * method_name = 'BP',
+ *                  MPI.Comm comm = MPI.COMM_WORLD,
+ */
 
   /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("adios_mpi.file.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_XDECREF(__pyx_v_method);
+  __Pyx_XDECREF(__pyx_v_name);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":504
+/* "adios_mpi.pyx":718
+ *             self.attr[name] = attr(self, name)
  * 
- *     """ Public Memeber """
- *     cpdef public bytes name             # <<<<<<<<<<<<<<
- *     cpdef public int nvars
- *     cpdef public int nattrs
+ *     def __del__(self):             # <<<<<<<<<<<<<<
+ *         """ Close file on destruction. """
+ *         self.close()
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_4name_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_4file_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_9adios_mpi_4file_2__del__[] = "file.__del__(self)\n Close file on destruction. ";
+static PyObject *__pyx_pw_9adios_mpi_4file_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_4name___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_2__del__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4file_4name___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_4file_2__del__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->name);
-  __pyx_r = __pyx_v_self->name;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_4name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_4name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_4name_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_4file_4name_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyBytes_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->name);
-  __Pyx_DECREF(__pyx_v_self->name);
-  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+  __Pyx_RefNannySetupContext("__del__", 0);
+
+  /* "adios_mpi.pyx":720
+ *     def __del__(self):
+ *         """ Close file on destruction. """
+ *         self.close()             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef close(self):
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_9adios_mpi_file *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 720; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":718
+ *             self.attr[name] = attr(self, name)
+ * 
+ *     def __del__(self):             # <<<<<<<<<<<<<<
+ *         """ Close file on destruction. """
+ *         self.close()
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.name.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_AddTraceback("adios_mpi.file.__del__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_4name_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_4name_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_4name_4__del__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+/* "adios_mpi.pyx":722
+ *         self.close()
+ * 
+ *     cpdef close(self):             # <<<<<<<<<<<<<<
+ *         """ Close the open file. """
+ *         assert self.fp != NULL, 'Not an open file'
+ */
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_4file_4name_4__del__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
-  int __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_4file_close(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_skip_dispatch) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->name);
-  __Pyx_DECREF(__pyx_v_self->name);
-  __pyx_v_self->name = ((PyObject*)Py_None);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("close", 0);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_4file_5close)) {
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_3, function);
+        }
+      }
+      if (__pyx_t_4) {
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      } else {
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_2;
+      __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "adios_mpi.pyx":724
+ *     cpdef close(self):
+ *         """ Close the open file. """
+ *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
+ *         adios_read_close(self.fp)
+ *         self.fp = NULL
+ */
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(!Py_OptimizeFlag)) {
+    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
+      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 724; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+  }
+  #endif
+
+  /* "adios_mpi.pyx":725
+ *         """ Close the open file. """
+ *         assert self.fp != NULL, 'Not an open file'
+ *         adios_read_close(self.fp)             # <<<<<<<<<<<<<<
+ *         self.fp = NULL
+ * 
+ */
+  adios_read_close(__pyx_v_self->fp);
+
+  /* "adios_mpi.pyx":726
+ *         assert self.fp != NULL, 'Not an open file'
+ *         adios_read_close(self.fp)
+ *         self.fp = NULL             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef printself(self):
+ */
+  __pyx_v_self->fp = NULL;
+
+  /* "adios_mpi.pyx":722
+ *         self.close()
+ * 
+ *     cpdef close(self):             # <<<<<<<<<<<<<<
+ *         """ Close the open file. """
+ *         assert self.fp != NULL, 'Not an open file'
+ */
 
   /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios_mpi.file.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":505
- *     """ Public Memeber """
- *     cpdef public bytes name
- *     cpdef public int nvars             # <<<<<<<<<<<<<<
- *     cpdef public int nattrs
- *     cpdef public int current_step
- */
-
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_5nvars_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_5nvars_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_9adios_mpi_4file_4close[] = "file.close(self)\n Close the open file. ";
+static PyObject *__pyx_pw_9adios_mpi_4file_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_5nvars___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("close (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_4close(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4file_5nvars___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_4file_4close(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("close", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nvars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_9adios_mpi_4file_close(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -8066,7 +10304,7 @@ static PyObject *__pyx_pf_9adios_mpi_4file_5nvars___get__(struct __pyx_obj_9adio
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.nvars.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.file.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -8074,72 +10312,168 @@ static PyObject *__pyx_pf_9adios_mpi_4file_5nvars___get__(struct __pyx_obj_9adio
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_5nvars_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_5nvars_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_5nvars_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+/* "adios_mpi.pyx":728
+ *         self.fp = NULL
+ * 
+ *     cpdef printself(self):             # <<<<<<<<<<<<<<
+ *         """ Print native ADIOS_FILE structure. """
+ *         assert self.fp != NULL, 'Not an open file'
+ */
 
-static int __pyx_pf_9adios_mpi_4file_5nvars_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_4file_printself(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_skip_dispatch) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->nvars = __pyx_t_1;
+  __Pyx_RefNannySetupContext("printself", 0);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_printself); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_4file_7printself)) {
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_3, function);
+        }
+      }
+      if (__pyx_t_4) {
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      } else {
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_2;
+      __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "adios_mpi.pyx":730
+ *     cpdef printself(self):
+ *         """ Print native ADIOS_FILE structure. """
+ *         assert self.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
+ *         print '=== AdiosFile ==='
+ *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
+ */
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(!Py_OptimizeFlag)) {
+    if (unlikely(!((__pyx_v_self->fp != NULL) != 0))) {
+      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 730; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+  }
+  #endif
+
+  /* "adios_mpi.pyx":731
+ *         """ Print native ADIOS_FILE structure. """
+ *         assert self.fp != NULL, 'Not an open file'
+ *         print '=== AdiosFile ==='             # <<<<<<<<<<<<<<
+ *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
+ *         printfile(self.fp)
+ */
+  if (__Pyx_PrintOne(0, __pyx_kp_s_AdiosFile) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":732
+ *         assert self.fp != NULL, 'Not an open file'
+ *         print '=== AdiosFile ==='
+ *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)             # <<<<<<<<<<<<<<
+ *         printfile(self.fp)
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->fp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_n_s_fp);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_fp);
+  __Pyx_GIVEREF(__pyx_n_s_fp);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":733
+ *         print '=== AdiosFile ==='
+ *         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
+ *         printfile(self.fp)             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):
+ */
+  __pyx_t_1 = __pyx_f_9adios_mpi_printfile(__pyx_v_self->fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":728
+ *         self.fp = NULL
+ * 
+ *     cpdef printself(self):             # <<<<<<<<<<<<<<
+ *         """ Print native ADIOS_FILE structure. """
+ *         assert self.fp != NULL, 'Not an open file'
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.file.nvars.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios_mpi.file.printself", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":506
- *     cpdef public bytes name
- *     cpdef public int nvars
- *     cpdef public int nattrs             # <<<<<<<<<<<<<<
- *     cpdef public int current_step
- *     cpdef public int last_step
- */
-
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_6nattrs_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_6nattrs_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_9adios_mpi_4file_6printself[] = "file.printself(self)\n Print native ADIOS_FILE structure. ";
+static PyObject *__pyx_pw_9adios_mpi_4file_7printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_6nattrs___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("printself (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_6printself(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4file_6nattrs___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_4file_6printself(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("printself", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nattrs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_9adios_mpi_4file_printself(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -8148,7 +10482,7 @@ static PyObject *__pyx_pf_9adios_mpi_4file_6nattrs___get__(struct __pyx_obj_9adi
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.nattrs.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.file.printself", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -8156,72 +10490,356 @@ static PyObject *__pyx_pf_9adios_mpi_4file_6nattrs___get__(struct __pyx_obj_9adi
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_6nattrs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_6nattrs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_6nattrs_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+/* "adios_mpi.pyx":735
+ *         printfile(self.fp)
+ * 
+ *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
+ *         """
+ *         Advance a timestep for stream reader.
+ */
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_4file_6nattrs_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_4file_advance(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_4file_advance *__pyx_optional_args) {
+  int __pyx_v_last = ((int)0);
+  float __pyx_v_timeout_sec = ((float)0.0);
+  int __pyx_v_val;
+  PyObject *__pyx_v_v = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  Py_ssize_t __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  int __pyx_t_10;
+  PyObject *(*__pyx_t_11)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->nattrs = __pyx_t_1;
+  __Pyx_RefNannySetupContext("advance", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_last = __pyx_optional_args->last;
+      if (__pyx_optional_args->__pyx_n > 1) {
+        __pyx_v_timeout_sec = __pyx_optional_args->timeout_sec;
+      }
+    }
+  }
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_4file_9advance)) {
+      __Pyx_XDECREF(__pyx_r);
+      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_last); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_timeout_sec); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_5 = __pyx_t_1; __pyx_t_6 = NULL;
+      __pyx_t_7 = 0;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
+        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
+        if (likely(__pyx_t_6)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+          __Pyx_INCREF(__pyx_t_6);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_5, function);
+          __pyx_t_7 = 1;
+        }
+      }
+      __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      if (__pyx_t_6) {
+        PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
+      }
+      PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_4);
+      __Pyx_GIVEREF(__pyx_t_4);
+      __pyx_t_3 = 0;
+      __pyx_t_4 = 0;
+      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_r = __pyx_t_2;
+      __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
 
-  /* function exit code */
-  __pyx_r = 0;
+  /* "adios_mpi.pyx":746
+ *             int: 0 if successful, non-zero otherwise.
+ *         """
+ *         val = adios_advance_step(self.fp, last, timeout_sec)             # <<<<<<<<<<<<<<
+ *         if (val >= 0):
+ *             self.current_step = self.fp.current_step
+ */
+  __pyx_v_val = adios_advance_step(__pyx_v_self->fp, __pyx_v_last, __pyx_v_timeout_sec);
+
+  /* "adios_mpi.pyx":747
+ *         """
+ *         val = adios_advance_step(self.fp, last, timeout_sec)
+ *         if (val >= 0):             # <<<<<<<<<<<<<<
+ *             self.current_step = self.fp.current_step
+ *             self.last_step = self.fp.last_step
+ */
+  __pyx_t_9 = ((__pyx_v_val >= 0) != 0);
+  if (__pyx_t_9) {
+
+    /* "adios_mpi.pyx":748
+ *         val = adios_advance_step(self.fp, last, timeout_sec)
+ *         if (val >= 0):
+ *             self.current_step = self.fp.current_step             # <<<<<<<<<<<<<<
+ *             self.last_step = self.fp.last_step
+ * 
+ */
+    __pyx_t_10 = __pyx_v_self->fp->current_step;
+    __pyx_v_self->current_step = __pyx_t_10;
+
+    /* "adios_mpi.pyx":749
+ *         if (val >= 0):
+ *             self.current_step = self.fp.current_step
+ *             self.last_step = self.fp.last_step             # <<<<<<<<<<<<<<
+ * 
+ *             for v in self.var.values():
+ */
+    __pyx_t_10 = __pyx_v_self->fp->last_step;
+    __pyx_v_self->last_step = __pyx_t_10;
+
+    /* "adios_mpi.pyx":751
+ *             self.last_step = self.fp.last_step
+ * 
+ *             for v in self.var.values():             # <<<<<<<<<<<<<<
+ *                 v.advance()
+ * 
+ */
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "values");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_1 = __Pyx_PyDict_Values(__pyx_v_self->var); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
+      __pyx_t_11 = NULL;
+    } else {
+      __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_11 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    for (;;) {
+      if (likely(!__pyx_t_11)) {
+        if (likely(PyList_CheckExact(__pyx_t_2))) {
+          if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else {
+          if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        }
+      } else {
+        __pyx_t_1 = __pyx_t_11(__pyx_t_2);
+        if (unlikely(!__pyx_t_1)) {
+          PyObject* exc_type = PyErr_Occurred();
+          if (exc_type) {
+            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+            else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
+          break;
+        }
+        __Pyx_GOTREF(__pyx_t_1);
+      }
+      __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_1);
+      __pyx_t_1 = 0;
+
+      /* "adios_mpi.pyx":752
+ * 
+ *             for v in self.var.values():
+ *                 v.advance()             # <<<<<<<<<<<<<<
+ * 
+ *         return val
+ */
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_advance); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_8 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
+        __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_5);
+        if (likely(__pyx_t_8)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+          __Pyx_INCREF(__pyx_t_8);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_5, function);
+        }
+      }
+      if (__pyx_t_8) {
+        __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      } else {
+        __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+      /* "adios_mpi.pyx":751
+ *             self.last_step = self.fp.last_step
+ * 
+ *             for v in self.var.values():             # <<<<<<<<<<<<<<
+ *                 v.advance()
+ * 
+ */
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios_mpi.pyx":754
+ *                 v.advance()
+ * 
+ *         return val             # <<<<<<<<<<<<<<
+ * 
+ *     def __getitem__(self, varname):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 754; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
   goto __pyx_L0;
+
+  /* "adios_mpi.pyx":735
+ *         printfile(self.fp)
+ * 
+ *     cpdef advance(self, int last = 0, float timeout_sec = 0.0):             # <<<<<<<<<<<<<<
+ *         """
+ *         Advance a timestep for stream reader.
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.file.nattrs.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_AddTraceback("adios_mpi.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_v);
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":507
- *     cpdef public int nvars
- *     cpdef public int nattrs
- *     cpdef public int current_step             # <<<<<<<<<<<<<<
- *     cpdef public int last_step
- *     cpdef public int endianness
- */
-
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_12current_step_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_12current_step_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_4file_8advance[] = "file.advance(self, int last=0, float timeout_sec=0.0)\n\n        Advance a timestep for stream reader.\n\n        Args:\n            last (int, optional): last timestep index (default: 0).\n            timeout_sec (float, optional): timeout seconds (default: 0.0).\n\n        Returns:\n            int: 0 if successful, non-zero otherwise.\n        ";
+static PyObject *__pyx_pw_9adios_mpi_4file_9advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_v_last;
+  float __pyx_v_timeout_sec;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_12current_step___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_last,&__pyx_n_s_timeout_sec,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_last);
+          if (value) { values[0] = value; kw_args--; }
+        }
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_timeout_sec);
+          if (value) { values[1] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    if (values[0]) {
+      __pyx_v_last = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_last == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_last = ((int)0);
+    }
+    if (values[1]) {
+      __pyx_v_timeout_sec = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_timeout_sec == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_timeout_sec = ((float)0.0);
+    }
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("advance", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_4file_8advance(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), __pyx_v_last, __pyx_v_timeout_sec);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4file_12current_step___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_4file_8advance(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, int __pyx_v_last, float __pyx_v_timeout_sec) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  struct __pyx_opt_args_9adios_mpi_4file_advance __pyx_t_2;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("advance", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->current_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2.__pyx_n = 2;
+  __pyx_t_2.last = __pyx_v_last;
+  __pyx_t_2.timeout_sec = __pyx_v_timeout_sec;
+  __pyx_t_1 = __pyx_vtabptr_9adios_mpi_file->advance(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -8230,7 +10848,7 @@ static PyObject *__pyx_pf_9adios_mpi_4file_12current_step___get__(struct __pyx_o
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.current_step.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.file.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -8238,164 +10856,557 @@ static PyObject *__pyx_pf_9adios_mpi_4file_12current_step___get__(struct __pyx_o
   return __pyx_r;
 }
 
+/* "adios_mpi.pyx":756
+ *         return val
+ * 
+ *     def __getitem__(self, varname):             # <<<<<<<<<<<<<<
+ *         """
+ *         Return Adios variable.
+ */
+
 /* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_12current_step_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_12current_step_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_4file_11__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_varname); /*proto*/
+static char __pyx_doc_9adios_mpi_4file_10__getitem__[] = "\n        Return Adios variable.\n\n        Args:\n            varname (str): variable name.\n\n        Raises:\n            KeyError: If no varname exists.\n\n        ";
+#if CYTHON_COMPILING_IN_CPYTHON
+struct wrapperbase __pyx_wrapperbase_9adios_mpi_4file_10__getitem__;
+#endif
+static PyObject *__pyx_pw_9adios_mpi_4file_11__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_varname) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_12current_step_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_10__getitem__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_varname));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_9adios_mpi_4file_12current_step_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pf_9adios_mpi_4file_10__getitem__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_varname) {
+  PyObject *__pyx_v_key_ = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  PyObject *__pyx_t_7 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->current_step = __pyx_t_1;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.file.current_step.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_INCREF(__pyx_v_varname);
 
-/* "adios_mpi.pyx":508
- *     cpdef public int nattrs
- *     cpdef public int current_step
- *     cpdef public int last_step             # <<<<<<<<<<<<<<
- *     cpdef public int endianness
- *     cpdef public int version
- */
+  /* "adios_mpi.pyx":767
+ * 
+ *         """
+ *         if not isinstance(varname, tuple):             # <<<<<<<<<<<<<<
+ *             varname = (varname,)
+ * 
+ */
+  __pyx_t_1 = PyTuple_Check(__pyx_v_varname); 
+  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
+  if (__pyx_t_2) {
 
-/* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_9last_step_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_9last_step_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_9last_step___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+    /* "adios_mpi.pyx":768
+ *         """
+ *         if not isinstance(varname, tuple):
+ *             varname = (varname,)             # <<<<<<<<<<<<<<
+ * 
+ *         if len(varname) > 1:
+ */
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(__pyx_v_varname);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_varname);
+    __Pyx_GIVEREF(__pyx_v_varname);
+    __Pyx_DECREF_SET(__pyx_v_varname, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios_mpi.pyx":770
+ *             varname = (varname,)
+ * 
+ *         if len(varname) > 1:             # <<<<<<<<<<<<<<
+ *             raise KeyError(varname)
+ * 
+ */
+  __pyx_t_4 = PyObject_Length(__pyx_v_varname); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((__pyx_t_4 > 1) != 0);
+  if (__pyx_t_2) {
 
-static PyObject *__pyx_pf_9adios_mpi_4file_9last_step___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+    /* "adios_mpi.pyx":771
+ * 
+ *         if len(varname) > 1:
+ *             raise KeyError(varname)             # <<<<<<<<<<<<<<
+ * 
+ *         for key_ in varname:
+ */
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(__pyx_v_varname);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_varname);
+    __Pyx_GIVEREF(__pyx_v_varname);
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_KeyError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "adios_mpi.pyx":773
+ *             raise KeyError(varname)
+ * 
+ *         for key_ in varname:             # <<<<<<<<<<<<<<
+ *             if not isinstance(key_, str):
+ *                 raise TypeError("Unhashable type")
+ */
+  if (likely(PyList_CheckExact(__pyx_v_varname)) || PyTuple_CheckExact(__pyx_v_varname)) {
+    __pyx_t_5 = __pyx_v_varname; __Pyx_INCREF(__pyx_t_5); __pyx_t_4 = 0;
+    __pyx_t_6 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_varname); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  for (;;) {
+    if (likely(!__pyx_t_6)) {
+      if (likely(PyList_CheckExact(__pyx_t_5))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_5)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_3 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_3 = PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_3 = PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_3 = __pyx_t_6(__pyx_t_5);
+      if (unlikely(!__pyx_t_3)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    __pyx_v_key_ = __pyx_t_3;
+    __pyx_t_3 = 0;
+
+    /* "adios_mpi.pyx":774
+ * 
+ *         for key_ in varname:
+ *             if not isinstance(key_, str):             # <<<<<<<<<<<<<<
+ *                 raise TypeError("Unhashable type")
+ * 
+ */
+    __pyx_t_2 = PyString_Check(__pyx_v_key_); 
+    __pyx_t_1 = ((!(__pyx_t_2 != 0)) != 0);
+    if (__pyx_t_1) {
+
+      /* "adios_mpi.pyx":775
+ *         for key_ in varname:
+ *             if not isinstance(key_, str):
+ *                 raise TypeError("Unhashable type")             # <<<<<<<<<<<<<<
+ * 
+ *             if key_ in self.var.keys():
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "adios_mpi.pyx":777
+ *                 raise TypeError("Unhashable type")
+ * 
+ *             if key_ in self.var.keys():             # <<<<<<<<<<<<<<
+ *                 return self.var.get(key_)
+ *             elif key_ in self.attr.keys():
+ */
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_Keys(__pyx_v_self->var); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_key_, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_2 = (__pyx_t_1 != 0);
+    if (__pyx_t_2) {
+
+      /* "adios_mpi.pyx":778
+ * 
+ *             if key_ in self.var.keys():
+ *                 return self.var.get(key_)             # <<<<<<<<<<<<<<
+ *             elif key_ in self.attr.keys():
+ *                 return self.attr.get(key_)
+ */
+      __Pyx_XDECREF(__pyx_r);
+      if (unlikely(__pyx_v_self->var == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "get");
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_t_3 = __Pyx_PyDict_GetItemDefault(__pyx_v_self->var, __pyx_v_key_, Py_None); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_r = __pyx_t_3;
+      __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      goto __pyx_L0;
+    }
+
+    /* "adios_mpi.pyx":779
+ *             if key_ in self.var.keys():
+ *                 return self.var.get(key_)
+ *             elif key_ in self.attr.keys():             # <<<<<<<<<<<<<<
+ *                 return self.attr.get(key_)
+ *             else:
+ */
+    if (unlikely(__pyx_v_self->attr == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_Keys(__pyx_v_self->attr); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_2 = (__Pyx_PySequence_Contains(__pyx_v_key_, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_1 = (__pyx_t_2 != 0);
+    if (__pyx_t_1) {
+
+      /* "adios_mpi.pyx":780
+ *                 return self.var.get(key_)
+ *             elif key_ in self.attr.keys():
+ *                 return self.attr.get(key_)             # <<<<<<<<<<<<<<
+ *             else:
+ *                 raise KeyError(key_)
+ */
+      __Pyx_XDECREF(__pyx_r);
+      if (unlikely(__pyx_v_self->attr == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "get");
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_t_3 = __Pyx_PyDict_GetItemDefault(__pyx_v_self->attr, __pyx_v_key_, Py_None); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_r = __pyx_t_3;
+      __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      goto __pyx_L0;
+    }
+    /*else*/ {
+
+      /* "adios_mpi.pyx":782
+ *                 return self.attr.get(key_)
+ *             else:
+ *                 raise KeyError(key_)             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
+ */
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_INCREF(__pyx_v_key_);
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_key_);
+      __Pyx_GIVEREF(__pyx_v_key_);
+      __pyx_t_7 = __Pyx_PyObject_Call(__pyx_builtin_KeyError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_Raise(__pyx_t_7, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "adios_mpi.pyx":773
+ *             raise KeyError(varname)
+ * 
+ *         for key_ in varname:             # <<<<<<<<<<<<<<
+ *             if not isinstance(key_, str):
+ *                 raise TypeError("Unhashable type")
+ */
+  }
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+  /* "adios_mpi.pyx":756
+ *         return val
+ * 
+ *     def __getitem__(self, varname):             # <<<<<<<<<<<<<<
+ *         """
+ *         Return Adios variable.
+ */
 
   /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.last_step.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("adios_mpi.file.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_key_);
+  __Pyx_XDECREF(__pyx_v_varname);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "adios_mpi.pyx":784
+ *                 raise KeyError(key_)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         """ Return string representation. """
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+ */
+
 /* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_9last_step_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_9last_step_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_4file_13__repr__(PyObject *__pyx_v_self); /*proto*/
+static char __pyx_doc_9adios_mpi_4file_12__repr__[] = " Return string representation. ";
+#if CYTHON_COMPILING_IN_CPYTHON
+struct wrapperbase __pyx_wrapperbase_9adios_mpi_4file_12__repr__;
+#endif
+static PyObject *__pyx_pw_9adios_mpi_4file_13__repr__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_9last_step_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4file_12__repr__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_9adios_mpi_4file_9last_step_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pf_9adios_mpi_4file_12__repr__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->last_step = __pyx_t_1;
+  __Pyx_RefNannySetupContext("__repr__", 0);
 
-  /* function exit code */
-  __pyx_r = 0;
+  /* "adios_mpi.pyx":786
+ *     def __repr__(self):
+ *         """ Return string representation. """
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "             # <<<<<<<<<<<<<<
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \
+ *                 (self.fp.path,
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "adios_mpi.pyx":788
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \
+ *                 (self.fp.path,             # <<<<<<<<<<<<<<
+ *                  self.nvars,
+ *                  self.var.keys(),
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->fp->path); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "adios_mpi.pyx":789
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \
+ *                 (self.fp.path,
+ *                  self.nvars,             # <<<<<<<<<<<<<<
+ *                  self.var.keys(),
+ *                  self.nattrs,
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->nvars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "adios_mpi.pyx":790
+ *                 (self.fp.path,
+ *                  self.nvars,
+ *                  self.var.keys(),             # <<<<<<<<<<<<<<
+ *                  self.nattrs,
+ *                  self.attr.keys(),
+ */
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_3 = __Pyx_PyDict_Keys(__pyx_v_self->var); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "adios_mpi.pyx":791
+ *                  self.nvars,
+ *                  self.var.keys(),
+ *                  self.nattrs,             # <<<<<<<<<<<<<<
+ *                  self.attr.keys(),
+ *                  self.current_step,
+ */
+  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->nattrs); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+
+  /* "adios_mpi.pyx":792
+ *                  self.var.keys(),
+ *                  self.nattrs,
+ *                  self.attr.keys(),             # <<<<<<<<<<<<<<
+ *                  self.current_step,
+ *                  self.last_step,
+ */
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 792; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_5 = __Pyx_PyDict_Keys(__pyx_v_self->attr); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 792; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+
+  /* "adios_mpi.pyx":793
+ *                  self.nattrs,
+ *                  self.attr.keys(),
+ *                  self.current_step,             # <<<<<<<<<<<<<<
+ *                  self.last_step,
+ *                  self.file_size)
+ */
+  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->current_step); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 793; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+
+  /* "adios_mpi.pyx":794
+ *                  self.attr.keys(),
+ *                  self.current_step,
+ *                  self.last_step,             # <<<<<<<<<<<<<<
+ *                  self.file_size)
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_self->last_step); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+
+  /* "adios_mpi.pyx":795
+ *                  self.current_step,
+ *                  self.last_step,
+ *                  self.file_size)             # <<<<<<<<<<<<<<
+ * 
+ * cdef class var:
+ */
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_self->file_size); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+
+  /* "adios_mpi.pyx":788
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \
+ *                 (self.fp.path,             # <<<<<<<<<<<<<<
+ *                  self.nvars,
+ *                  self.var.keys(),
+ */
+  __pyx_t_9 = PyTuple_New(8); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_9);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_4);
+  __Pyx_GIVEREF(__pyx_t_4);
+  PyTuple_SET_ITEM(__pyx_t_9, 4, __pyx_t_5);
+  __Pyx_GIVEREF(__pyx_t_5);
+  PyTuple_SET_ITEM(__pyx_t_9, 5, __pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_6);
+  PyTuple_SET_ITEM(__pyx_t_9, 6, __pyx_t_7);
+  __Pyx_GIVEREF(__pyx_t_7);
+  PyTuple_SET_ITEM(__pyx_t_9, 7, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_4 = 0;
+  __pyx_t_5 = 0;
+  __pyx_t_6 = 0;
+  __pyx_t_7 = 0;
+  __pyx_t_8 = 0;
+
+  /* "adios_mpi.pyx":787
+ *         """ Return string representation. """
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+ *                 "current_step=%r, last_step=%r, file_size=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.fp.path,
+ *                  self.nvars,
+ */
+  __pyx_t_8 = __Pyx_PyString_Format(__pyx_kp_s_AdiosFile_path_r_nvars_r_var_r_n, __pyx_t_9); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_r = __pyx_t_8;
+  __pyx_t_8 = 0;
   goto __pyx_L0;
+
+  /* "adios_mpi.pyx":784
+ *                 raise KeyError(key_)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         """ Return string representation. """
+ *         return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.file.last_step.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("adios_mpi.file.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":509
- *     cpdef public int current_step
- *     cpdef public int last_step
- *     cpdef public int endianness             # <<<<<<<<<<<<<<
- *     cpdef public int version
- *     cpdef public int file_size
+/* "adios_mpi.pyx":635
+ * 
+ *     ## Public Memeber
+ *     cpdef public dict var             # <<<<<<<<<<<<<<
+ *     cpdef public dict attr
+ * 
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_10endianness_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_10endianness_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_4file_3var_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4file_3var_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_10endianness___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+  __pyx_r = __pyx_pf_9adios_mpi_4file_3var___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4file_10endianness___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_4file_3var___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->endianness); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __Pyx_INCREF(__pyx_v_self->var);
+  __pyx_r = __pyx_v_self->var;
   goto __pyx_L0;
 
   /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.endianness.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
@@ -8403,277 +11414,41 @@ static PyObject *__pyx_pf_9adios_mpi_4file_10endianness___get__(struct __pyx_obj
 }
 
 /* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_10endianness_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_10endianness_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pw_9adios_mpi_4file_3var_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_9adios_mpi_4file_3var_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_10endianness_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __pyx_r = __pyx_pf_9adios_mpi_4file_3var_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_9adios_mpi_4file_10endianness_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_9adios_mpi_4file_3var_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->endianness = __pyx_t_1;
+  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_v_value;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->var);
+  __Pyx_DECREF(__pyx_v_self->var);
+  __pyx_v_self->var = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
   /* function exit code */
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.file.endianness.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "adios_mpi.pyx":510
- *     cpdef public int last_step
- *     cpdef public int endianness
- *     cpdef public int version             # <<<<<<<<<<<<<<
- *     cpdef public int file_size
- * 
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_7version_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_7version_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_7version___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_9adios_mpi_4file_7version___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.version.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_7version_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_7version_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_7version_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_4file_7version_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->version = __pyx_t_1;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.file.version.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "adios_mpi.pyx":511
- *     cpdef public int endianness
- *     cpdef public int version
- *     cpdef public int file_size             # <<<<<<<<<<<<<<
- * 
- *     cpdef public dict var
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_9file_size_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_9file_size_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_9file_size___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_9adios_mpi_4file_9file_size___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->file_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.file_size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_9file_size_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_9file_size_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_9file_size_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_4file_9file_size_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->file_size = __pyx_t_1;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.file.file_size.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "adios_mpi.pyx":513
- *     cpdef public int file_size
- * 
- *     cpdef public dict var             # <<<<<<<<<<<<<<
- *     cpdef public dict attr
- * 
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_3var_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_3var_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_3var___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_9adios_mpi_4file_3var___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->var);
-  __pyx_r = __pyx_v_self->var;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_3var_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_3var_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_3var_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_4file_3var_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->var);
-  __Pyx_DECREF(__pyx_v_self->var);
-  __pyx_v_self->var = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
-
-  /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.var.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.file.var.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
   __Pyx_RefNannyFinishContext();
@@ -8709,12 +11484,12 @@ static int __pyx_pf_9adios_mpi_4file_3var_4__del__(struct __pyx_obj_9adios_mpi_f
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":514
- * 
+/* "adios_mpi.pyx":636
+ *     ## Public Memeber
  *     cpdef public dict var
  *     cpdef public dict attr             # <<<<<<<<<<<<<<
  * 
- *     cpdef public bint is_stream
+ *     property name:
  */
 
 /* Python wrapper */
@@ -8767,7 +11542,7 @@ static int __pyx_pf_9adios_mpi_4file_4attr_2__set__(struct __pyx_obj_9adios_mpi_
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __pyx_v_value;
   __Pyx_INCREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
@@ -8817,91 +11592,357 @@ static int __pyx_pf_9adios_mpi_4file_4attr_4__del__(struct __pyx_obj_9adios_mpi_
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":516
- *     cpdef public dict attr
+/* "adios_mpi.pyx":825
+ *     property name:
+ *         """ The variable name. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
- *     cpdef public bint is_stream             # <<<<<<<<<<<<<<
- * 
- *     """ Initialization. Call adios_read_open and populate public members """
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_4file_9is_stream_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_4file_9is_stream_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_3var_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_3var_4name_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_9is_stream___get__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self));
+  __pyx_r = __pyx_pf_9adios_mpi_3var_4name___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_4file_9is_stream___get__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_3var_4name___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":826
+ *         """ The variable name. """
+ *         def __get__(self):
+ *             return self.name             # <<<<<<<<<<<<<<
+ * 
+ *     property varid:
+ */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_stream); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __Pyx_INCREF(__pyx_v_self->name);
+  __pyx_r = __pyx_v_self->name;
   goto __pyx_L0;
 
+  /* "adios_mpi.pyx":825
+ *     property name:
+ *         """ The variable name. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
+ * 
+ */
+
   /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.file.is_stream.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "adios_mpi.pyx":830
+ *     property varid:
+ *         """ Internal variable id. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.varid
+ * 
+ */
+
 /* Python wrapper */
-static int __pyx_pw_9adios_mpi_4file_9is_stream_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_4file_9is_stream_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_3var_5varid_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_3var_5varid_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_4file_9is_stream_2__set__(((struct __pyx_obj_9adios_mpi_file *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_3var_5varid___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_9adios_mpi_4file_9is_stream_2__set__(struct __pyx_obj_9adios_mpi_file *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pf_9adios_mpi_3var_5varid___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
+  PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->is_stream = __pyx_t_1;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":831
+ *         """ Internal variable id. """
+ *         def __get__(self):
+ *             return self.varid             # <<<<<<<<<<<<<<
+ * 
+ *     property dtype:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":830
+ *     property varid:
+ *         """ Internal variable id. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.varid
+ * 
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.var.varid.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":835
+ *     property dtype:
+ *         """ Variable type as in numpy.dtype. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_3var_5dtype_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_3var_5dtype_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_3var_5dtype___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_3var_5dtype___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":836
+ *         """ Variable type as in numpy.dtype. """
+ *         def __get__(self):
+ *             return self.dtype             # <<<<<<<<<<<<<<
+ * 
+ *     property ndim:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->dtype));
+  __pyx_r = ((PyObject *)__pyx_v_self->dtype);
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":835
+ *     property dtype:
+ *         """ Variable type as in numpy.dtype. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":840
+ *     property ndim:
+ *         """ The number of dimensions of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.ndim
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_3var_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_3var_4ndim_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_3var_4ndim___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_3var_4ndim___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":841
+ *         """ The number of dimensions of the variable. """
+ *         def __get__(self):
+ *             return self.ndim             # <<<<<<<<<<<<<<
+ * 
+ *     property dims:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
   goto __pyx_L0;
+
+  /* "adios_mpi.pyx":840
+ *     property ndim:
+ *         """ The number of dimensions of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.ndim
+ * 
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.file.is_stream.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.var.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":845
+ *     property dims:
+ *         """ The shape of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dims
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_3var_4dims_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_3var_4dims_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_3var_4dims___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_3var_4dims___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":846
+ *         """ The shape of the variable. """
+ *         def __get__(self):
+ *             return self.dims             # <<<<<<<<<<<<<<
+ * 
+ *     property nsteps:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->dims);
+  __pyx_r = __pyx_v_self->dims;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":845
+ *     property dims:
+ *         """ The shape of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dims
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":850
+ *     property nsteps:
+ *         """ The number of time steps of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nsteps
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_3var_6nsteps_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_3var_6nsteps_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_3var_6nsteps___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_3var_6nsteps___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":851
+ *         """ The number of time steps of the variable. """
+ *         def __get__(self):
+ *             return self.nsteps             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, file file, char * name):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":850
+ *     property nsteps:
+ *         """ The number of time steps of the variable. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.nsteps
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.var.nsteps.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":585
+/* "adios_mpi.pyx":853
+ *             return self.nsteps
  * 
- *     """ Initialization. Call adios_inq_var and populate public members """
  *     def __init__(self, file file, char * name):             # <<<<<<<<<<<<<<
  *         self.file = file
  *         self.vp = NULL
@@ -8938,11 +11979,11 @@ static int __pyx_pw_9adios_mpi_3var_1__init__(PyObject *__pyx_v_self, PyObject *
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -8951,17 +11992,17 @@ static int __pyx_pw_9adios_mpi_3var_1__init__(PyObject *__pyx_v_self, PyObject *
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
     __pyx_v_file = ((struct __pyx_obj_9adios_mpi_file *)values[0]);
-    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.var.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_file), __pyx_ptype_9adios_mpi_file, 1, "file", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_file), __pyx_ptype_9adios_mpi_file, 1, "file", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_9adios_mpi_3var___init__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), __pyx_v_file, __pyx_v_name);
 
   /* function exit code */
@@ -8981,13 +12022,17 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
   int __pyx_t_2;
   int __pyx_t_3;
   PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  size_t __pyx_t_7;
+  struct __pyx_opt_args_9adios_mpi_adios2npdtype __pyx_t_8;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "adios_mpi.pyx":586
- *     """ Initialization. Call adios_inq_var and populate public members """
+  /* "adios_mpi.pyx":854
+ * 
  *     def __init__(self, file file, char * name):
  *         self.file = file             # <<<<<<<<<<<<<<
  *         self.vp = NULL
@@ -8999,7 +12044,7 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
   __Pyx_DECREF(((PyObject *)__pyx_v_self->file));
   __pyx_v_self->file = __pyx_v_file;
 
-  /* "adios_mpi.pyx":587
+  /* "adios_mpi.pyx":855
  *     def __init__(self, file file, char * name):
  *         self.file = file
  *         self.vp = NULL             # <<<<<<<<<<<<<<
@@ -9008,7 +12053,7 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
  */
   __pyx_v_self->vp = NULL;
 
-  /* "adios_mpi.pyx":589
+  /* "adios_mpi.pyx":857
  *         self.vp = NULL
  * 
  *         assert self.file.fp != NULL, 'Not an open file'             # <<<<<<<<<<<<<<
@@ -9019,12 +12064,12 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
   if (unlikely(!Py_OptimizeFlag)) {
     if (unlikely(!((__pyx_v_self->file->fp != NULL) != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_file);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 589; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios_mpi.pyx":590
+  /* "adios_mpi.pyx":858
  * 
  *         assert self.file.fp != NULL, 'Not an open file'
  *         self.vp = adios_inq_var(self.file.fp, name)             # <<<<<<<<<<<<<<
@@ -9033,7 +12078,7 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
  */
   __pyx_v_self->vp = adios_inq_var(__pyx_v_self->file->fp, __pyx_v_name);
 
-  /* "adios_mpi.pyx":591
+  /* "adios_mpi.pyx":859
  *         assert self.file.fp != NULL, 'Not an open file'
  *         self.vp = adios_inq_var(self.file.fp, name)
  *         assert self.vp != NULL, 'Not a valid var'             # <<<<<<<<<<<<<<
@@ -9044,19 +12089,19 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
   if (unlikely(!Py_OptimizeFlag)) {
     if (unlikely(!((__pyx_v_self->vp != NULL) != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_a_valid_var);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios_mpi.pyx":593
+  /* "adios_mpi.pyx":861
  *         assert self.vp != NULL, 'Not a valid var'
  * 
  *         self.name = name             # <<<<<<<<<<<<<<
  *         self.varid = self.vp.varid
- *         self.type = adios2nptype(self.vp.type)
+ *         self.ndim = self.vp.ndim
  */
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __Pyx_GOTREF(__pyx_v_self->name);
@@ -9064,34 +12109,19 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
   __pyx_v_self->name = ((PyObject*)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":594
+  /* "adios_mpi.pyx":862
  * 
  *         self.name = name
  *         self.varid = self.vp.varid             # <<<<<<<<<<<<<<
- *         self.type = adios2nptype(self.vp.type)
  *         self.ndim = self.vp.ndim
+ *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
  */
   __pyx_t_2 = __pyx_v_self->vp->varid;
   __pyx_v_self->varid = __pyx_t_2;
 
-  /* "adios_mpi.pyx":595
+  /* "adios_mpi.pyx":863
  *         self.name = name
  *         self.varid = self.vp.varid
- *         self.type = adios2nptype(self.vp.type)             # <<<<<<<<<<<<<<
- *         self.ndim = self.vp.ndim
- *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
- */
-  __pyx_t_1 = ((PyObject *)__pyx_f_9adios_mpi_adios2nptype(__pyx_v_self->vp->type)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->type);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->type));
-  __pyx_v_self->type = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
-
-  /* "adios_mpi.pyx":596
- *         self.varid = self.vp.varid
- *         self.type = adios2nptype(self.vp.type)
  *         self.ndim = self.vp.ndim             # <<<<<<<<<<<<<<
  *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
  *         self.nsteps = self.vp.nsteps
@@ -9099,24 +12129,24 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
   __pyx_t_2 = __pyx_v_self->vp->ndim;
   __pyx_v_self->ndim = __pyx_t_2;
 
-  /* "adios_mpi.pyx":597
- *         self.type = adios2nptype(self.vp.type)
+  /* "adios_mpi.pyx":864
+ *         self.varid = self.vp.varid
  *         self.ndim = self.vp.ndim
  *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])             # <<<<<<<<<<<<<<
  *         self.nsteps = self.vp.nsteps
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __pyx_v_self->vp->ndim;
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
-    __pyx_t_4 = __Pyx_PyInt_From_uint64_t((__pyx_v_self->vp->dims[__pyx_v_i])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_From_uint64_t((__pyx_v_self->vp->dims[__pyx_v_i])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
-  __pyx_t_4 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_4);
@@ -9125,19 +12155,78 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
   __pyx_v_self->dims = ((PyObject*)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "adios_mpi.pyx":598
+  /* "adios_mpi.pyx":865
  *         self.ndim = self.vp.ndim
  *         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
  *         self.nsteps = self.vp.nsteps             # <<<<<<<<<<<<<<
  * 
- *     def __del__(self):
+ *         if self.vp.type == DATATYPE.string:
  */
   __pyx_t_2 = __pyx_v_self->vp->nsteps;
   __pyx_v_self->nsteps = __pyx_t_2;
 
-  /* "adios_mpi.pyx":585
+  /* "adios_mpi.pyx":867
+ *         self.nsteps = self.vp.nsteps
+ * 
+ *         if self.vp.type == DATATYPE.string:             # <<<<<<<<<<<<<<
+ *             self.dtype = adios2npdtype(self.vp.type, len(<char*> self.vp.value))
+ *         else:
+ */
+  __pyx_t_4 = PyInt_FromLong(__pyx_v_self->vp->type); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_string); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_6) {
+
+    /* "adios_mpi.pyx":868
+ * 
+ *         if self.vp.type == DATATYPE.string:
+ *             self.dtype = adios2npdtype(self.vp.type, len(<char*> self.vp.value))             # <<<<<<<<<<<<<<
+ *         else:
+ *             self.dtype = adios2npdtype(self.vp.type)
+ */
+    __pyx_t_7 = strlen(((char *)__pyx_v_self->vp->value)); 
+    __pyx_t_8.__pyx_n = 1;
+    __pyx_t_8.strlen = __pyx_t_7;
+    __pyx_t_1 = ((PyObject *)__pyx_f_9adios_mpi_adios2npdtype(__pyx_v_self->vp->type, 0, &__pyx_t_8)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __Pyx_GOTREF(__pyx_v_self->dtype);
+    __Pyx_DECREF(((PyObject *)__pyx_v_self->dtype));
+    __pyx_v_self->dtype = ((PyArray_Descr *)__pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L5;
+  }
+  /*else*/ {
+
+    /* "adios_mpi.pyx":870
+ *             self.dtype = adios2npdtype(self.vp.type, len(<char*> self.vp.value))
+ *         else:
+ *             self.dtype = adios2npdtype(self.vp.type)             # <<<<<<<<<<<<<<
+ * 
+ *     def __del__(self):
+ */
+    __pyx_t_1 = ((PyObject *)__pyx_f_9adios_mpi_adios2npdtype(__pyx_v_self->vp->type, 0, NULL)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __Pyx_GOTREF(__pyx_v_self->dtype);
+    __Pyx_DECREF(((PyObject *)__pyx_v_self->dtype));
+    __pyx_v_self->dtype = ((PyArray_Descr *)__pyx_t_1);
+    __pyx_t_1 = 0;
+  }
+  __pyx_L5:;
+
+  /* "adios_mpi.pyx":853
+ *             return self.nsteps
  * 
- *     """ Initialization. Call adios_inq_var and populate public members """
  *     def __init__(self, file file, char * name):             # <<<<<<<<<<<<<<
  *         self.file = file
  *         self.vp = NULL
@@ -9149,6 +12238,7 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
   __Pyx_AddTraceback("adios_mpi.var.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
@@ -9156,8 +12246,8 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":600
- *         self.nsteps = self.vp.nsteps
+/* "adios_mpi.pyx":872
+ *             self.dtype = adios2npdtype(self.vp.type)
  * 
  *     def __del__(self):             # <<<<<<<<<<<<<<
  *         self.close()
@@ -9166,6 +12256,7 @@ static int __pyx_pf_9adios_mpi_3var___init__(struct __pyx_obj_9adios_mpi_var *__
 
 /* Python wrapper */
 static PyObject *__pyx_pw_9adios_mpi_3var_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_9adios_mpi_3var_2__del__[] = "var.__del__(self)";
 static PyObject *__pyx_pw_9adios_mpi_3var_3__del__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
@@ -9186,19 +12277,19 @@ static PyObject *__pyx_pf_9adios_mpi_3var_2__del__(struct __pyx_obj_9adios_mpi_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__del__", 0);
 
-  /* "adios_mpi.pyx":601
+  /* "adios_mpi.pyx":873
  * 
  *     def __del__(self):
  *         self.close()             # <<<<<<<<<<<<<<
  * 
- *     """ Call adios_free_varinfo """
+ *     cpdef close(self):
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_9adios_mpi_var *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_9adios_mpi_var *)__pyx_v_self->__pyx_vtab)->close(__pyx_v_self, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":600
- *         self.nsteps = self.vp.nsteps
+  /* "adios_mpi.pyx":872
+ *             self.dtype = adios2npdtype(self.vp.type)
  * 
  *     def __del__(self):             # <<<<<<<<<<<<<<
  *         self.close()
@@ -9218,12 +12309,12 @@ static PyObject *__pyx_pf_9adios_mpi_3var_2__del__(struct __pyx_obj_9adios_mpi_v
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":604
+/* "adios_mpi.pyx":875
+ *         self.close()
  * 
- *     """ Call adios_free_varinfo """
  *     cpdef close(self):             # <<<<<<<<<<<<<<
+ *         """ Close and free variable information """
  *         assert self.vp != NULL, 'Not an open var'
- *         adios_free_varinfo(self.vp)
  */
 
 static PyObject *__pyx_pw_9adios_mpi_3var_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
@@ -9242,7 +12333,7 @@ static PyObject *__pyx_f_9adios_mpi_3var_close(struct __pyx_obj_9adios_mpi_var *
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overridden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_3var_5close)) {
       __Pyx_XDECREF(__pyx_r);
@@ -9258,10 +12349,10 @@ static PyObject *__pyx_f_9adios_mpi_3var_close(struct __pyx_obj_9adios_mpi_var *
         }
       }
       if (__pyx_t_4) {
-        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       } else {
-        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -9273,9 +12364,9 @@ static PyObject *__pyx_f_9adios_mpi_3var_close(struct __pyx_obj_9adios_mpi_var *
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "adios_mpi.pyx":605
- *     """ Call adios_free_varinfo """
+  /* "adios_mpi.pyx":877
  *     cpdef close(self):
+ *         """ Close and free variable information """
  *         assert self.vp != NULL, 'Not an open var'             # <<<<<<<<<<<<<<
  *         adios_free_varinfo(self.vp)
  *         self.vp = NULL
@@ -9284,13 +12375,13 @@ static PyObject *__pyx_f_9adios_mpi_3var_close(struct __pyx_obj_9adios_mpi_var *
   if (unlikely(!Py_OptimizeFlag)) {
     if (unlikely(!((__pyx_v_self->vp != NULL) != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_var);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios_mpi.pyx":606
- *     cpdef close(self):
+  /* "adios_mpi.pyx":878
+ *         """ Close and free variable information """
  *         assert self.vp != NULL, 'Not an open var'
  *         adios_free_varinfo(self.vp)             # <<<<<<<<<<<<<<
  *         self.vp = NULL
@@ -9298,21 +12389,21 @@ static PyObject *__pyx_f_9adios_mpi_3var_close(struct __pyx_obj_9adios_mpi_var *
  */
   adios_free_varinfo(__pyx_v_self->vp);
 
-  /* "adios_mpi.pyx":607
+  /* "adios_mpi.pyx":879
  *         assert self.vp != NULL, 'Not an open var'
  *         adios_free_varinfo(self.vp)
  *         self.vp = NULL             # <<<<<<<<<<<<<<
  * 
- *     """ Call adios_schedule_read and adios_perform_reads """
+ *     cpdef advance(self):
  */
   __pyx_v_self->vp = NULL;
 
-  /* "adios_mpi.pyx":604
+  /* "adios_mpi.pyx":875
+ *         self.close()
  * 
- *     """ Call adios_free_varinfo """
  *     cpdef close(self):             # <<<<<<<<<<<<<<
+ *         """ Close and free variable information """
  *         assert self.vp != NULL, 'Not an open var'
- *         adios_free_varinfo(self.vp)
  */
 
   /* function exit code */
@@ -9333,6 +12424,7 @@ static PyObject *__pyx_f_9adios_mpi_3var_close(struct __pyx_obj_9adios_mpi_var *
 
 /* Python wrapper */
 static PyObject *__pyx_pw_9adios_mpi_3var_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_9adios_mpi_3var_4close[] = "var.close(self)\n Close and free variable information ";
 static PyObject *__pyx_pw_9adios_mpi_3var_5close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
@@ -9353,7 +12445,7 @@ static PyObject *__pyx_pf_9adios_mpi_3var_4close(struct __pyx_obj_9adios_mpi_var
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("close", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_9adios_mpi_3var_close(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_9adios_mpi_3var_close(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -9370,40 +12462,199 @@ static PyObject *__pyx_pf_9adios_mpi_3var_4close(struct __pyx_obj_9adios_mpi_var
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":610
+/* "adios_mpi.pyx":881
+ *         self.vp = NULL
  * 
- *     """ Call adios_schedule_read and adios_perform_reads """
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):             # <<<<<<<<<<<<<<
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):
+ *     cpdef advance(self):             # <<<<<<<<<<<<<<
+ *         """ Update variable information after the stream advanced """
+ *         self.vp = adios_inq_var(self.file.fp, self.name)
  */
 
-static PyObject *__pyx_pw_9adios_mpi_3var_7read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_3var_read *__pyx_optional_args) {
-  PyObject *__pyx_v_offset = ((PyObject*)__pyx_empty_tuple);
-  PyObject *__pyx_v_count = ((PyObject*)__pyx_empty_tuple);
-  PyObject *__pyx_v_from_steps = ((PyObject *)__pyx_int_0);
-  PyObject *__pyx_v_nsteps = ((PyObject *)__pyx_int_1);
-  PyObject *__pyx_v_lshape = 0;
-  PyArrayObject *__pyx_v_npshape = 0;
-  PyArrayObject *__pyx_v_npoffset = 0;
-  PyArrayObject *__pyx_v_npcount = 0;
-  PyObject *__pyx_v_shape = NULL;
-  PyArrayObject *__pyx_v_var = 0;
-  ADIOS_SELECTION *__pyx_v_sel;
-  int __pyx_v_i;
+static PyObject *__pyx_pw_9adios_mpi_3var_7advance(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_3var_advance(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, int __pyx_skip_dispatch) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
   PyObject *__pyx_t_4 = NULL;
-  Py_ssize_t __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  int __pyx_t_9;
+  char const *__pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("advance", 0);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_3var_7advance)) {
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_3, function);
+        }
+      }
+      if (__pyx_t_4) {
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      } else {
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_2;
+      __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "adios_mpi.pyx":883
+ *     cpdef advance(self):
+ *         """ Update variable information after the stream advanced """
+ *         self.vp = adios_inq_var(self.file.fp, self.name)             # <<<<<<<<<<<<<<
+ *         assert self.vp != NULL, 'Not a valid var'
+ *         self.nsteps = self.vp.nsteps
+ */
+  __pyx_t_5 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_self->vp = adios_inq_var(__pyx_v_self->file->fp, __pyx_t_5);
+
+  /* "adios_mpi.pyx":884
+ *         """ Update variable information after the stream advanced """
+ *         self.vp = adios_inq_var(self.file.fp, self.name)
+ *         assert self.vp != NULL, 'Not a valid var'             # <<<<<<<<<<<<<<
+ *         self.nsteps = self.vp.nsteps
+ * 
+ */
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(!Py_OptimizeFlag)) {
+    if (unlikely(!((__pyx_v_self->vp != NULL) != 0))) {
+      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_a_valid_var);
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+  }
+  #endif
+
+  /* "adios_mpi.pyx":885
+ *         self.vp = adios_inq_var(self.file.fp, self.name)
+ *         assert self.vp != NULL, 'Not a valid var'
+ *         self.nsteps = self.vp.nsteps             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):
+ */
+  __pyx_t_6 = __pyx_v_self->vp->nsteps;
+  __pyx_v_self->nsteps = __pyx_t_6;
+
+  /* "adios_mpi.pyx":881
+ *         self.vp = NULL
+ * 
+ *     cpdef advance(self):             # <<<<<<<<<<<<<<
+ *         """ Update variable information after the stream advanced """
+ *         self.vp = adios_inq_var(self.file.fp, self.name)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios_mpi.var.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_3var_7advance(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_9adios_mpi_3var_6advance[] = "var.advance(self)\n Update variable information after the stream advanced ";
+static PyObject *__pyx_pw_9adios_mpi_3var_7advance(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_3var_6advance(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_3var_6advance(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("advance", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_9adios_mpi_3var_advance(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.var.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":887
+ *         self.nsteps = self.vp.nsteps
+ * 
+ *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):             # <<<<<<<<<<<<<<
+ *         """ Perform read.
+ * 
+ */
+
+static PyObject *__pyx_pw_9adios_mpi_3var_9read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_3var_read *__pyx_optional_args) {
+  PyObject *__pyx_v_offset = ((PyObject*)__pyx_empty_tuple);
+  PyObject *__pyx_v_count = ((PyObject*)__pyx_empty_tuple);
+  PyObject *__pyx_v_from_steps = ((PyObject *)Py_None);
+  PyObject *__pyx_v_nsteps = ((PyObject *)Py_None);
+  PyObject *__pyx_v_fill = ((PyObject *)__pyx_int_0);
+  PyObject *__pyx_v_lshape = 0;
+  PyArrayObject *__pyx_v_npshape = 0;
+  PyArrayObject *__pyx_v_npoffset = 0;
+  PyArrayObject *__pyx_v_npcount = 0;
+  PyObject *__pyx_v_shape = NULL;
+  PyArrayObject *__pyx_v_var = 0;
+  ADIOS_SELECTION *__pyx_v_sel;
+  int __pyx_v_i;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  Py_ssize_t __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_t_9;
   int __pyx_t_10;
+  int __pyx_t_11;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -9417,18 +12668,23 @@ static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *_
           __pyx_v_from_steps = __pyx_optional_args->from_steps;
           if (__pyx_optional_args->__pyx_n > 3) {
             __pyx_v_nsteps = __pyx_optional_args->nsteps;
+            if (__pyx_optional_args->__pyx_n > 4) {
+              __pyx_v_fill = __pyx_optional_args->fill;
+            }
           }
         }
       }
     }
   }
+  __Pyx_INCREF(__pyx_v_from_steps);
+  __Pyx_INCREF(__pyx_v_nsteps);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overridden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_3var_7read)) {
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_3var_9read)) {
       __Pyx_XDECREF(__pyx_r);
       __Pyx_INCREF(__pyx_t_1);
       __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
@@ -9443,7 +12699,7 @@ static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *_
           __pyx_t_5 = 1;
         }
       }
-      __pyx_t_6 = PyTuple_New(4+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyTuple_New(5+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       if (__pyx_t_4) {
         PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = NULL;
@@ -9460,7 +12716,10 @@ static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *_
       __Pyx_INCREF(__pyx_v_nsteps);
       PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_5, __pyx_v_nsteps);
       __Pyx_GIVEREF(__pyx_v_nsteps);
-      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_INCREF(__pyx_v_fill);
+      PyTuple_SET_ITEM(__pyx_t_6, 4+__pyx_t_5, __pyx_v_fill);
+      __Pyx_GIVEREF(__pyx_v_fill);
+      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -9472,117 +12731,192 @@ static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "adios_mpi.pyx":611
- *     """ Call adios_schedule_read and adios_perform_reads """
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):
- *         assert self.type is not None, 'Data type is not supported yet'             # <<<<<<<<<<<<<<
- *         if (self.nsteps > 0):
- *             assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'
+  /* "adios_mpi.pyx":934
+ * 
+ *         """
+ *         if from_steps is None:             # <<<<<<<<<<<<<<
+ *             from_steps = 0 ##self.file.current_step
+ * 
+ */
+  __pyx_t_7 = (__pyx_v_from_steps == Py_None);
+  __pyx_t_8 = (__pyx_t_7 != 0);
+  if (__pyx_t_8) {
+
+    /* "adios_mpi.pyx":935
+ *         """
+ *         if from_steps is None:
+ *             from_steps = 0 ##self.file.current_step             # <<<<<<<<<<<<<<
+ * 
+ *         if nsteps is None:
+ */
+    __Pyx_INCREF(__pyx_int_0);
+    __Pyx_DECREF_SET(__pyx_v_from_steps, __pyx_int_0);
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios_mpi.pyx":937
+ *             from_steps = 0 ##self.file.current_step
+ * 
+ *         if nsteps is None:             # <<<<<<<<<<<<<<
+ *             nsteps = self.file.last_step - from_steps + 1
+ * 
+ */
+  __pyx_t_8 = (__pyx_v_nsteps == Py_None);
+  __pyx_t_7 = (__pyx_t_8 != 0);
+  if (__pyx_t_7) {
+
+    /* "adios_mpi.pyx":938
+ * 
+ *         if nsteps is None:
+ *             nsteps = self.file.last_step - from_steps + 1             # <<<<<<<<<<<<<<
+ * 
+ *         assert self.dtype is not None, 'Data type is not supported yet'
+ */
+    __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->file->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_v_from_steps); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF_SET(__pyx_v_nsteps, __pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L4;
+  }
+  __pyx_L4:;
+
+  /* "adios_mpi.pyx":940
+ *             nsteps = self.file.last_step - from_steps + 1
+ * 
+ *         assert self.dtype is not None, 'Data type is not supported yet'             # <<<<<<<<<<<<<<
+ *         if (self.nsteps > 0) and (from_steps + nsteps > self.nsteps):
+ *             raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))
  */
   #ifndef CYTHON_WITHOUT_ASSERTIONS
   if (unlikely(!Py_OptimizeFlag)) {
-    __pyx_t_7 = (__pyx_v_self->type != ((PyObject*)Py_None));
+    __pyx_t_7 = (((PyObject *)__pyx_v_self->dtype) != Py_None);
     if (unlikely(!(__pyx_t_7 != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Data_type_is_not_supported_yet);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 940; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios_mpi.pyx":612
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):             # <<<<<<<<<<<<<<
- *             assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'
+  /* "adios_mpi.pyx":941
+ * 
+ *         assert self.dtype is not None, 'Data type is not supported yet'
+ *         if (self.nsteps > 0) and (from_steps + nsteps > self.nsteps):             # <<<<<<<<<<<<<<
+ *             raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))
  * 
  */
-  __pyx_t_7 = ((__pyx_v_self->nsteps > 0) != 0);
+  __pyx_t_8 = ((__pyx_v_self->nsteps > 0) != 0);
+  if (__pyx_t_8) {
+  } else {
+    __pyx_t_7 = __pyx_t_8;
+    goto __pyx_L6_bool_binop_done;
+  }
+  __pyx_t_1 = PyNumber_Add(__pyx_v_from_steps, __pyx_v_nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 941; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 941; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 941; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 941; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_7 = __pyx_t_8;
+  __pyx_L6_bool_binop_done:;
   if (__pyx_t_7) {
 
-    /* "adios_mpi.pyx":613
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):
- *             assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'             # <<<<<<<<<<<<<<
+    /* "adios_mpi.pyx":942
+ *         assert self.dtype is not None, 'Data type is not supported yet'
+ *         if (self.nsteps > 0) and (from_steps + nsteps > self.nsteps):
+ *             raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))             # <<<<<<<<<<<<<<
  * 
  *         cdef list lshape = [self.vp.dims[i] for i in range(self.vp.ndim)]
  */
-    #ifndef CYTHON_WITHOUT_ASSERTIONS
-    if (unlikely(!Py_OptimizeFlag)) {
-      __pyx_t_1 = PyNumber_Add(__pyx_v_from_steps, __pyx_v_nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (unlikely(!__pyx_t_7)) {
-        PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Step_index_is_out_of_range);
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-    }
-    #endif
-    goto __pyx_L3;
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(__pyx_v_from_steps);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_steps);
+    __Pyx_GIVEREF(__pyx_v_from_steps);
+    __Pyx_INCREF(__pyx_v_nsteps);
+    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_nsteps);
+    __Pyx_GIVEREF(__pyx_v_nsteps);
+    __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_Step_index_is_out_of_range_from, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L3:;
 
-  /* "adios_mpi.pyx":615
- *             assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'
+  /* "adios_mpi.pyx":944
+ *             raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))
  * 
  *         cdef list lshape = [self.vp.dims[i] for i in range(self.vp.ndim)]             # <<<<<<<<<<<<<<
  *         cdef np.ndarray npshape = np.array(lshape, dtype=np.int64)
  * 
  */
-  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_8 = __pyx_v_self->vp->ndim;
-  for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
-    __pyx_v_i = __pyx_t_9;
-    __pyx_t_2 = __Pyx_PyInt_From_uint64_t((__pyx_v_self->vp->dims[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 944; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __pyx_v_self->vp->ndim;
+  for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
+    __pyx_v_i = __pyx_t_10;
+    __pyx_t_3 = __Pyx_PyInt_From_uint64_t((__pyx_v_self->vp->dims[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 944; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 944; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
-  __pyx_v_lshape = ((PyObject*)__pyx_t_3);
-  __pyx_t_3 = 0;
+  __pyx_v_lshape = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":616
+  /* "adios_mpi.pyx":945
  * 
  *         cdef list lshape = [self.vp.dims[i] for i in range(self.vp.ndim)]
  *         cdef np.ndarray npshape = np.array(lshape, dtype=np.int64)             # <<<<<<<<<<<<<<
  * 
  *         cdef np.ndarray npoffset
  */
-  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_lshape);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_lshape);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_lshape);
   __Pyx_GIVEREF(__pyx_v_lshape);
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_int64); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_int64); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_npshape = ((PyArrayObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "adios_mpi.pyx":619
+  /* "adios_mpi.pyx":948
  * 
  *         cdef np.ndarray npoffset
  *         if len(offset) == 0:             # <<<<<<<<<<<<<<
@@ -9591,98 +12925,98 @@ static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *_
  */
   if (unlikely(__pyx_v_offset == Py_None)) {
     PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 948; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_t_5 = PyTuple_GET_SIZE(__pyx_v_offset); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyTuple_GET_SIZE(__pyx_v_offset); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 948; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_7 = ((__pyx_t_5 == 0) != 0);
   if (__pyx_t_7) {
 
-    /* "adios_mpi.pyx":620
+    /* "adios_mpi.pyx":949
  *         cdef np.ndarray npoffset
  *         if len(offset) == 0:
  *             npoffset = npshape.copy()             # <<<<<<<<<<<<<<
  *             npoffset.fill(0)
  *         else:
  */
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_npshape), __pyx_n_s_copy); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_npshape), __pyx_n_s_copy); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_3 = NULL;
+    __pyx_t_2 = NULL;
     if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
-      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
-      if (likely(__pyx_t_3)) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+      if (likely(__pyx_t_2)) {
         PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
-        __Pyx_INCREF(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_2);
         __Pyx_INCREF(function);
         __Pyx_DECREF_SET(__pyx_t_1, function);
       }
     }
-    if (__pyx_t_3) {
-      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (__pyx_t_2) {
+      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     } else {
-      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_npoffset = ((PyArrayObject *)__pyx_t_4);
     __pyx_t_4 = 0;
 
-    /* "adios_mpi.pyx":621
+    /* "adios_mpi.pyx":950
  *         if len(offset) == 0:
  *             npoffset = npshape.copy()
  *             npoffset.fill(0)             # <<<<<<<<<<<<<<
  *         else:
  *             npoffset = np.array(offset, dtype=np.int64)
  */
-    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_npoffset), __pyx_n_s_fill); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 621; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_npoffset), __pyx_n_s_fill); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 621; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L10;
   }
   /*else*/ {
 
-    /* "adios_mpi.pyx":623
+    /* "adios_mpi.pyx":952
  *             npoffset.fill(0)
  *         else:
  *             npoffset = np.array(offset, dtype=np.int64)             # <<<<<<<<<<<<<<
  * 
  *         cdef np.ndarray npcount
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_offset);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_offset);
     __Pyx_GIVEREF(__pyx_v_offset);
-    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_int64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_npoffset = ((PyArrayObject *)__pyx_t_6);
     __pyx_t_6 = 0;
   }
-  __pyx_L6:;
+  __pyx_L10:;
 
-  /* "adios_mpi.pyx":626
+  /* "adios_mpi.pyx":955
  * 
  *         cdef np.ndarray npcount
  *         if len(count) == 0:             # <<<<<<<<<<<<<<
@@ -9691,258 +13025,350 @@ static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *_
  */
   if (unlikely(__pyx_v_count == Py_None)) {
     PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 955; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_t_5 = PyTuple_GET_SIZE(__pyx_v_count); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyTuple_GET_SIZE(__pyx_v_count); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 955; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_7 = ((__pyx_t_5 == 0) != 0);
   if (__pyx_t_7) {
 
-    /* "adios_mpi.pyx":627
+    /* "adios_mpi.pyx":956
  *         cdef np.ndarray npcount
  *         if len(count) == 0:
  *             npcount = npshape - npoffset             # <<<<<<<<<<<<<<
  *         else:
  *             npcount = np.array(count, dtype=np.int64)
  */
-    __pyx_t_6 = PyNumber_Subtract(((PyObject *)__pyx_v_npshape), ((PyObject *)__pyx_v_npoffset)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Subtract(((PyObject *)__pyx_v_npshape), ((PyObject *)__pyx_v_npoffset)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_npcount = ((PyArrayObject *)__pyx_t_6);
     __pyx_t_6 = 0;
-    goto __pyx_L7;
+    goto __pyx_L11;
   }
   /*else*/ {
 
-    /* "adios_mpi.pyx":629
+    /* "adios_mpi.pyx":958
  *             npcount = npshape - npoffset
  *         else:
  *             npcount = np.array(count, dtype=np.int64)             # <<<<<<<<<<<<<<
  * 
- *         assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'
+ *         if npshape.ndim != npoffset.ndim:
  */
-    __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_INCREF(__pyx_v_count);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_count);
     __Pyx_GIVEREF(__pyx_v_count);
-    __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int64); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int64); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_npcount = ((PyArrayObject *)__pyx_t_2);
-    __pyx_t_2 = 0;
+    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_npcount = ((PyArrayObject *)__pyx_t_3);
+    __pyx_t_3 = 0;
   }
-  __pyx_L7:;
+  __pyx_L11:;
 
-  /* "adios_mpi.pyx":631
+  /* "adios_mpi.pyx":960
  *             npcount = np.array(count, dtype=np.int64)
  * 
- *         assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'             # <<<<<<<<<<<<<<
- *         assert npshape.ndim == npcount.ndim, 'Count dimension mismatch.'
- *         assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'
+ *         if npshape.ndim != npoffset.ndim:             # <<<<<<<<<<<<<<
+ *             raise IndexError('Offset dimension mismatch (offset dim: %r)' % (npoffset.ndim))
+ * 
  */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_npshape->nd == __pyx_v_npoffset->nd) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Offset_dimension_mismatch);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 631; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-  }
-  #endif
+  __pyx_t_7 = ((__pyx_v_npshape->nd != __pyx_v_npoffset->nd) != 0);
+  if (__pyx_t_7) {
 
-  /* "adios_mpi.pyx":632
+    /* "adios_mpi.pyx":961
  * 
- *         assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'
- *         assert npshape.ndim == npcount.ndim, 'Count dimension mismatch.'             # <<<<<<<<<<<<<<
- *         assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'
+ *         if npshape.ndim != npoffset.ndim:
+ *             raise IndexError('Offset dimension mismatch (offset dim: %r)' % (npoffset.ndim))             # <<<<<<<<<<<<<<
  * 
+ *         if npshape.ndim != npcount.ndim:
  */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    if (unlikely(!((__pyx_v_npshape->nd == __pyx_v_npcount->nd) != 0))) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Count_dimension_mismatch);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
+    __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_npoffset->nd); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Offset_dimension_mismatch_offset, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  #endif
 
-  /* "adios_mpi.pyx":633
- *         assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'
- *         assert npshape.ndim == npcount.ndim, 'Count dimension mismatch.'
- *         assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":963
+ *             raise IndexError('Offset dimension mismatch (offset dim: %r)' % (npoffset.ndim))
+ * 
+ *         if npshape.ndim != npcount.ndim:             # <<<<<<<<<<<<<<
+ *             raise IndexError('Count dimension mismatch (count dim: %r)' % (npcount.ndim))
  * 
- *         shape = list(npcount)
  */
-  #ifndef CYTHON_WITHOUT_ASSERTIONS
-  if (unlikely(!Py_OptimizeFlag)) {
-    __pyx_t_1 = PyNumber_Subtract(((PyObject *)__pyx_v_npshape), ((PyObject *)__pyx_v_npoffset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_1, ((PyObject *)__pyx_v_npcount), Py_GE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = ((__pyx_v_npshape->nd != __pyx_v_npcount->nd) != 0);
+  if (__pyx_t_7) {
+
+    /* "adios_mpi.pyx":964
+ * 
+ *         if npshape.ndim != npcount.ndim:
+ *             raise IndexError('Count dimension mismatch (count dim: %r)' % (npcount.ndim))             # <<<<<<<<<<<<<<
+ * 
+ *         if (npshape < npcount + npoffset).any():
+ */
+    __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_npcount->nd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_Count_dimension_mismatch_count_d, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_all); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = NULL;
-    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
-      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
-      if (likely(__pyx_t_6)) {
-        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
-        __Pyx_INCREF(__pyx_t_6);
-        __Pyx_INCREF(function);
-        __Pyx_DECREF_SET(__pyx_t_1, function);
-      }
-    }
-    if (__pyx_t_6) {
-      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    } else {
-      __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-    __Pyx_GOTREF(__pyx_t_2);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_3);
+    __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (unlikely(!__pyx_t_7)) {
-      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Count_is_larger_than_shape);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "adios_mpi.pyx":966
+ *             raise IndexError('Count dimension mismatch (count dim: %r)' % (npcount.ndim))
+ * 
+ *         if (npshape < npcount + npoffset).any():             # <<<<<<<<<<<<<<
+ *             raise IndexError('Requested is larger than the shape.')
+ * 
+ */
+  __pyx_t_1 = PyNumber_Add(((PyObject *)__pyx_v_npcount), ((PyObject *)__pyx_v_npoffset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_6 = PyObject_RichCompare(((PyObject *)__pyx_v_npshape), __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_any); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_6)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
     }
   }
-  #endif
+  if (__pyx_t_6) {
+    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  } else {
+    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (__pyx_t_7) {
+
+    /* "adios_mpi.pyx":967
+ * 
+ *         if (npshape < npcount + npoffset).any():
+ *             raise IndexError('Requested is larger than the shape.')             # <<<<<<<<<<<<<<
+ * 
+ *         shape = list(npcount)
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
 
-  /* "adios_mpi.pyx":635
- *         assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'
+  /* "adios_mpi.pyx":969
+ *             raise IndexError('Requested is larger than the shape.')
  * 
  *         shape = list(npcount)             # <<<<<<<<<<<<<<
  *         if (nsteps > 1):
  *             shape.insert(0, nsteps)
  */
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_v_npcount));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_npcount));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_npcount));
-  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyList_Type))), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_v_shape = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+  __pyx_t_3 = PySequence_List(((PyObject *)__pyx_v_npcount)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_shape = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-  /* "adios_mpi.pyx":636
+  /* "adios_mpi.pyx":970
  * 
  *         shape = list(npcount)
  *         if (nsteps > 1):             # <<<<<<<<<<<<<<
  *             shape.insert(0, nsteps)
- *         cdef np.ndarray var = np.zeros(shape, dtype=self.type)
+ *         cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_nsteps, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_nsteps, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (__pyx_t_7) {
 
-    /* "adios_mpi.pyx":637
+    /* "adios_mpi.pyx":971
  *         shape = list(npcount)
  *         if (nsteps > 1):
  *             shape.insert(0, nsteps)             # <<<<<<<<<<<<<<
- *         cdef np.ndarray var = np.zeros(shape, dtype=self.type)
+ *         cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)
  * 
  */
-    __pyx_t_10 = PyList_Insert(__pyx_v_shape, 0, __pyx_v_nsteps); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L8;
+    __pyx_t_11 = PyList_Insert(__pyx_v_shape, 0, __pyx_v_nsteps); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L15;
   }
-  __pyx_L8:;
+  __pyx_L15:;
 
-  /* "adios_mpi.pyx":638
+  /* "adios_mpi.pyx":972
  *         if (nsteps > 1):
  *             shape.insert(0, nsteps)
- *         cdef np.ndarray var = np.zeros(shape, dtype=self.type)             # <<<<<<<<<<<<<<
+ *         cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)             # <<<<<<<<<<<<<<
  * 
- *         cdef ADIOS_SELECTION * sel
+ *         if len(shape) > 0:
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_v_shape);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_shape);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_shape);
   __Pyx_GIVEREF(__pyx_v_shape);
-  __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, ((PyObject *)__pyx_v_self->type)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, ((PyObject *)__pyx_v_self->dtype)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_var = ((PyArrayObject *)__pyx_t_3);
-  __pyx_t_3 = 0;
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_var = ((PyArrayObject *)__pyx_t_2);
+  __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":641
+  /* "adios_mpi.pyx":974
+ *         cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)
+ * 
+ *         if len(shape) > 0:             # <<<<<<<<<<<<<<
+ *             var[:] = fill
+ * 
+ */
+  __pyx_t_5 = PyList_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = ((__pyx_t_5 > 0) != 0);
+  if (__pyx_t_7) {
+
+    /* "adios_mpi.pyx":975
+ * 
+ *         if len(shape) > 0:
+ *             var[:] = fill             # <<<<<<<<<<<<<<
+ * 
+ *         cdef ADIOS_SELECTION * sel
+ */
+    if (__Pyx_PyObject_SetSlice(((PyObject *)__pyx_v_var), __pyx_v_fill, 0, 0, NULL, NULL, &__pyx_slice__16, 0, 0, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L16;
+  }
+  __pyx_L16:;
+
+  /* "adios_mpi.pyx":978
  * 
  *         cdef ADIOS_SELECTION * sel
  *         sel = adios_selection_boundingbox (self.vp.ndim, <uint64_t *> npoffset.data, <uint64_t *> npcount.data)             # <<<<<<<<<<<<<<
  * 
- *         adios_schedule_read_byid (self.file.fp, sel, self.vp.varid, from_steps, nsteps, <void *> var.data)
+ *         ##print 'npoffset', npoffset
  */
   __pyx_v_sel = adios_selection_boundingbox(__pyx_v_self->vp->ndim, ((uint64_t *)__pyx_v_npoffset->data), ((uint64_t *)__pyx_v_npcount->data));
 
-  /* "adios_mpi.pyx":643
- *         sel = adios_selection_boundingbox (self.vp.ndim, <uint64_t *> npoffset.data, <uint64_t *> npcount.data)
+  /* "adios_mpi.pyx":983
+ *         ##print 'npcount', npcount
  * 
  *         adios_schedule_read_byid (self.file.fp, sel, self.vp.varid, from_steps, nsteps, <void *> var.data)             # <<<<<<<<<<<<<<
  *         adios_perform_reads(self.file.fp, 1)
  * 
  */
-  __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_v_from_steps); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_nsteps); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  adios_schedule_read_byid(__pyx_v_self->file->fp, __pyx_v_sel, __pyx_v_self->vp->varid, __pyx_t_8, __pyx_t_9, ((void *)__pyx_v_var->data));
+  __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_from_steps); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_v_nsteps); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  adios_schedule_read_byid(__pyx_v_self->file->fp, __pyx_v_sel, __pyx_v_self->vp->varid, __pyx_t_9, __pyx_t_10, ((void *)__pyx_v_var->data));
 
-  /* "adios_mpi.pyx":644
+  /* "adios_mpi.pyx":984
  * 
  *         adios_schedule_read_byid (self.file.fp, sel, self.vp.varid, from_steps, nsteps, <void *> var.data)
  *         adios_perform_reads(self.file.fp, 1)             # <<<<<<<<<<<<<<
  * 
- *         return var
+ *         ## Try not to return as scalar to be consistent
  */
   adios_perform_reads(__pyx_v_self->file->fp, 1);
 
-  /* "adios_mpi.pyx":646
- *         adios_perform_reads(self.file.fp, 1)
+  /* "adios_mpi.pyx":991
+ *         ##else:
+ *         ##    return var
+ *         return np.squeeze(var)             # <<<<<<<<<<<<<<
  * 
- *         return var             # <<<<<<<<<<<<<<
- * 
- *     """ Print self """
+ *     cpdef printself(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_var));
-  __pyx_r = ((PyObject *)__pyx_v_var);
+  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_squeeze); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_6)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+    }
+  }
+  if (!__pyx_t_6) {
+    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, ((PyObject *)__pyx_v_var)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+  } else {
+    __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
+    __Pyx_INCREF(((PyObject *)__pyx_v_var));
+    PyTuple_SET_ITEM(__pyx_t_1, 0+1, ((PyObject *)__pyx_v_var));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_var));
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":610
+  /* "adios_mpi.pyx":887
+ *         self.nsteps = self.vp.nsteps
+ * 
+ *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):             # <<<<<<<<<<<<<<
+ *         """ Perform read.
  * 
- *     """ Call adios_schedule_read and adios_perform_reads """
- *     cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):             # <<<<<<<<<<<<<<
- *         assert self.type is not None, 'Data type is not supported yet'
- *         if (self.nsteps > 0):
  */
 
   /* function exit code */
@@ -9961,18 +13387,22 @@ static PyObject *__pyx_f_9adios_mpi_3var_read(struct __pyx_obj_9adios_mpi_var *_
   __Pyx_XDECREF((PyObject *)__pyx_v_npcount);
   __Pyx_XDECREF(__pyx_v_shape);
   __Pyx_XDECREF((PyObject *)__pyx_v_var);
+  __Pyx_XDECREF(__pyx_v_from_steps);
+  __Pyx_XDECREF(__pyx_v_nsteps);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_3var_7read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_3var_7read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_9adios_mpi_3var_9read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_3var_8read[] = "var.read(self, tuple offset=(), tuple count=(), from_steps=None, nsteps=None, fill=0)\n Perform read.\n\n        Read data from an ADIOS BP file. Subset reading is\n        supported. Without any options, this will read out a whole\n        data.\n\n        Args:\n            offset (tuple of int, optional): offset (default: ())\n            count (tuple of int, optional): count (default: ())\n            from_steps (int, optional): starti [...]
+static PyObject *__pyx_pw_9adios_mpi_3var_9read(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_offset = 0;
   PyObject *__pyx_v_count = 0;
   PyObject *__pyx_v_from_steps = 0;
   PyObject *__pyx_v_nsteps = 0;
+  PyObject *__pyx_v_fill = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -9980,16 +13410,18 @@ static PyObject *__pyx_pw_9adios_mpi_3var_7read(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_offset,&__pyx_n_s_count,&__pyx_n_s_from_steps,&__pyx_n_s_nsteps,0};
-    PyObject* values[4] = {0,0,0,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_offset,&__pyx_n_s_count,&__pyx_n_s_from_steps,&__pyx_n_s_nsteps,&__pyx_n_s_fill,0};
+    PyObject* values[5] = {0,0,0,0,0};
     values[0] = ((PyObject*)__pyx_empty_tuple);
     values[1] = ((PyObject*)__pyx_empty_tuple);
-    values[2] = ((PyObject *)__pyx_int_0);
-    values[3] = ((PyObject *)__pyx_int_1);
+    values[2] = ((PyObject *)Py_None);
+    values[3] = ((PyObject *)Py_None);
+    values[4] = ((PyObject *)__pyx_int_0);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
       switch (pos_args) {
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -10019,12 +13451,18 @@ static PyObject *__pyx_pw_9adios_mpi_3var_7read(PyObject *__pyx_v_self, PyObject
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_nsteps);
           if (value) { values[3] = value; kw_args--; }
         }
+        case  4:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fill);
+          if (value) { values[4] = value; kw_args--; }
+        }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -10037,18 +13475,19 @@ static PyObject *__pyx_pw_9adios_mpi_3var_7read(PyObject *__pyx_v_self, PyObject
     __pyx_v_count = ((PyObject*)values[1]);
     __pyx_v_from_steps = values[2];
     __pyx_v_nsteps = values[3];
+    __pyx_v_fill = values[4];
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read", 0, 0, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read", 0, 0, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("adios_mpi.var.read", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_offset), (&PyTuple_Type), 1, "offset", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_count), (&PyTuple_Type), 1, "count", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_9adios_mpi_3var_6read(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), __pyx_v_offset, __pyx_v_count, __pyx_v_from_steps, __pyx_v_nsteps);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_offset), (&PyTuple_Type), 1, "offset", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_count), (&PyTuple_Type), 1, "count", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_3var_8read(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), __pyx_v_offset, __pyx_v_count, __pyx_v_from_steps, __pyx_v_nsteps, __pyx_v_fill);
 
   /* function exit code */
   goto __pyx_L0;
@@ -10059,7 +13498,7 @@ static PyObject *__pyx_pw_9adios_mpi_3var_7read(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_3var_6read(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_offset, PyObject *__pyx_v_count, PyObject *__pyx_v_from_steps, PyObject *__pyx_v_nsteps) {
+static PyObject *__pyx_pf_9adios_mpi_3var_8read(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_offset, PyObject *__pyx_v_count, PyObject *__pyx_v_from_steps, PyObject *__pyx_v_nsteps, PyObject *__pyx_v_fill) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -10069,12 +13508,13 @@ static PyObject *__pyx_pf_9adios_mpi_3var_6read(struct __pyx_obj_9adios_mpi_var
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2.__pyx_n = 4;
+  __pyx_t_2.__pyx_n = 5;
   __pyx_t_2.offset = __pyx_v_offset;
   __pyx_t_2.count = __pyx_v_count;
   __pyx_t_2.from_steps = __pyx_v_from_steps;
   __pyx_t_2.nsteps = __pyx_v_nsteps;
-  __pyx_t_1 = __pyx_vtabptr_9adios_mpi_var->read(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2.fill = __pyx_v_fill;
+  __pyx_t_1 = __pyx_vtabptr_9adios_mpi_var->read(__pyx_v_self, 1, &__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -10091,15 +13531,15 @@ static PyObject *__pyx_pf_9adios_mpi_3var_6read(struct __pyx_obj_9adios_mpi_var
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":649
+/* "adios_mpi.pyx":993
+ *         return np.squeeze(var)
  * 
- *     """ Print self """
  *     cpdef printself(self):             # <<<<<<<<<<<<<<
+ *         """ Print native ADIOS_VARINFO structure. """
  *         assert self.vp != NULL, 'Not an open variable'
- *         print '=== AdiosVariable ==='
  */
 
-static PyObject *__pyx_pw_9adios_mpi_3var_9printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_3var_11printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static PyObject *__pyx_f_9adios_mpi_3var_printself(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, int __pyx_skip_dispatch) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -10115,9 +13555,9 @@ static PyObject *__pyx_f_9adios_mpi_3var_printself(struct __pyx_obj_9adios_mpi_v
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overridden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_printself); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 649; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_printself); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_3var_9printself)) {
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_9adios_mpi_3var_11printself)) {
       __Pyx_XDECREF(__pyx_r);
       __Pyx_INCREF(__pyx_t_1);
       __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
@@ -10131,10 +13571,10 @@ static PyObject *__pyx_f_9adios_mpi_3var_printself(struct __pyx_obj_9adios_mpi_v
         }
       }
       if (__pyx_t_4) {
-        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 649; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       } else {
-        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 649; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -10146,9 +13586,9 @@ static PyObject *__pyx_f_9adios_mpi_3var_printself(struct __pyx_obj_9adios_mpi_v
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "adios_mpi.pyx":650
- *     """ Print self """
+  /* "adios_mpi.pyx":995
  *     cpdef printself(self):
+ *         """ Print native ADIOS_VARINFO structure. """
  *         assert self.vp != NULL, 'Not an open variable'             # <<<<<<<<<<<<<<
  *         print '=== AdiosVariable ==='
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
@@ -10157,30 +13597,30 @@ static PyObject *__pyx_f_9adios_mpi_3var_printself(struct __pyx_obj_9adios_mpi_v
   if (unlikely(!Py_OptimizeFlag)) {
     if (unlikely(!((__pyx_v_self->vp != NULL) != 0))) {
       PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Not_an_open_variable);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 650; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
   }
   #endif
 
-  /* "adios_mpi.pyx":651
- *     cpdef printself(self):
+  /* "adios_mpi.pyx":996
+ *         """ Print native ADIOS_VARINFO structure. """
  *         assert self.vp != NULL, 'Not an open variable'
  *         print '=== AdiosVariable ==='             # <<<<<<<<<<<<<<
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
  *         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)
  */
-  if (__Pyx_PrintOne(0, __pyx_kp_s_AdiosVariable) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 651; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_kp_s_AdiosVariable) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":652
+  /* "adios_mpi.pyx":997
  *         assert self.vp != NULL, 'Not an open variable'
  *         print '=== AdiosVariable ==='
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)             # <<<<<<<<<<<<<<
  *         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)
  *         printvar(self.vp)
  */
-  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->vp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->vp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_vp);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_vp);
@@ -10188,22 +13628,22 @@ static PyObject *__pyx_f_9adios_mpi_3var_printself(struct __pyx_obj_9adios_mpi_v
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":653
+  /* "adios_mpi.pyx":998
  *         print '=== AdiosVariable ==='
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
  *         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)             # <<<<<<<<<<<<<<
  *         printvar(self.vp)
  * 
  */
-  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->file->fp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_unsigned_long(((unsigned long)__pyx_v_self->file->fp)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_n_s_fp);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_fp);
@@ -10211,29 +13651,29 @@ static PyObject *__pyx_f_9adios_mpi_3var_printself(struct __pyx_obj_9adios_mpi_v
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_15s_lu, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_PrintOne(0, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":654
+  /* "adios_mpi.pyx":999
  *         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
  *         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)
  *         printvar(self.vp)             # <<<<<<<<<<<<<<
  * 
- * ## ====================
+ *     def __repr__(self):
  */
-  __pyx_t_1 = __pyx_f_9adios_mpi_printvar(__pyx_v_self->vp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_9adios_mpi_printvar(__pyx_v_self->vp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":649
+  /* "adios_mpi.pyx":993
+ *         return np.squeeze(var)
  * 
- *     """ Print self """
  *     cpdef printself(self):             # <<<<<<<<<<<<<<
+ *         """ Print native ADIOS_VARINFO structure. """
  *         assert self.vp != NULL, 'Not an open variable'
- *         print '=== AdiosVariable ==='
  */
 
   /* function exit code */
@@ -10253,19 +13693,20 @@ static PyObject *__pyx_f_9adios_mpi_3var_printself(struct __pyx_obj_9adios_mpi_v
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_3var_9printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_3var_9printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_9adios_mpi_3var_11printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_9adios_mpi_3var_10printself[] = "var.printself(self)\n Print native ADIOS_VARINFO structure. ";
+static PyObject *__pyx_pw_9adios_mpi_3var_11printself(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("printself (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_8printself(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+  __pyx_r = __pyx_pf_9adios_mpi_3var_10printself(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_3var_8printself(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_3var_10printself(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -10274,7 +13715,7 @@ static PyObject *__pyx_pf_9adios_mpi_3var_8printself(struct __pyx_obj_9adios_mpi
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("printself", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __pyx_f_9adios_mpi_3var_printself(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 649; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_9adios_mpi_3var_printself(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -10291,416 +13732,1367 @@ static PyObject *__pyx_pf_9adios_mpi_3var_8printself(struct __pyx_obj_9adios_mpi
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":577
+/* "adios_mpi.pyx":1001
+ *         printvar(self.vp)
  * 
- *     """ Public Memeber """
- *     cpdef public bytes name             # <<<<<<<<<<<<<<
- *     cpdef public int varid
- *     cpdef public type type
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+ *                (self.varid,
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_3var_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_3var_4name_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_3var_13__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_3var_13__repr__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4name___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_3var_12__repr__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_3var_4name___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_3var_12__repr__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__repr__", 0);
+
+  /* "adios_mpi.pyx":1002
+ * 
+ *     def __repr__(self):
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \             # <<<<<<<<<<<<<<
+ *                (self.varid,
+ *                 self.dtype,
+ */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->name);
-  __pyx_r = __pyx_v_self->name;
-  goto __pyx_L0;
 
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios_mpi.pyx":1003
+ *     def __repr__(self):
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+ *                (self.varid,             # <<<<<<<<<<<<<<
+ *                 self.dtype,
+ *                 self.ndim,
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
 
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_3var_4name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_3var_4name_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4name_2__set__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  /* "adios_mpi.pyx":1005
+ *                (self.varid,
+ *                 self.dtype,
+ *                 self.ndim,             # <<<<<<<<<<<<<<
+ *                 self.dims,
+ *                 self.nsteps)
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->ndim); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios_mpi.pyx":1007
+ *                 self.ndim,
+ *                 self.dims,
+ *                 self.nsteps)             # <<<<<<<<<<<<<<
+ * 
+ *     def __getitem__(self, index):
+ */
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
 
-static int __pyx_pf_9adios_mpi_3var_4name_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyBytes_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
+  /* "adios_mpi.pyx":1003
+ *     def __repr__(self):
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+ *                (self.varid,             # <<<<<<<<<<<<<<
+ *                 self.dtype,
+ *                 self.ndim,
+ */
+  __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->name);
-  __Pyx_DECREF(__pyx_v_self->name);
-  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->dtype));
+  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_self->dtype));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->dtype));
+  PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_self->dims);
+  PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_self->dims);
+  __Pyx_GIVEREF(__pyx_v_self->dims);
+  PyTuple_SET_ITEM(__pyx_t_4, 4, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_3 = 0;
 
-  /* function exit code */
-  __pyx_r = 0;
+  /* "adios_mpi.pyx":1002
+ * 
+ *     def __repr__(self):
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \             # <<<<<<<<<<<<<<
+ *                (self.varid,
+ *                 self.dtype,
+ */
+  __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_AdiosVar_varid_r_dtype_r_ndim_r, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
   goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.var.name.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_3var_4name_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_9adios_mpi_3var_4name_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4name_4__del__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_3var_4name_4__del__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->name);
-  __Pyx_DECREF(__pyx_v_self->name);
-  __pyx_v_self->name = ((PyObject*)Py_None);
+  /* "adios_mpi.pyx":1001
+ *         printvar(self.vp)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+ *                (self.varid,
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios_mpi.var.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":578
- *     """ Public Memeber """
- *     cpdef public bytes name
- *     cpdef public int varid             # <<<<<<<<<<<<<<
- *     cpdef public type type
- *     cpdef public int ndim
+/* "adios_mpi.pyx":1009
+ *                 self.nsteps)
+ * 
+ *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_3var_5varid_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_3var_5varid_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_3var_15__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_3var_15__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_5varid___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_3var_14__getitem__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), ((PyObject *)__pyx_v_index));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
+static PyObject *__pyx_gb_9adios_mpi_3var_11__getitem___2generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-static PyObject *__pyx_pf_9adios_mpi_3var_5varid___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+/* "adios_mpi.pyx":1030
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+
+static PyObject *__pyx_pf_9adios_mpi_3var_11__getitem___genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->varid); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *)__pyx_tp_new_9adios_mpi___pyx_scope_struct_1_genexpr(__pyx_ptype_9adios_mpi___pyx_scope_struct_1_genexpr, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *) __pyx_self;
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_9adios_mpi_3var_11__getitem___2generator, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_getitem___locals_genexpr); if (unlikely(!gen)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   /* function exit code */
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.var.varid.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.var.__getitem__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
-  __pyx_L0:;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_3var_5varid_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_3var_5varid_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_gb_9adios_mpi_3var_11__getitem___2generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *__pyx_cur_scope = ((struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *(*__pyx_t_4)(PyObject *);
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_5varid_2__set__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_3var_5varid_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->varid = __pyx_t_1;
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L6_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_)) { __Pyx_RaiseClosureNameError("index_"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_dims_)) { __Pyx_RaiseClosureNameError("dims_"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_dims_);
+  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_dims_);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_dims_);
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
+    __pyx_t_1 = __pyx_t_2; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  for (;;) {
+    if (likely(!__pyx_t_4)) {
+      if (likely(PyList_CheckExact(__pyx_t_1))) {
+        if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_2 = __pyx_t_4(__pyx_t_1);
+      if (unlikely(!__pyx_t_2)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_x);
+    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_x, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_x, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_indices); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_x, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_7 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
+      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
+      if (likely(__pyx_t_7)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+        __Pyx_INCREF(__pyx_t_7);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_6, function);
+      }
+    }
+    if (!__pyx_t_7) {
+      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_GOTREF(__pyx_t_2);
+    } else {
+      __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+      PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      __pyx_t_5 = 0;
+      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_r = __pyx_t_2;
+    __pyx_t_2 = 0;
+    __Pyx_XGIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+    __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
+    __pyx_cur_scope->__pyx_t_2 = __pyx_t_4;
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    /* return from generator, yielding value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L6_resume_from_yield:;
+    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+    __pyx_cur_scope->__pyx_t_0 = 0;
+    __Pyx_XGOTREF(__pyx_t_1);
+    __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
+    __pyx_t_4 = __pyx_cur_scope->__pyx_t_2;
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* function exit code */
-  __pyx_r = 0;
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.var.varid.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
+  return NULL;
 }
+static PyObject *__pyx_gb_9adios_mpi_3var_11__getitem___5generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "adios_mpi.pyx":579
- *     cpdef public bytes name
- *     cpdef public int varid
- *     cpdef public type type             # <<<<<<<<<<<<<<
- *     cpdef public int ndim
- *     cpdef public tuple dims
+/* "adios_mpi.pyx":1038
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
  */
 
-/* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_3var_4type_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_3var_4type_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4type___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_9adios_mpi_3var_4type___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_3var_11__getitem___3genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->type));
-  __pyx_r = ((PyObject *)__pyx_v_self->type);
-  goto __pyx_L0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *)__pyx_tp_new_9adios_mpi___pyx_scope_struct_2_genexpr(__pyx_ptype_9adios_mpi___pyx_scope_struct_2_genexpr, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *) __pyx_self;
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_9adios_mpi_3var_11__getitem___5generator1, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_getitem___locals_genexpr); if (unlikely(!gen)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   /* function exit code */
-  __pyx_L0:;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("adios_mpi.var.__getitem__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_3var_4type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_3var_4type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4type_2__set__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_3var_4type_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
+static PyObject *__pyx_gb_9adios_mpi_3var_11__getitem___5generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *__pyx_cur_scope = ((struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *(*__pyx_t_4)(PyObject *);
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyType_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->type);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->type));
-  __pyx_v_self->type = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L6_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_)) { __Pyx_RaiseClosureNameError("index_"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_index_);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->dims);
+  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->dims);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->dims);
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
+    __pyx_t_1 = __pyx_t_2; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  for (;;) {
+    if (likely(!__pyx_t_4)) {
+      if (likely(PyList_CheckExact(__pyx_t_1))) {
+        if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_2 = __pyx_t_4(__pyx_t_1);
+      if (unlikely(!__pyx_t_2)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_x);
+    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_x, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_x, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_indices); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_x, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_7 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
+      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
+      if (likely(__pyx_t_7)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+        __Pyx_INCREF(__pyx_t_7);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_6, function);
+      }
+    }
+    if (!__pyx_t_7) {
+      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_GOTREF(__pyx_t_2);
+    } else {
+      __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+      PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      __pyx_t_5 = 0;
+      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_r = __pyx_t_2;
+    __pyx_t_2 = 0;
+    __Pyx_XGIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+    __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
+    __pyx_cur_scope->__pyx_t_2 = __pyx_t_4;
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    /* return from generator, yielding value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L6_resume_from_yield:;
+    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+    __pyx_cur_scope->__pyx_t_0 = 0;
+    __Pyx_XGOTREF(__pyx_t_1);
+    __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
+    __pyx_t_4 = __pyx_cur_scope->__pyx_t_2;
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* function exit code */
-  __pyx_r = 0;
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.var.type.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_3var_4type_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_9adios_mpi_3var_4type_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4type_4__del__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_3var_4type_4__del__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->type);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->type));
-  __pyx_v_self->type = ((PyObject*)Py_None);
-
-  /* function exit code */
-  __pyx_r = 0;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
+  return NULL;
 }
 
-/* "adios_mpi.pyx":580
- *     cpdef public int varid
- *     cpdef public type type
- *     cpdef public int ndim             # <<<<<<<<<<<<<<
- *     cpdef public tuple dims
- *     cpdef public int nsteps
+/* "adios_mpi.pyx":1009
+ *                 self.nsteps)
+ * 
+ *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1
  */
 
-/* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_3var_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_3var_4ndim_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4ndim___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_9adios_mpi_3var_4ndim___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_3var_14__getitem__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_index) {
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *__pyx_cur_scope;
+  PyObject *__pyx_v_ndim_ = NULL;
+  PyObject *__pyx_v_slice_ = NULL;
+  PyObject *__pyx_v_indices = NULL;
+  PyObject *__pyx_v_z = NULL;
+  PyObject *__pyx_v_from_steps_ = NULL;
+  PyObject *__pyx_v_nsteps_ = NULL;
+  PyObject *__pyx_v_offset_ = NULL;
+  PyObject *__pyx_v_count_ = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  Py_ssize_t __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  struct __pyx_opt_args_9adios_mpi_3var_read __pyx_t_14;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __pyx_cur_scope = (struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *)__pyx_tp_new_9adios_mpi___pyx_scope_struct____getitem__(__pyx_ptype_9adios_mpi___pyx_scope_struct____getitem__, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+
+  /* "adios_mpi.pyx":1010
+ * 
+ *     def __getitem__(self, index):
+ *         ndim_ = self.ndim             # <<<<<<<<<<<<<<
+ *         if (self.nsteps) > 1: ndim_ += 1
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
+  __pyx_v_ndim_ = __pyx_t_1;
   __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.var.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_3var_4ndim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_3var_4ndim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4ndim_2__set__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  /* "adios_mpi.pyx":1011
+ *     def __getitem__(self, index):
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1             # <<<<<<<<<<<<<<
+ * 
+ *         index_ = __parse_index(index, ndim_)
+ */
+  __pyx_t_2 = ((__pyx_cur_scope->__pyx_v_self->nsteps > 1) != 0);
+  if (__pyx_t_2) {
+    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_ndim_, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF_SET(__pyx_v_ndim_, __pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+  /* "adios_mpi.pyx":1013
+ *         if (self.nsteps) > 1: ndim_ += 1
+ * 
+ *         index_ = __parse_index(index, ndim_)             # <<<<<<<<<<<<<<
+ * 
+ *         if (ndim_ > 0) and (len(index_) > ndim_):
+ */
+  __pyx_t_1 = __pyx_f_9adios_mpi___parse_index(__pyx_v_index, __pyx_v_ndim_, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_index_ = __pyx_t_1;
+  __pyx_t_1 = 0;
 
-static int __pyx_pf_9adios_mpi_3var_4ndim_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->ndim = __pyx_t_1;
+  /* "adios_mpi.pyx":1015
+ *         index_ = __parse_index(index, ndim_)
+ * 
+ *         if (ndim_ > 0) and (len(index_) > ndim_):             # <<<<<<<<<<<<<<
+ *             raise IndexError("Too many indices for data")
+ * 
+ */
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ndim_, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_3) {
+  } else {
+    __pyx_t_2 = __pyx_t_3;
+    goto __pyx_L5_bool_binop_done;
+  }
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_index_;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_4 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = PyObject_RichCompare(__pyx_t_1, __pyx_v_ndim_, Py_GT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_2 = __pyx_t_3;
+  __pyx_L5_bool_binop_done:;
+  if (__pyx_t_2) {
 
-  /* function exit code */
-  __pyx_r = 0;
+    /* "adios_mpi.pyx":1016
+ * 
+ *         if (ndim_ > 0) and (len(index_) > ndim_):
+ *             raise IndexError("Too many indices for data")             # <<<<<<<<<<<<<<
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):
+ */
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "adios_mpi.pyx":1018
+ *             raise IndexError("Too many indices for data")
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):             # <<<<<<<<<<<<<<
+ *             raise IndexError("Too many indices for data")
+ * 
+ */
+  __pyx_t_5 = PyObject_RichCompare(__pyx_v_ndim_, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  if (__pyx_t_3) {
+  } else {
+    __pyx_t_2 = __pyx_t_3;
+    goto __pyx_L8_bool_binop_done;
+  }
+  __pyx_t_5 = __pyx_cur_scope->__pyx_v_index_;
+  __Pyx_INCREF(__pyx_t_5);
+  __pyx_t_4 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_3 = ((__pyx_t_4 > 1) != 0);
+  __pyx_t_2 = __pyx_t_3;
+  __pyx_L8_bool_binop_done:;
+  if (__pyx_t_2) {
+
+    /* "adios_mpi.pyx":1019
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):
+ *             raise IndexError("Too many indices for data")             # <<<<<<<<<<<<<<
+ * 
+ *         for slice_ in index_:
+ */
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "adios_mpi.pyx":1021
+ *             raise IndexError("Too many indices for data")
+ * 
+ *         for slice_ in index_:             # <<<<<<<<<<<<<<
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ */
+  if (likely(PyList_CheckExact(__pyx_cur_scope->__pyx_v_index_)) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_index_)) {
+    __pyx_t_5 = __pyx_cur_scope->__pyx_v_index_; __Pyx_INCREF(__pyx_t_5); __pyx_t_4 = 0;
+    __pyx_t_6 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_index_); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  for (;;) {
+    if (likely(!__pyx_t_6)) {
+      if (likely(PyList_CheckExact(__pyx_t_5))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_5)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_1 = __pyx_t_6(__pyx_t_5);
+      if (unlikely(!__pyx_t_1)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_1);
+    }
+    __Pyx_XDECREF_SET(__pyx_v_slice_, __pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "adios_mpi.pyx":1022
+ * 
+ *         for slice_ in index_:
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):             # <<<<<<<<<<<<<<
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ *             if isinstance(slice_, str):
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_slice_, __pyx_n_s_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_7 = PyInt_Check(__pyx_t_1); 
+    __pyx_t_8 = (__pyx_t_7 != 0);
+    if (!__pyx_t_8) {
+    } else {
+      __pyx_t_3 = __pyx_t_8;
+      goto __pyx_L15_bool_binop_done;
+    }
+    __pyx_t_8 = PyLong_Check(__pyx_t_1); 
+    __pyx_t_7 = (__pyx_t_8 != 0);
+    __pyx_t_3 = __pyx_t_7;
+    __pyx_L15_bool_binop_done:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_7 = (__pyx_t_3 != 0);
+    if (__pyx_t_7) {
+    } else {
+      __pyx_t_2 = __pyx_t_7;
+      goto __pyx_L13_bool_binop_done;
+    }
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_slice_, __pyx_n_s_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_9 = PyObject_RichCompare(__pyx_t_1, __pyx_int_1, Py_NE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_2 = __pyx_t_7;
+    __pyx_L13_bool_binop_done:;
+    if (__pyx_t_2) {
+
+      /* "adios_mpi.pyx":1023
+ *         for slice_ in index_:
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))             # <<<<<<<<<<<<<<
+ *             if isinstance(slice_, str):
+ *                 raise IndexError("Name index (%r) is not supported." % (slice_))
+ */
+      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_slice_, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Step_size_d_is_not_supported, __pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_t_1 = 0;
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "adios_mpi.pyx":1024
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ *             if isinstance(slice_, str):             # <<<<<<<<<<<<<<
+ *                 raise IndexError("Name index (%r) is not supported." % (slice_))
+ * 
+ */
+    __pyx_t_2 = PyString_Check(__pyx_v_slice_); 
+    __pyx_t_7 = (__pyx_t_2 != 0);
+    if (__pyx_t_7) {
+
+      /* "adios_mpi.pyx":1025
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ *             if isinstance(slice_, str):
+ *                 raise IndexError("Name index (%r) is not supported." % (slice_))             # <<<<<<<<<<<<<<
+ * 
+ *         if (self.nsteps) > 1:
+ */
+      __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Name_index_r_is_not_supported, __pyx_v_slice_); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_t_1 = 0;
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "adios_mpi.pyx":1021
+ *             raise IndexError("Too many indices for data")
+ * 
+ *         for slice_ in index_:             # <<<<<<<<<<<<<<
+ *             if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+ *                 raise IndexError("Step size (%d) is not supported." % (slice_.step))
+ */
+  }
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+  /* "adios_mpi.pyx":1027
+ *                 raise IndexError("Name index (%r) is not supported." % (slice_))
+ * 
+ *         if (self.nsteps) > 1:             # <<<<<<<<<<<<<<
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)
+ */
+  __pyx_t_7 = ((__pyx_cur_scope->__pyx_v_self->nsteps > 1) != 0);
+  if (__pyx_t_7) {
+
+    /* "adios_mpi.pyx":1028
+ * 
+ *         if (self.nsteps) > 1:
+ *             dims_ = list(self.dims)             # <<<<<<<<<<<<<<
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))
+ */
+    __pyx_t_5 = PySequence_List(__pyx_cur_scope->__pyx_v_self->dims); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GIVEREF(__pyx_t_5);
+    __pyx_cur_scope->__pyx_v_dims_ = ((PyObject*)__pyx_t_5);
+    __pyx_t_5 = 0;
+
+    /* "adios_mpi.pyx":1029
+ *         if (self.nsteps) > 1:
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)             # <<<<<<<<<<<<<<
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))
+ *             z = zip(*indices)
+ */
+    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->nsteps); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_10 = PyList_Insert(__pyx_cur_scope->__pyx_v_dims_, 0, __pyx_t_5); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+    /* "adios_mpi.pyx":1030
+ *             dims_ = list(self.dims)
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+    __pyx_t_5 = __pyx_pf_9adios_mpi_3var_11__getitem___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_1 = PySequence_Tuple(__pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_indices = ((PyObject*)__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "adios_mpi.pyx":1031
+ *             dims_.insert(0, self.nsteps)
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))
+ *             z = zip(*indices)             # <<<<<<<<<<<<<<
+ * 
+ *             from_steps_ = z[0][0]
+ */
+    __pyx_t_1 = PySequence_Tuple(__pyx_v_indices); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_v_z = __pyx_t_5;
+    __pyx_t_5 = 0;
+
+    /* "adios_mpi.pyx":1033
+ *             z = zip(*indices)
+ * 
+ *             from_steps_ = z[0][0]             # <<<<<<<<<<<<<<
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]
+ */
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_from_steps_ = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "adios_mpi.pyx":1034
+ * 
+ *             from_steps_ = z[0][0]
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1             # <<<<<<<<<<<<<<
+ *             offset_ = z[0][1:]
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ */
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyNumber_Subtract(__pyx_t_5, __pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_9 = PyNumber_Subtract(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = PyNumber_Remainder(__pyx_t_9, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyNumber_Add(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_nsteps_ = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "adios_mpi.pyx":1035
+ *             from_steps_ = z[0][0]
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]             # <<<<<<<<<<<<<<
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ */
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = __Pyx_PyObject_GetSlice(__pyx_t_1, 1, 0, NULL, NULL, &__pyx_slice__19, 1, 0, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_v_offset_ = __pyx_t_5;
+    __pyx_t_5 = 0;
+
+    /* "adios_mpi.pyx":1036
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)             # <<<<<<<<<<<<<<
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))
+ */
+    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_subtract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_11 = __Pyx_PyObject_GetSlice(__pyx_t_1, 1, 0, NULL, NULL, &__pyx_slice__20, 1, 0, 1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_11);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_12 = __Pyx_PyObject_GetSlice(__pyx_t_1, 1, 0, NULL, NULL, &__pyx_slice__21, 1, 0, 1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_12);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = NULL;
+    __pyx_t_4 = 0;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_9))) {
+      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_9);
+      if (likely(__pyx_t_1)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+        __Pyx_INCREF(__pyx_t_1);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_9, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    __pyx_t_13 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    if (__pyx_t_1) {
+      PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = NULL;
+    }
+    PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_4, __pyx_t_11);
+    __Pyx_GIVEREF(__pyx_t_11);
+    PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_4, __pyx_t_12);
+    __Pyx_GIVEREF(__pyx_t_12);
+    __pyx_t_11 = 0;
+    __pyx_t_12 = 0;
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_13, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_9 = PyNumber_Subtract(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = __Pyx_PyList_GetSlice(__pyx_cur_scope->__pyx_v_dims_, 1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_13 = PyNumber_Remainder(__pyx_t_9, __pyx_t_5); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = PyNumber_Add(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+    __pyx_t_13 = PySequence_Tuple(__pyx_t_5); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_count_ = ((PyObject*)__pyx_t_13);
+    __pyx_t_13 = 0;
+    goto __pyx_L18;
+  }
+  /*else*/ {
+
+    /* "adios_mpi.pyx":1038
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))             # <<<<<<<<<<<<<<
+ *             z = zip(*indices)
+ * 
+ */
+    __pyx_t_13 = __pyx_pf_9adios_mpi_3var_11__getitem___3genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __pyx_t_5 = PySequence_Tuple(__pyx_t_13); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+    __pyx_v_indices = ((PyObject*)__pyx_t_5);
+    __pyx_t_5 = 0;
+
+    /* "adios_mpi.pyx":1039
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))
+ *             z = zip(*indices)             # <<<<<<<<<<<<<<
+ * 
+ *             if len(z) == 0:
+ */
+    __pyx_t_5 = PySequence_Tuple(__pyx_v_indices); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_5, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_v_z = __pyx_t_13;
+    __pyx_t_13 = 0;
+
+    /* "adios_mpi.pyx":1041
+ *             z = zip(*indices)
+ * 
+ *             if len(z) == 0:             # <<<<<<<<<<<<<<
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps
+ */
+    __pyx_t_4 = PyObject_Length(__pyx_v_z); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = ((__pyx_t_4 == 0) != 0);
+    if (__pyx_t_7) {
+
+      /* "adios_mpi.pyx":1042
+ * 
+ *             if len(z) == 0:
+ *                 from_steps_ = 0             # <<<<<<<<<<<<<<
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = ()
+ */
+      __Pyx_INCREF(__pyx_int_0);
+      __pyx_v_from_steps_ = __pyx_int_0;
+
+      /* "adios_mpi.pyx":1043
+ *             if len(z) == 0:
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps             # <<<<<<<<<<<<<<
+ *                 offset_ = ()
+ *                 count_ = ()
+ */
+      __pyx_t_13 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->nsteps); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __pyx_v_nsteps_ = __pyx_t_13;
+      __pyx_t_13 = 0;
+
+      /* "adios_mpi.pyx":1044
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = ()             # <<<<<<<<<<<<<<
+ *                 count_ = ()
+ *             else:
+ */
+      __Pyx_INCREF(__pyx_empty_tuple);
+      __pyx_v_offset_ = __pyx_empty_tuple;
+
+      /* "adios_mpi.pyx":1045
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = ()
+ *                 count_ = ()             # <<<<<<<<<<<<<<
+ *             else:
+ *                 from_steps_ = 0
+ */
+      __Pyx_INCREF(__pyx_empty_tuple);
+      __pyx_v_count_ = __pyx_empty_tuple;
+      goto __pyx_L19;
+    }
+    /*else*/ {
+
+      /* "adios_mpi.pyx":1047
+ *                 count_ = ()
+ *             else:
+ *                 from_steps_ = 0             # <<<<<<<<<<<<<<
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = z[0]
+ */
+      __Pyx_INCREF(__pyx_int_0);
+      __pyx_v_from_steps_ = __pyx_int_0;
+
+      /* "adios_mpi.pyx":1048
+ *             else:
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps             # <<<<<<<<<<<<<<
+ *                 offset_ = z[0]
+ *                 count_ = tuple((np.subtract(z[1], z[0])-1)%self.dims+1)
+ */
+      __pyx_t_13 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->nsteps); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __pyx_v_nsteps_ = __pyx_t_13;
+      __pyx_t_13 = 0;
+
+      /* "adios_mpi.pyx":1049
+ *                 from_steps_ = 0
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = z[0]             # <<<<<<<<<<<<<<
+ *                 count_ = tuple((np.subtract(z[1], z[0])-1)%self.dims+1)
+ * 
+ */
+      __pyx_t_13 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_13 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1049; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+      __Pyx_GOTREF(__pyx_t_13);
+      __pyx_v_offset_ = __pyx_t_13;
+      __pyx_t_13 = 0;
+
+      /* "adios_mpi.pyx":1050
+ *                 nsteps_ = self.nsteps
+ *                 offset_ = z[0]
+ *                 count_ = tuple((np.subtract(z[1], z[0])-1)%self.dims+1)             # <<<<<<<<<<<<<<
+ * 
+ *         ##print "from_steps", from_steps_
+ */
+      __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_subtract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_z, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_12 = __Pyx_GetItemInt(__pyx_v_z, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_12 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+      __Pyx_GOTREF(__pyx_t_12);
+      __pyx_t_11 = NULL;
+      __pyx_t_4 = 0;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_9))) {
+        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_9);
+        if (likely(__pyx_t_11)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+          __Pyx_INCREF(__pyx_t_11);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_9, function);
+          __pyx_t_4 = 1;
+        }
+      }
+      __pyx_t_1 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      if (__pyx_t_11) {
+        PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __pyx_t_11 = NULL;
+      }
+      PyTuple_SET_ITEM(__pyx_t_1, 0+__pyx_t_4, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_1, 1+__pyx_t_4, __pyx_t_12);
+      __Pyx_GIVEREF(__pyx_t_12);
+      __pyx_t_5 = 0;
+      __pyx_t_12 = 0;
+      __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_1, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = PyNumber_Subtract(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+      __pyx_t_13 = PyNumber_Remainder(__pyx_t_9, __pyx_cur_scope->__pyx_v_self->dims); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = PyNumber_Add(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+      __pyx_t_13 = PySequence_Tuple(__pyx_t_9); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_v_count_ = ((PyObject*)__pyx_t_13);
+      __pyx_t_13 = 0;
+    }
+    __pyx_L19:;
+  }
+  __pyx_L18:;
+
+  /* "adios_mpi.pyx":1057
+ *         ##print "count", count_
+ * 
+ *         return self.read(offset=offset_,             # <<<<<<<<<<<<<<
+ *                          count=count_,
+ *                          from_steps=from_steps_,
+ */
+  __Pyx_XDECREF(__pyx_r);
+  if (!(likely(PyTuple_CheckExact(__pyx_v_offset_))||((__pyx_v_offset_) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v_offset_)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":1060
+ *                          count=count_,
+ *                          from_steps=from_steps_,
+ *                          nsteps=nsteps_)             # <<<<<<<<<<<<<<
+ * 
+ * cdef class attr:
+ */
+  __pyx_t_14.__pyx_n = 4;
+  __pyx_t_14.offset = ((PyObject*)__pyx_v_offset_);
+  __pyx_t_14.count = __pyx_v_count_;
+  __pyx_t_14.from_steps = __pyx_v_from_steps_;
+  __pyx_t_14.nsteps = __pyx_v_nsteps_;
+  __pyx_t_13 = ((struct __pyx_vtabstruct_9adios_mpi_var *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->read(__pyx_cur_scope->__pyx_v_self, 0, &__pyx_t_14); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_r = __pyx_t_13;
+  __pyx_t_13 = 0;
   goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1009
+ *                 self.nsteps)
+ * 
+ *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
+ *         ndim_ = self.ndim
+ *         if (self.nsteps) > 1: ndim_ += 1
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.var.ndim.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_13);
+  __Pyx_AddTraceback("adios_mpi.var.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_ndim_);
+  __Pyx_XDECREF(__pyx_v_slice_);
+  __Pyx_XDECREF(__pyx_v_indices);
+  __Pyx_XDECREF(__pyx_v_z);
+  __Pyx_XDECREF(__pyx_v_from_steps_);
+  __Pyx_XDECREF(__pyx_v_nsteps_);
+  __Pyx_XDECREF(__pyx_v_offset_);
+  __Pyx_XDECREF(__pyx_v_count_);
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":581
- *     cpdef public type type
- *     cpdef public int ndim
- *     cpdef public tuple dims             # <<<<<<<<<<<<<<
- *     cpdef public int nsteps
+/* "adios_mpi.pyx":1084
+ *     property name:
+ *         """ The attribute name """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_3var_4dims_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_3var_4dims_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_4attr_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4attr_4name_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4dims___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+  __pyx_r = __pyx_pf_9adios_mpi_4attr_4name___get__(((struct __pyx_obj_9adios_mpi_attr *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_3var_4dims___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_4attr_4name___get__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1085
+ *         """ The attribute name """
+ *         def __get__(self):
+ *             return self.name             # <<<<<<<<<<<<<<
+ * 
+ *     property dtype:
+ */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->dims);
-  __pyx_r = __pyx_v_self->dims;
+  __Pyx_INCREF(__pyx_v_self->name);
+  __pyx_r = __pyx_v_self->name;
   goto __pyx_L0;
 
+  /* "adios_mpi.pyx":1084
+ *     property name:
+ *         """ The attribute name """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
+ * 
+ */
+
   /* function exit code */
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -10708,181 +15100,133 @@ static PyObject *__pyx_pf_9adios_mpi_3var_4dims___get__(struct __pyx_obj_9adios_
   return __pyx_r;
 }
 
+/* "adios_mpi.pyx":1089
+ *     property dtype:
+ *         """ The attribute type as in numpy.dtype """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
+
 /* Python wrapper */
-static int __pyx_pw_9adios_mpi_3var_4dims_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_3var_4dims_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pw_9adios_mpi_4attr_5dtype_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4attr_5dtype_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4dims_2__set__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4attr_5dtype___get__(((struct __pyx_obj_9adios_mpi_attr *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_9adios_mpi_3var_4dims_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
+static PyObject *__pyx_pf_9adios_mpi_4attr_5dtype___get__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  if (!(likely(PyTuple_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __pyx_v_value;
-  __Pyx_INCREF(__pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->dims);
-  __Pyx_DECREF(__pyx_v_self->dims);
-  __pyx_v_self->dims = ((PyObject*)__pyx_t_1);
-  __pyx_t_1 = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* function exit code */
-  __pyx_r = 0;
+  /* "adios_mpi.pyx":1090
+ *         """ The attribute type as in numpy.dtype """
+ *         def __get__(self):
+ *             return self.dtype             # <<<<<<<<<<<<<<
+ * 
+ *     property value:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->dtype));
+  __pyx_r = ((PyObject *)__pyx_v_self->dtype);
   goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.var.dims.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_3var_4dims_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_9adios_mpi_3var_4dims_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_4dims_4__del__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-static int __pyx_pf_9adios_mpi_3var_4dims_4__del__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
-  __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->dims);
-  __Pyx_DECREF(__pyx_v_self->dims);
-  __pyx_v_self->dims = ((PyObject*)Py_None);
+  /* "adios_mpi.pyx":1089
+ *     property dtype:
+ *         """ The attribute type as in numpy.dtype """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":582
- *     cpdef public int ndim
- *     cpdef public tuple dims
- *     cpdef public int nsteps             # <<<<<<<<<<<<<<
+/* "adios_mpi.pyx":1094
+ *     property value:
+ *         """ The attribute's value """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.value
  * 
- *     """ Initialization. Call adios_inq_var and populate public members """
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_3var_6nsteps_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_9adios_mpi_3var_6nsteps_1__get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pw_9adios_mpi_4attr_5value_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4attr_5value_1__get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_6nsteps___get__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self));
+  __pyx_r = __pyx_pf_9adios_mpi_4attr_5value___get__(((struct __pyx_obj_9adios_mpi_attr *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_3var_6nsteps___get__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self) {
+static PyObject *__pyx_pf_9adios_mpi_4attr_5value___get__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1095
+ *         """ The attribute's value """
+ *         def __get__(self):
+ *             return self.value             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, file file, char * name):
+ */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 582; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->value));
+  __pyx_r = ((PyObject *)__pyx_v_self->value);
   goto __pyx_L0;
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("adios_mpi.var.nsteps.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static int __pyx_pw_9adios_mpi_3var_6nsteps_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_9adios_mpi_3var_6nsteps_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_3var_6nsteps_2__set__(((struct __pyx_obj_9adios_mpi_var *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_9adios_mpi_3var_6nsteps_2__set__(struct __pyx_obj_9adios_mpi_var *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 582; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->nsteps = __pyx_t_1;
+  /* "adios_mpi.pyx":1094
+ *     property value:
+ *         """ The attribute's value """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.value
+ * 
+ */
 
   /* function exit code */
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("adios_mpi.var.nsteps.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
   __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":660
- * ## ====================
+/* "adios_mpi.pyx":1097
+ *             return self.value
  * 
- * def readvar(fname, varname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     if not f.var.has_key(varname):
+ *     def __init__(self, file file, char * name):             # <<<<<<<<<<<<<<
+ *         self.file = file
+ *         self.name = name
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_39readvar(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_9adios_mpi_39readvar = {"readvar", (PyCFunction)__pyx_pw_9adios_mpi_39readvar, METH_VARARGS|METH_KEYWORDS, 0};
-static PyObject *__pyx_pw_9adios_mpi_39readvar(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_fname = 0;
-  PyObject *__pyx_v_varname = 0;
+static int __pyx_pw_9adios_mpi_4attr_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_9adios_mpi_4attr_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_9adios_mpi_file *__pyx_v_file = 0;
+  char *__pyx_v_name;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("readvar (wrapper)", 0);
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_varname,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_file,&__pyx_n_s_name,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -10896,16 +15240,16 @@ static PyObject *__pyx_pw_9adios_mpi_39readvar(PyObject *__pyx_self, PyObject *_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_file)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_varname)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("readvar", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "readvar") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -10913,2393 +15257,8882 @@ static PyObject *__pyx_pw_9adios_mpi_39readvar(PyObject *__pyx_self, PyObject *_
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_fname = values[0];
-    __pyx_v_varname = values[1];
+    __pyx_v_file = ((struct __pyx_obj_9adios_mpi_file *)values[0]);
+    __pyx_v_name = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("readvar", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
-  __Pyx_AddTraceback("adios_mpi.readvar", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.attr.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
-  return NULL;
+  return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_9adios_mpi_38readvar(__pyx_self, __pyx_v_fname, __pyx_v_varname);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_file), __pyx_ptype_9adios_mpi_file, 1, "file", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_4attr___init__(((struct __pyx_obj_9adios_mpi_attr *)__pyx_v_self), __pyx_v_file, __pyx_v_name);
 
   /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_38readvar(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname, PyObject *__pyx_v_varname) {
-  struct __pyx_obj_9adios_mpi_file *__pyx_v_f = NULL;
-  PyObject *__pyx_v_v = NULL;
-  PyObject *__pyx_r = NULL;
+static int __pyx_pf_9adios_mpi_4attr___init__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self, struct __pyx_obj_9adios_mpi_file *__pyx_v_file, char *__pyx_v_name) {
+  int64_t __pyx_v_p;
+  ADIOS_DATATYPES __pyx_v_atype;
+  int __pyx_v_bytes;
+  PyObject *__pyx_v_strlist = 0;
+  int __pyx_v_len;
+  int __pyx_v_err;
+  int __pyx_v_i;
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
+  char const *__pyx_t_2;
+  int __pyx_t_3;
   PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  int __pyx_t_6;
+  PyObject *__pyx_t_5 = NULL;
+  struct __pyx_opt_args_9adios_mpi_adios2npdtype __pyx_t_6;
+  size_t __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_t_9;
+  int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("readvar", 0);
+  __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "adios_mpi.pyx":661
+  /* "adios_mpi.pyx":1098
+ * 
+ *     def __init__(self, file file, char * name):
+ *         self.file = file             # <<<<<<<<<<<<<<
+ *         self.name = name
  * 
- * def readvar(fname, varname):
- *     f = file(fname, comm=MPI.COMM_SELF)             # <<<<<<<<<<<<<<
- *     if not f.var.has_key(varname):
- *         print "No valid variable"
  */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(__pyx_v_fname);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fname);
-  __Pyx_GIVEREF(__pyx_v_fname);
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_COMM_SELF); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_comm, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_file)), __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_v_f = ((struct __pyx_obj_9adios_mpi_file *)__pyx_t_4);
-  __pyx_t_4 = 0;
+  __Pyx_INCREF(((PyObject *)__pyx_v_file));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_file));
+  __Pyx_GOTREF(__pyx_v_self->file);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->file));
+  __pyx_v_self->file = __pyx_v_file;
 
-  /* "adios_mpi.pyx":662
- * def readvar(fname, varname):
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     if not f.var.has_key(varname):             # <<<<<<<<<<<<<<
- *         print "No valid variable"
- *         return
+  /* "adios_mpi.pyx":1099
+ *     def __init__(self, file file, char * name):
+ *         self.file = file
+ *         self.name = name             # <<<<<<<<<<<<<<
+ * 
+ *         cdef int64_t p
  */
-  if (unlikely(__pyx_v_f->var == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_5 = PyDict_Contains(__pyx_v_f->var, __pyx_v_varname); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_6 = ((!(__pyx_t_5 != 0)) != 0);
-  if (__pyx_t_6) {
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->name);
+  __Pyx_DECREF(__pyx_v_self->name);
+  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-    /* "adios_mpi.pyx":663
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     if not f.var.has_key(varname):
- *         print "No valid variable"             # <<<<<<<<<<<<<<
- *         return
+  /* "adios_mpi.pyx":1107
+ *         cdef int len
+ * 
+ *         err = adios_get_attr(self.file.fp, self.name, &atype, &bytes, <void **> &p)             # <<<<<<<<<<<<<<
  * 
+ *         if err == 0:
  */
-    if (__Pyx_PrintOne(0, __pyx_kp_s_No_valid_variable) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_err = adios_get_attr(__pyx_v_self->file->fp, __pyx_t_2, (&__pyx_v_atype), (&__pyx_v_bytes), ((void **)(&__pyx_v_p)));
 
-    /* "adios_mpi.pyx":664
- *     if not f.var.has_key(varname):
- *         print "No valid variable"
- *         return             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":1109
+ *         err = adios_get_attr(self.file.fp, self.name, &atype, &bytes, <void **> &p)
  * 
- *     v = f.var[varname]
+ *         if err == 0:             # <<<<<<<<<<<<<<
+ *             if atype == DATATYPE.string:
+ *                 bytes = bytes - 1 ## Remove the NULL terminal
  */
-    __Pyx_XDECREF(__pyx_r);
-    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-    goto __pyx_L0;
-  }
+  __pyx_t_3 = ((__pyx_v_err == 0) != 0);
+  if (__pyx_t_3) {
 
-  /* "adios_mpi.pyx":666
- *         return
- * 
- *     v = f.var[varname]             # <<<<<<<<<<<<<<
- *     return v.read(from_steps=0, nsteps=v.nsteps)
+    /* "adios_mpi.pyx":1110
  * 
+ *         if err == 0:
+ *             if atype == DATATYPE.string:             # <<<<<<<<<<<<<<
+ *                 bytes = bytes - 1 ## Remove the NULL terminal
+ *             self.dtype = adios2npdtype(atype, bytes)
  */
-  if (unlikely(__pyx_v_f->var == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 666; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_4 = __Pyx_PyDict_GetItem(__pyx_v_f->var, __pyx_v_varname); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 666; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-  __Pyx_GOTREF(__pyx_t_4);
-  __pyx_v_v = __pyx_t_4;
-  __pyx_t_4 = 0;
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_atype); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_string); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_1, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (__pyx_t_3) {
 
-  /* "adios_mpi.pyx":667
- * 
- *     v = f.var[varname]
- *     return v.read(from_steps=0, nsteps=v.nsteps)             # <<<<<<<<<<<<<<
- * 
- * def bpls(fname):
+      /* "adios_mpi.pyx":1111
+ *         if err == 0:
+ *             if atype == DATATYPE.string:
+ *                 bytes = bytes - 1 ## Remove the NULL terminal             # <<<<<<<<<<<<<<
+ *             self.dtype = adios2npdtype(atype, bytes)
+ *             if atype == DATATYPE.string_array:
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_read); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_from_steps, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_nsteps, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+      __pyx_v_bytes = (__pyx_v_bytes - 1);
+      goto __pyx_L4;
+    }
+    __pyx_L4:;
+
+    /* "adios_mpi.pyx":1112
+ *             if atype == DATATYPE.string:
+ *                 bytes = bytes - 1 ## Remove the NULL terminal
+ *             self.dtype = adios2npdtype(atype, bytes)             # <<<<<<<<<<<<<<
+ *             if atype == DATATYPE.string_array:
+ *                 strlist = list()
+ */
+    __pyx_t_6.__pyx_n = 1;
+    __pyx_t_6.strlen = __pyx_v_bytes;
+    __pyx_t_4 = ((PyObject *)__pyx_f_9adios_mpi_adios2npdtype(__pyx_v_atype, 0, &__pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_4);
+    __Pyx_GOTREF(__pyx_v_self->dtype);
+    __Pyx_DECREF(((PyObject *)__pyx_v_self->dtype));
+    __pyx_v_self->dtype = ((PyArray_Descr *)__pyx_t_4);
+    __pyx_t_4 = 0;
 
-  /* "adios_mpi.pyx":660
- * ## ====================
- * 
- * def readvar(fname, varname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     if not f.var.has_key(varname):
+    /* "adios_mpi.pyx":1113
+ *                 bytes = bytes - 1 ## Remove the NULL terminal
+ *             self.dtype = adios2npdtype(atype, bytes)
+ *             if atype == DATATYPE.string_array:             # <<<<<<<<<<<<<<
+ *                 strlist = list()
+ *                 len = bytes/sizeof(p)
  */
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_atype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DATATYPE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_string_array); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (__pyx_t_3) {
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("adios_mpi.readvar", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
+      /* "adios_mpi.pyx":1114
+ *             self.dtype = adios2npdtype(atype, bytes)
+ *             if atype == DATATYPE.string_array:
+ *                 strlist = list()             # <<<<<<<<<<<<<<
+ *                 len = bytes/sizeof(p)
+ *                 for i in range(len):
+ */
+      __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_v_strlist = ((PyObject*)__pyx_t_5);
+      __pyx_t_5 = 0;
+
+      /* "adios_mpi.pyx":1115
+ *             if atype == DATATYPE.string_array:
+ *                 strlist = list()
+ *                 len = bytes/sizeof(p)             # <<<<<<<<<<<<<<
+ *                 for i in range(len):
+ *                     strlist.append((<char **>p)[i])
+ */
+      __pyx_t_7 = (sizeof(__pyx_v_p));
+      if (unlikely(__pyx_t_7 == 0)) {
+        #ifdef WITH_THREAD
+        PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();
+        #endif
+        PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
+        #ifdef WITH_THREAD
+        PyGILState_Release(__pyx_gilstate_save);
+        #endif
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_v_len = (__pyx_v_bytes / __pyx_t_7);
+
+      /* "adios_mpi.pyx":1116
+ *                 strlist = list()
+ *                 len = bytes/sizeof(p)
+ *                 for i in range(len):             # <<<<<<<<<<<<<<
+ *                     strlist.append((<char **>p)[i])
+ *                 self.value = np.array(strlist)
+ */
+      __pyx_t_8 = __pyx_v_len;
+      for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
+        __pyx_v_i = __pyx_t_9;
+
+        /* "adios_mpi.pyx":1117
+ *                 len = bytes/sizeof(p)
+ *                 for i in range(len):
+ *                     strlist.append((<char **>p)[i])             # <<<<<<<<<<<<<<
+ *                 self.value = np.array(strlist)
+ *                 self.dtype = self.value.dtype
+ */
+        __pyx_t_5 = __Pyx_PyBytes_FromString((((char **)__pyx_v_p)[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_strlist, __pyx_t_5); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+
+      /* "adios_mpi.pyx":1118
+ *                 for i in range(len):
+ *                     strlist.append((<char **>p)[i])
+ *                 self.value = np.array(strlist)             # <<<<<<<<<<<<<<
+ *                 self.dtype = self.value.dtype
+ * 
+ */
+      __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_1 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
+        __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+        if (likely(__pyx_t_1)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_1);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_4, function);
+        }
+      }
+      if (!__pyx_t_1) {
+        __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_strlist); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+      } else {
+        __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = NULL;
+        __Pyx_INCREF(__pyx_v_strlist);
+        PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_strlist);
+        __Pyx_GIVEREF(__pyx_v_strlist);
+        __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_11, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GIVEREF(__pyx_t_5);
+      __Pyx_GOTREF(__pyx_v_self->value);
+      __Pyx_DECREF(((PyObject *)__pyx_v_self->value));
+      __pyx_v_self->value = ((PyArrayObject *)__pyx_t_5);
+      __pyx_t_5 = 0;
+
+      /* "adios_mpi.pyx":1119
+ *                     strlist.append((<char **>p)[i])
+ *                 self.value = np.array(strlist)
+ *                 self.dtype = self.value.dtype             # <<<<<<<<<<<<<<
+ * 
+ *             elif self.dtype is None:
+ */
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->value), __pyx_n_s_dtype); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GIVEREF(__pyx_t_5);
+      __Pyx_GOTREF(__pyx_v_self->dtype);
+      __Pyx_DECREF(((PyObject *)__pyx_v_self->dtype));
+      __pyx_v_self->dtype = ((PyArray_Descr *)__pyx_t_5);
+      __pyx_t_5 = 0;
+      goto __pyx_L5;
+    }
+
+    /* "adios_mpi.pyx":1121
+ *                 self.dtype = self.value.dtype
+ * 
+ *             elif self.dtype is None:             # <<<<<<<<<<<<<<
+ *                 print 'Warning: No support yet: %s (type=%d, bytes=%d)' % \
+ *                       (self.name, atype, bytes)
+ */
+    __pyx_t_3 = (((PyObject *)__pyx_v_self->dtype) == Py_None);
+    __pyx_t_12 = (__pyx_t_3 != 0);
+    if (__pyx_t_12) {
+
+      /* "adios_mpi.pyx":1123
+ *             elif self.dtype is None:
+ *                 print 'Warning: No support yet: %s (type=%d, bytes=%d)' % \
+ *                       (self.name, atype, bytes)             # <<<<<<<<<<<<<<
+ *             else:
+ *                 len = bytes/self.dtype.itemsize
+ */
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_atype); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_bytes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_11);
+      __Pyx_INCREF(__pyx_v_self->name);
+      PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_self->name);
+      __Pyx_GIVEREF(__pyx_v_self->name);
+      PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_11, 2, __pyx_t_4);
+      __Pyx_GIVEREF(__pyx_t_4);
+      __pyx_t_5 = 0;
+      __pyx_t_4 = 0;
+
+      /* "adios_mpi.pyx":1122
+ * 
+ *             elif self.dtype is None:
+ *                 print 'Warning: No support yet: %s (type=%d, bytes=%d)' % \             # <<<<<<<<<<<<<<
+ *                       (self.name, atype, bytes)
+ *             else:
+ */
+      __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Warning_No_support_yet_s_type_d, __pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      if (__Pyx_PrintOne(0, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      goto __pyx_L5;
+    }
+    /*else*/ {
+
+      /* "adios_mpi.pyx":1125
+ *                       (self.name, atype, bytes)
+ *             else:
+ *                 len = bytes/self.dtype.itemsize             # <<<<<<<<<<<<<<
+ *                 if len == 1:
+ *                     self.value = np.array(len, dtype=self.dtype)
+ */
+      if (unlikely(__pyx_v_self->dtype->elsize == 0)) {
+        #ifdef WITH_THREAD
+        PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();
+        #endif
+        PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
+        #ifdef WITH_THREAD
+        PyGILState_Release(__pyx_gilstate_save);
+        #endif
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_self->dtype->elsize == (int)-1)  && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_bytes))) {
+        #ifdef WITH_THREAD
+        PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();
+        #endif
+        PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
+        #ifdef WITH_THREAD
+        PyGILState_Release(__pyx_gilstate_save);
+        #endif
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_v_len = __Pyx_div_int(__pyx_v_bytes, __pyx_v_self->dtype->elsize);
+
+      /* "adios_mpi.pyx":1126
+ *             else:
+ *                 len = bytes/self.dtype.itemsize
+ *                 if len == 1:             # <<<<<<<<<<<<<<
+ *                     self.value = np.array(len, dtype=self.dtype)
+ *                 else:
+ */
+      __pyx_t_12 = ((__pyx_v_len == 1) != 0);
+      if (__pyx_t_12) {
+
+        /* "adios_mpi.pyx":1127
+ *                 len = bytes/self.dtype.itemsize
+ *                 if len == 1:
+ *                     self.value = np.array(len, dtype=self.dtype)             # <<<<<<<<<<<<<<
+ *                 else:
+ *                     self.value = np.zeros(len, dtype=self.dtype)
+ */
+        __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_len); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
+        __Pyx_GIVEREF(__pyx_t_4);
+        __pyx_t_4 = 0;
+        __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, ((PyObject *)__pyx_v_self->dtype)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GIVEREF(__pyx_t_1);
+        __Pyx_GOTREF(__pyx_v_self->value);
+        __Pyx_DECREF(((PyObject *)__pyx_v_self->value));
+        __pyx_v_self->value = ((PyArrayObject *)__pyx_t_1);
+        __pyx_t_1 = 0;
+        goto __pyx_L8;
+      }
+      /*else*/ {
+
+        /* "adios_mpi.pyx":1129
+ *                     self.value = np.array(len, dtype=self.dtype)
+ *                 else:
+ *                     self.value = np.zeros(len, dtype=self.dtype)             # <<<<<<<<<<<<<<
+ *                 self.value.data = <char *> p
+ *         else:
+ */
+        __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
+        __Pyx_GIVEREF(__pyx_t_1);
+        __pyx_t_1 = 0;
+        __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, ((PyObject *)__pyx_v_self->dtype)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        if (!(likely(((__pyx_t_11) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GIVEREF(__pyx_t_11);
+        __Pyx_GOTREF(__pyx_v_self->value);
+        __Pyx_DECREF(((PyObject *)__pyx_v_self->value));
+        __pyx_v_self->value = ((PyArrayObject *)__pyx_t_11);
+        __pyx_t_11 = 0;
+      }
+      __pyx_L8:;
+
+      /* "adios_mpi.pyx":1130
+ *                 else:
+ *                     self.value = np.zeros(len, dtype=self.dtype)
+ *                 self.value.data = <char *> p             # <<<<<<<<<<<<<<
+ *         else:
+ *             raise KeyError(name)
+ */
+      __pyx_v_self->value->data = ((char *)__pyx_v_p);
+    }
+    __pyx_L5:;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "adios_mpi.pyx":1132
+ *                 self.value.data = <char *> p
+ *         else:
+ *             raise KeyError(name)             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
+ */
+    __pyx_t_11 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_11);
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
+    __Pyx_GIVEREF(__pyx_t_11);
+    __pyx_t_11 = 0;
+    __pyx_t_11 = __Pyx_PyObject_Call(__pyx_builtin_KeyError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_11);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_Raise(__pyx_t_11, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_L3:;
+
+  /* "adios_mpi.pyx":1097
+ *             return self.value
+ * 
+ *     def __init__(self, file file, char * name):             # <<<<<<<<<<<<<<
+ *         self.file = file
+ *         self.name = name
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_AddTraceback("adios_mpi.attr.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_f);
-  __Pyx_XDECREF(__pyx_v_v);
-  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_XDECREF(__pyx_v_strlist);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "adios_mpi.pyx":669
- *     return v.read(from_steps=0, nsteps=v.nsteps)
+/* "adios_mpi.pyx":1134
+ *             raise KeyError(name)
  * 
- * def bpls(fname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     return {'nvars': f.nvars,
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \
+ *                (self.name, self.dtype, self.value)
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_9adios_mpi_41bpls(PyObject *__pyx_self, PyObject *__pyx_v_fname); /*proto*/
-static PyMethodDef __pyx_mdef_9adios_mpi_41bpls = {"bpls", (PyCFunction)__pyx_pw_9adios_mpi_41bpls, METH_O, 0};
-static PyObject *__pyx_pw_9adios_mpi_41bpls(PyObject *__pyx_self, PyObject *__pyx_v_fname) {
+static PyObject *__pyx_pw_9adios_mpi_4attr_3__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_4attr_3__repr__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("bpls (wrapper)", 0);
-  __pyx_r = __pyx_pf_9adios_mpi_40bpls(__pyx_self, ((PyObject *)__pyx_v_fname));
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_4attr_2__repr__(((struct __pyx_obj_9adios_mpi_attr *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_9adios_mpi_40bpls(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname) {
-  struct __pyx_obj_9adios_mpi_file *__pyx_v_f = NULL;
-  PyObject *__pyx_v_k = NULL;
+static PyObject *__pyx_pf_9adios_mpi_4attr_2__repr__(struct __pyx_obj_9adios_mpi_attr *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  Py_ssize_t __pyx_t_5;
-  Py_ssize_t __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("bpls", 0);
+  __Pyx_RefNannySetupContext("__repr__", 0);
 
-  /* "adios_mpi.pyx":670
+  /* "adios_mpi.pyx":1135
+ * 
+ *     def __repr__(self):
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \             # <<<<<<<<<<<<<<
+ *                (self.name, self.dtype, self.value)
  * 
- * def bpls(fname):
- *     f = file(fname, comm=MPI.COMM_SELF)             # <<<<<<<<<<<<<<
- *     return {'nvars': f.nvars,
- *             'nattrs': f.nattrs,
- */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(__pyx_v_fname);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fname);
-  __Pyx_GIVEREF(__pyx_v_fname);
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_COMM_SELF); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_comm, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_file)), __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_v_f = ((struct __pyx_obj_9adios_mpi_file *)__pyx_t_4);
-  __pyx_t_4 = 0;
-
-  /* "adios_mpi.pyx":671
- * def bpls(fname):
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     return {'nvars': f.nvars,             # <<<<<<<<<<<<<<
- *             'nattrs': f.nattrs,
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->nvars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_nvars, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
-  /* "adios_mpi.pyx":672
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     return {'nvars': f.nvars,
- *             'nattrs': f.nattrs,             # <<<<<<<<<<<<<<
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
- */
-  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->nattrs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_nattrs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":673
- *     return {'nvars': f.nvars,
- *             'nattrs': f.nattrs,
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),             # <<<<<<<<<<<<<<
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
- *             'time_steps': (f.current_step, f.last_step),
+  /* "adios_mpi.pyx":1136
+ *     def __repr__(self):
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \
+ *                (self.name, self.dtype, self.value)             # <<<<<<<<<<<<<<
+ * 
+ * 
  */
-  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_5 = 0;
-  if (unlikely(__pyx_v_f->var == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iterkeys");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_f->var, 1, __pyx_n_s_iterkeys, (&__pyx_t_6), (&__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_1);
-  __pyx_t_1 = __pyx_t_3;
-  __pyx_t_3 = 0;
-  while (1) {
-    __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_6, &__pyx_t_5, &__pyx_t_3, NULL, NULL, __pyx_t_7);
-    if (unlikely(__pyx_t_8 == 0)) break;
-    if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_3);
-    __pyx_t_3 = 0;
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_v_k))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_vars, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_INCREF(__pyx_v_self->name);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name);
+  __Pyx_GIVEREF(__pyx_v_self->name);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->dtype));
+  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_self->dtype));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->dtype));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->value));
+  PyTuple_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_v_self->value));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->value));
 
-  /* "adios_mpi.pyx":674
- *             'nattrs': f.nattrs,
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),             # <<<<<<<<<<<<<<
- *             'time_steps': (f.current_step, f.last_step),
- *             'file_size': f.file_size}
+  /* "adios_mpi.pyx":1135
+ * 
+ *     def __repr__(self):
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \             # <<<<<<<<<<<<<<
+ *                (self.name, self.dtype, self.value)
+ * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_6 = 0;
-  if (unlikely(__pyx_v_f->attr == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iterkeys");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_f->attr, 1, __pyx_n_s_iterkeys, (&__pyx_t_5), (&__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_2);
-  __pyx_t_2 = __pyx_t_3;
-  __pyx_t_3 = 0;
-  while (1) {
-    __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_2, __pyx_t_5, &__pyx_t_6, &__pyx_t_3, NULL, NULL, __pyx_t_7);
-    if (unlikely(__pyx_t_8 == 0)) break;
-    if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_3);
-    __pyx_t_3 = 0;
-    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_v_k))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_AdiosAttr_name_r_dtype_r_value_r, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_attrs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
-  /* "adios_mpi.pyx":675
- *             'vars': tuple([ k for k in f.var.iterkeys() ]),
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
- *             'time_steps': (f.current_step, f.last_step),             # <<<<<<<<<<<<<<
- *             'file_size': f.file_size}
- */
-  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->current_step); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
-  __pyx_t_1 = 0;
-  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_time_steps, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-
-  /* "adios_mpi.pyx":676
- *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
- *             'time_steps': (f.current_step, f.last_step),
- *             'file_size': f.file_size}             # <<<<<<<<<<<<<<
- */
-  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_f->file_size); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_file_size, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_r = __pyx_t_4;
-  __pyx_t_4 = 0;
   goto __pyx_L0;
 
-  /* "adios_mpi.pyx":669
- *     return v.read(from_steps=0, nsteps=v.nsteps)
+  /* "adios_mpi.pyx":1134
+ *             raise KeyError(name)
  * 
- * def bpls(fname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     return {'nvars': f.nvars,
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \
+ *                (self.name, self.dtype, self.value)
  */
 
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("adios_mpi.bpls", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("adios_mpi.attr.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_f);
-  __Pyx_XDECREF(__pyx_v_k);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":194
- *         # experimental exception made for __getbuffer__ and __releasebuffer__
- *         # -- the details of this may change.
- *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
- *             # This implementation of getbuffer is geared towards Cython
- *             # requirements, and does not yet fullfill the PEP.
+/* "adios_mpi.pyx":1142
+ * cdef class smartdict(dict):
+ *     cdef factory
+ *     def __init__(self, factory):             # <<<<<<<<<<<<<<
+ *         dict.__init__(self)
+ *         self.factory = factory
  */
 
 /* Python wrapper */
-static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
-static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
+static int __pyx_pw_9adios_mpi_9smartdict_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_9adios_mpi_9smartdict_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_factory = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_factory,0};
+    PyObject* values[1] = {0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_factory)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+    }
+    __pyx_v_factory = values[0];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.smartdict.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_9smartdict___init__(((struct __pyx_obj_9adios_mpi_smartdict *)__pyx_v_self), __pyx_v_factory);
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
-  int __pyx_v_copy_shape;
-  int __pyx_v_i;
-  int __pyx_v_ndim;
-  int __pyx_v_endian_detector;
-  int __pyx_v_little_endian;
-  int __pyx_v_t;
-  char *__pyx_v_f;
-  PyArray_Descr *__pyx_v_descr = 0;
-  int __pyx_v_offset;
-  int __pyx_v_hasfields;
+static int __pyx_pf_9adios_mpi_9smartdict___init__(struct __pyx_obj_9adios_mpi_smartdict *__pyx_v_self, PyObject *__pyx_v_factory) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  char *__pyx_t_7;
+  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getbuffer__", 0);
-  if (__pyx_v_info != NULL) {
-    __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
-    __Pyx_GIVEREF(__pyx_v_info->obj);
-  }
+  __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":200
- *             # of flags
- * 
- *             if info == NULL: return             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":1143
+ *     cdef factory
+ *     def __init__(self, factory):
+ *         dict.__init__(self)             # <<<<<<<<<<<<<<
+ *         self.factory = factory
  * 
- *             cdef int copy_shape, i, ndim
  */
-  __pyx_t_1 = ((__pyx_v_info == NULL) != 0);
-  if (__pyx_t_1) {
-    __pyx_r = 0;
-    goto __pyx_L0;
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)((PyObject*)(&PyDict_Type))), __pyx_n_s_init); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_3)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+    }
+  }
+  if (!__pyx_t_3) {
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+  } else {
+    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = NULL;
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":203
- * 
- *             cdef int copy_shape, i, ndim
- *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<
- *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+  /* "adios_mpi.pyx":1144
+ *     def __init__(self, factory):
+ *         dict.__init__(self)
+ *         self.factory = factory             # <<<<<<<<<<<<<<
  * 
+ *     def __setitem__(self, key, value):
  */
-  __pyx_v_endian_detector = 1;
+  __Pyx_INCREF(__pyx_v_factory);
+  __Pyx_GIVEREF(__pyx_v_factory);
+  __Pyx_GOTREF(__pyx_v_self->factory);
+  __Pyx_DECREF(__pyx_v_self->factory);
+  __pyx_v_self->factory = __pyx_v_factory;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":204
- *             cdef int copy_shape, i, ndim
- *             cdef int endian_detector = 1
- *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
- * 
- *             ndim = PyArray_NDIM(self)
+  /* "adios_mpi.pyx":1142
+ * cdef class smartdict(dict):
+ *     cdef factory
+ *     def __init__(self, factory):             # <<<<<<<<<<<<<<
+ *         dict.__init__(self)
+ *         self.factory = factory
  */
-  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":206
- *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
- * 
- *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<
- * 
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
- */
-  __pyx_v_ndim = PyArray_NDIM(__pyx_v_self);
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios_mpi.smartdict.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":208
- *             ndim = PyArray_NDIM(self)
+/* "adios_mpi.pyx":1146
+ *         self.factory = factory
  * 
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
- *                 copy_shape = 1
- *             else:
+ *     def __setitem__(self, key, value):             # <<<<<<<<<<<<<<
+ *         if key in dict.keys(self):
+ *             dict.__setitem__(self, key, value)
  */
-  __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0);
-  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":209
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_9smartdict_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_key, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_9adios_mpi_9smartdict_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_key, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_9smartdict_2__setitem__(((struct __pyx_obj_9adios_mpi_smartdict *)__pyx_v_self), ((PyObject *)__pyx_v_key), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_9smartdict_2__setitem__(struct __pyx_obj_9adios_mpi_smartdict *__pyx_v_self, PyObject *__pyx_v_key, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  Py_ssize_t __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setitem__", 0);
+
+  /* "adios_mpi.pyx":1147
  * 
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
- *                 copy_shape = 1             # <<<<<<<<<<<<<<
- *             else:
- *                 copy_shape = 0
+ *     def __setitem__(self, key, value):
+ *         if key in dict.keys(self):             # <<<<<<<<<<<<<<
+ *             dict.__setitem__(self, key, value)
+ *         else:
  */
-    __pyx_v_copy_shape = 1;
-    goto __pyx_L4;
+  if (unlikely(((PyObject *)__pyx_v_self) == Py_None)) {
+    PyErr_Format(PyExc_TypeError, "descriptor '%s' requires a '%s' object but received a 'NoneType'", "keys", "dict");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  /*else*/ {
+  __pyx_t_1 = __Pyx_PyDict_Keys(((PyObject*)__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = (__Pyx_PySequence_Contains(__pyx_v_key, __pyx_t_1, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = (__pyx_t_2 != 0);
+  if (__pyx_t_3) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211
- *                 copy_shape = 1
- *             else:
- *                 copy_shape = 0             # <<<<<<<<<<<<<<
- * 
- *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+    /* "adios_mpi.pyx":1148
+ *     def __setitem__(self, key, value):
+ *         if key in dict.keys(self):
+ *             dict.__setitem__(self, key, value)             # <<<<<<<<<<<<<<
+ *         else:
+ *             self.factory(key, value)
  */
-    __pyx_v_copy_shape = 0;
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)((PyObject*)(&PyDict_Type))), __pyx_n_s_setitem); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_5)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_5);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    __pyx_t_7 = PyTuple_New(3+__pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    if (__pyx_t_5) {
+      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
+    }
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, ((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __Pyx_INCREF(__pyx_v_key);
+    PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_v_key);
+    __Pyx_GIVEREF(__pyx_v_key);
+    __Pyx_INCREF(__pyx_v_value);
+    PyTuple_SET_ITEM(__pyx_t_7, 2+__pyx_t_6, __pyx_v_value);
+    __Pyx_GIVEREF(__pyx_v_value);
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L3;
   }
-  __pyx_L4:;
+  /*else*/ {
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":213
- *                 copy_shape = 0
+    /* "adios_mpi.pyx":1150
+ *             dict.__setitem__(self, key, value)
+ *         else:
+ *             self.factory(key, value)             # <<<<<<<<<<<<<<
  * 
- *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<
- *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not C contiguous")
+ * cdef class writer:
  */
-  __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0);
-  if (__pyx_t_2) {
-  } else {
-    __pyx_t_1 = __pyx_t_2;
-    goto __pyx_L6_bool_binop_done;
+    __Pyx_INCREF(__pyx_v_self->factory);
+    __pyx_t_4 = __pyx_v_self->factory; __pyx_t_7 = NULL;
+    __pyx_t_6 = 0;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_7)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_7);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    __pyx_t_5 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    if (__pyx_t_7) {
+      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+    }
+    __Pyx_INCREF(__pyx_v_key);
+    PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_6, __pyx_v_key);
+    __Pyx_GIVEREF(__pyx_v_key);
+    __Pyx_INCREF(__pyx_v_value);
+    PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_6, __pyx_v_value);
+    __Pyx_GIVEREF(__pyx_v_value);
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
+  __pyx_L3:;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":214
- * 
- *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
- *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<
- *                 raise ValueError(u"ndarray is not C contiguous")
+  /* "adios_mpi.pyx":1146
+ *         self.factory = factory
  * 
+ *     def __setitem__(self, key, value):             # <<<<<<<<<<<<<<
+ *         if key in dict.keys(self):
+ *             dict.__setitem__(self, key, value)
  */
-  __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0);
-  __pyx_t_1 = __pyx_t_2;
-  __pyx_L6_bool_binop_done:;
-  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":215
- *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
- *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("adios_mpi.smartdict.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1181
+ *     property fname:
+ *         """ The filename to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.fname
  * 
- *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  */
-    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":217
- *                 raise ValueError(u"ndarray is not C contiguous")
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_5fname_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_6writer_5fname_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_5fname___get__(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_6writer_5fname___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1182
+ *         """ The filename to write. """
+ *         def __get__(self):
+ *             return self.fname             # <<<<<<<<<<<<<<
  * 
- *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<
- *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ *     property gname:
  */
-  __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0);
-  if (__pyx_t_2) {
-  } else {
-    __pyx_t_1 = __pyx_t_2;
-    goto __pyx_L9_bool_binop_done;
-  }
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->fname);
+  __pyx_r = __pyx_v_self->fname;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218
- * 
- *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
- *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<
- *                 raise ValueError(u"ndarray is not Fortran contiguous")
+  /* "adios_mpi.pyx":1181
+ *     property fname:
+ *         """ The filename to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.fname
  * 
  */
-  __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0);
-  __pyx_t_1 = __pyx_t_2;
-  __pyx_L9_bool_binop_done:;
-  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":219
- *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
- *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1186
+ *     property gname:
+ *         """ The groupname associated with the file. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.gname
  * 
- *             info.buf = PyArray_DATA(self)
  */
-    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":221
- *                 raise ValueError(u"ndarray is not Fortran contiguous")
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_5gname_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_6writer_5gname_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_5gname___get__(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_6writer_5gname___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1187
+ *         """ The groupname associated with the file. """
+ *         def __get__(self):
+ *             return self.gname             # <<<<<<<<<<<<<<
  * 
- *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<
- *             info.ndim = ndim
- *             if copy_shape:
+ *     property is_noxml:
  */
-  __pyx_v_info->buf = PyArray_DATA(__pyx_v_self);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->gname);
+  __pyx_r = __pyx_v_self->gname;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222
+  /* "adios_mpi.pyx":1186
+ *     property gname:
+ *         """ The groupname associated with the file. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.gname
  * 
- *             info.buf = PyArray_DATA(self)
- *             info.ndim = ndim             # <<<<<<<<<<<<<<
- *             if copy_shape:
- *                 # Allocate new buffer for strides and shape info.
  */
-  __pyx_v_info->ndim = __pyx_v_ndim;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":223
- *             info.buf = PyArray_DATA(self)
- *             info.ndim = ndim
- *             if copy_shape:             # <<<<<<<<<<<<<<
- *                 # Allocate new buffer for strides and shape info.
- *                 # This is allocated as one block, strides first.
- */
-  __pyx_t_1 = (__pyx_v_copy_shape != 0);
-  if (__pyx_t_1) {
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226
- *                 # Allocate new buffer for strides and shape info.
- *                 # This is allocated as one block, strides first.
- *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)             # <<<<<<<<<<<<<<
- *                 info.shape = info.strides + ndim
- *                 for i in range(ndim):
+/* "adios_mpi.pyx":1191
+ *     property is_noxml:
+ *         """ Boolean to indicate using No-XML or not. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_noxml
+ * 
  */
-    __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2)));
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":227
- *                 # This is allocated as one block, strides first.
- *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)
- *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<
- *                 for i in range(ndim):
- *                     info.strides[i] = PyArray_STRIDES(self)[i]
- */
-    __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_8is_noxml_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_6writer_8is_noxml_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_8is_noxml___get__(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self));
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":228
- *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)
- *                 info.shape = info.strides + ndim
- *                 for i in range(ndim):             # <<<<<<<<<<<<<<
- *                     info.strides[i] = PyArray_STRIDES(self)[i]
- *                     info.shape[i] = PyArray_DIMS(self)[i]
- */
-    __pyx_t_4 = __pyx_v_ndim;
-    for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
-      __pyx_v_i = __pyx_t_5;
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":229
- *                 info.shape = info.strides + ndim
- *                 for i in range(ndim):
- *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<
- *                     info.shape[i] = PyArray_DIMS(self)[i]
- *             else:
- */
-      (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]);
+static PyObject *__pyx_pf_9adios_mpi_6writer_8is_noxml___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":230
- *                 for i in range(ndim):
- *                     info.strides[i] = PyArray_STRIDES(self)[i]
- *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<
- *             else:
- *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+  /* "adios_mpi.pyx":1192
+ *         """ Boolean to indicate using No-XML or not. """
+ *         def __get__(self):
+ *             return self.is_noxml             # <<<<<<<<<<<<<<
+ * 
+ *     property var:
  */
-      (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]);
-    }
-    goto __pyx_L11;
-  }
-  /*else*/ {
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_noxml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":232
- *                     info.shape[i] = PyArray_DIMS(self)[i]
- *             else:
- *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
- *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
- *             info.suboffsets = NULL
+  /* "adios_mpi.pyx":1191
+ *     property is_noxml:
+ *         """ Boolean to indicate using No-XML or not. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_noxml
+ * 
  */
-    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self));
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":233
- *             else:
- *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
- *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)             # <<<<<<<<<<<<<<
- *             info.suboffsets = NULL
- *             info.itemsize = PyArray_ITEMSIZE(self)
- */
-    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self));
-  }
-  __pyx_L11:;
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.writer.is_noxml.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":234
- *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
- *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
- *             info.suboffsets = NULL             # <<<<<<<<<<<<<<
- *             info.itemsize = PyArray_ITEMSIZE(self)
- *             info.readonly = not PyArray_ISWRITEABLE(self)
+/* "adios_mpi.pyx":1196
+ *     property var:
+ *         """ Dictionary of variables to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.var
+ * 
  */
-  __pyx_v_info->suboffsets = NULL;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":235
- *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
- *             info.suboffsets = NULL
- *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<
- *             info.readonly = not PyArray_ISWRITEABLE(self)
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_3var_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_6writer_3var_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_3var___get__(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_6writer_3var___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1197
+ *         """ Dictionary of variables to write. """
+ *         def __get__(self):
+ *             return self.var             # <<<<<<<<<<<<<<
  * 
+ *     property attr:
  */
-  __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->var);
+  __pyx_r = __pyx_v_self->var;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":236
- *             info.suboffsets = NULL
- *             info.itemsize = PyArray_ITEMSIZE(self)
- *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":1196
+ *     property var:
+ *         """ Dictionary of variables to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.var
  * 
- *             cdef int t
  */
-  __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0));
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":239
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1201
+ *     property attr:
+ *         """ Dictionary of attributes to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.attr
  * 
- *             cdef int t
- *             cdef char* f = NULL             # <<<<<<<<<<<<<<
- *             cdef dtype descr = self.descr
- *             cdef list stack
  */
-  __pyx_v_f = NULL;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":240
- *             cdef int t
- *             cdef char* f = NULL
- *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<
- *             cdef list stack
- *             cdef int offset
- */
-  __pyx_t_3 = ((PyObject *)__pyx_v_self->descr);
-  __Pyx_INCREF(__pyx_t_3);
-  __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3);
-  __pyx_t_3 = 0;
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_4attr_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_6writer_4attr_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_4attr___get__(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self));
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":244
- *             cdef int offset
- * 
- *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_6writer_4attr___get__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1202
+ *         """ Dictionary of attributes to write. """
+ *         def __get__(self):
+ *             return self.attr             # <<<<<<<<<<<<<<
  * 
- *             if not hasfields and not copy_shape:
+ *     def __init__(self,char * fname,
  */
-  __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->attr);
+  __pyx_r = __pyx_v_self->attr;
+  goto __pyx_L0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":246
- *             cdef bint hasfields = PyDataType_HASFIELDS(descr)
+  /* "adios_mpi.pyx":1201
+ *     property attr:
+ *         """ Dictionary of attributes to write. """
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.attr
  * 
- *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<
- *                 # do not call releasebuffer
- *                 info.obj = None
  */
-  __pyx_t_2 = ((!(__pyx_v_hasfields != 0)) != 0);
-  if (__pyx_t_2) {
-  } else {
-    __pyx_t_1 = __pyx_t_2;
-    goto __pyx_L15_bool_binop_done;
-  }
-  __pyx_t_2 = ((!(__pyx_v_copy_shape != 0)) != 0);
-  __pyx_t_1 = __pyx_t_2;
-  __pyx_L15_bool_binop_done:;
-  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":248
- *             if not hasfields and not copy_shape:
- *                 # do not call releasebuffer
- *                 info.obj = None             # <<<<<<<<<<<<<<
- *             else:
- *                 # need to call releasebuffer
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1204
+ *             return self.attr
+ * 
+ *     def __init__(self,char * fname,             # <<<<<<<<<<<<<<
+ *                  bint is_noxml = True,
+ *                  MPI.Comm comm = MPI.COMM_WORLD):
  */
-    __Pyx_INCREF(Py_None);
-    __Pyx_GIVEREF(Py_None);
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj);
-    __pyx_v_info->obj = Py_None;
-    goto __pyx_L14;
-  }
-  /*else*/ {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":251
- *             else:
- *                 # need to call releasebuffer
- *                 info.obj = self             # <<<<<<<<<<<<<<
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_6writer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_9adios_mpi_6writer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_fname;
+  int __pyx_v_is_noxml;
+  struct PyMPICommObject *__pyx_v_comm = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_is_noxml,&__pyx_n_s_comm,0};
+    PyObject* values[3] = {0,0,0};
+    values[2] = (PyObject *)__pyx_k__22;
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_is_noxml);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_comm);
+          if (value) { values[2] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_fname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_fname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[1]) {
+      __pyx_v_is_noxml = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_is_noxml == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1205; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+
+      /* "adios_mpi.pyx":1205
  * 
- *             if not hasfields:
+ *     def __init__(self,char * fname,
+ *                  bint is_noxml = True,             # <<<<<<<<<<<<<<
+ *                  MPI.Comm comm = MPI.COMM_WORLD):
+ *         self.fname = fname
  */
-    __Pyx_INCREF(((PyObject *)__pyx_v_self));
-    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj);
-    __pyx_v_info->obj = ((PyObject *)__pyx_v_self);
+      __pyx_v_is_noxml = ((int)1);
+    }
+    __pyx_v_comm = ((struct PyMPICommObject *)values[2]);
   }
-  __pyx_L14:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.writer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_comm), __pyx_ptype_6mpi4py_3MPI_Comm, 1, "comm", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_9adios_mpi_6writer___init__(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self), __pyx_v_fname, __pyx_v_is_noxml, __pyx_v_comm);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":253
- *                 info.obj = self
+  /* "adios_mpi.pyx":1204
+ *             return self.attr
  * 
- *             if not hasfields:             # <<<<<<<<<<<<<<
- *                 t = descr.type_num
- *                 if ((descr.byteorder == c'>' and little_endian) or
+ *     def __init__(self,char * fname,             # <<<<<<<<<<<<<<
+ *                  bint is_noxml = True,
+ *                  MPI.Comm comm = MPI.COMM_WORLD):
  */
-  __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0);
-  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":254
- * 
- *             if not hasfields:
- *                 t = descr.type_num             # <<<<<<<<<<<<<<
- *                 if ((descr.byteorder == c'>' and little_endian) or
- *                     (descr.byteorder == c'<' and not little_endian)):
- */
-    __pyx_t_4 = __pyx_v_descr->type_num;
-    __pyx_v_t = __pyx_t_4;
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":255
- *             if not hasfields:
- *                 t = descr.type_num
- *                 if ((descr.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *                     (descr.byteorder == c'<' and not little_endian)):
- *                     raise ValueError(u"Non-native byte order not supported")
- */
-    __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0);
-    if (!__pyx_t_2) {
-      goto __pyx_L20_next_or;
-    } else {
-    }
-    __pyx_t_2 = (__pyx_v_little_endian != 0);
-    if (!__pyx_t_2) {
-    } else {
-      __pyx_t_1 = __pyx_t_2;
-      goto __pyx_L19_bool_binop_done;
-    }
-    __pyx_L20_next_or:;
+static int __pyx_pf_9adios_mpi_6writer___init__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_fname, int __pyx_v_is_noxml, struct PyMPICommObject *__pyx_v_comm) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__init__", 0);
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":256
- *                 t = descr.type_num
- *                 if ((descr.byteorder == c'>' and little_endian) or
- *                     (descr.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
- *                     raise ValueError(u"Non-native byte order not supported")
- *                 if   t == NPY_BYTE:        f = "b"
+  /* "adios_mpi.pyx":1207
+ *                  bint is_noxml = True,
+ *                  MPI.Comm comm = MPI.COMM_WORLD):
+ *         self.fname = fname             # <<<<<<<<<<<<<<
+ *         self.method = <bytes>""
+ *         self.method_params = <bytes>""
  */
-    __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0);
-    if (__pyx_t_2) {
-    } else {
-      __pyx_t_1 = __pyx_t_2;
-      goto __pyx_L19_bool_binop_done;
-    }
-    __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0);
-    __pyx_t_1 = __pyx_t_2;
-    __pyx_L19_bool_binop_done:;
-    if (__pyx_t_1) {
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_fname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->fname);
+  __Pyx_DECREF(__pyx_v_self->fname);
+  __pyx_v_self->fname = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257
- *                 if ((descr.byteorder == c'>' and little_endian) or
- *                     (descr.byteorder == c'<' and not little_endian)):
- *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
- *                 if   t == NPY_BYTE:        f = "b"
- *                 elif t == NPY_UBYTE:       f = "B"
+  /* "adios_mpi.pyx":1208
+ *                  MPI.Comm comm = MPI.COMM_WORLD):
+ *         self.fname = fname
+ *         self.method = <bytes>""             # <<<<<<<<<<<<<<
+ *         self.method_params = <bytes>""
+ *         self.is_noxml = is_noxml
  */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
+  __pyx_t_1 = __pyx_kp_s__7;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->method);
+  __Pyx_DECREF(__pyx_v_self->method);
+  __pyx_v_self->method = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
- *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
- *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+  /* "adios_mpi.pyx":1209
+ *         self.fname = fname
+ *         self.method = <bytes>""
+ *         self.method_params = <bytes>""             # <<<<<<<<<<<<<<
+ *         self.is_noxml = is_noxml
+ *         self.comm = comm
  */
-    switch (__pyx_v_t) {
+  __pyx_t_1 = __pyx_kp_s__7;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->method_params);
+  __Pyx_DECREF(__pyx_v_self->method_params);
+  __pyx_v_self->method_params = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":258
- *                     (descr.byteorder == c'<' and not little_endian)):
- *                     raise ValueError(u"Non-native byte order not supported")
- *                 if   t == NPY_BYTE:        f = "b"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_UBYTE:       f = "B"
- *                 elif t == NPY_SHORT:       f = "h"
+  /* "adios_mpi.pyx":1210
+ *         self.method = <bytes>""
+ *         self.method_params = <bytes>""
+ *         self.is_noxml = is_noxml             # <<<<<<<<<<<<<<
+ *         self.comm = comm
+ *         self.var = dict()
  */
-      case NPY_BYTE:
-      __pyx_v_f = __pyx_k_b;
-      break;
+  __pyx_v_self->is_noxml = __pyx_v_is_noxml;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259
- *                     raise ValueError(u"Non-native byte order not supported")
- *                 if   t == NPY_BYTE:        f = "b"
- *                 elif t == NPY_UBYTE:       f = "B"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_SHORT:       f = "h"
- *                 elif t == NPY_USHORT:      f = "H"
+  /* "adios_mpi.pyx":1211
+ *         self.method_params = <bytes>""
+ *         self.is_noxml = is_noxml
+ *         self.comm = comm             # <<<<<<<<<<<<<<
+ *         self.var = dict()
+ *         self.attr = dict()
  */
-      case NPY_UBYTE:
-      __pyx_v_f = __pyx_k_B;
-      break;
+  __Pyx_INCREF(((PyObject *)__pyx_v_comm));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_comm));
+  __Pyx_GOTREF(__pyx_v_self->comm);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->comm));
+  __pyx_v_self->comm = __pyx_v_comm;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260
- *                 if   t == NPY_BYTE:        f = "b"
- *                 elif t == NPY_UBYTE:       f = "B"
- *                 elif t == NPY_SHORT:       f = "h"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_USHORT:      f = "H"
- *                 elif t == NPY_INT:         f = "i"
+  /* "adios_mpi.pyx":1212
+ *         self.is_noxml = is_noxml
+ *         self.comm = comm
+ *         self.var = dict()             # <<<<<<<<<<<<<<
+ *         self.attr = dict()
+ * 
  */
-      case NPY_SHORT:
-      __pyx_v_f = __pyx_k_h;
-      break;
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->var);
+  __Pyx_DECREF(__pyx_v_self->var);
+  __pyx_v_self->var = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":261
- *                 elif t == NPY_UBYTE:       f = "B"
- *                 elif t == NPY_SHORT:       f = "h"
- *                 elif t == NPY_USHORT:      f = "H"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_INT:         f = "i"
- *                 elif t == NPY_UINT:        f = "I"
+  /* "adios_mpi.pyx":1213
+ *         self.comm = comm
+ *         self.var = dict()
+ *         self.attr = dict()             # <<<<<<<<<<<<<<
+ * 
+ *     ##def __var_factory__(self, name, value):
  */
-      case NPY_USHORT:
-      __pyx_v_f = __pyx_k_H;
-      break;
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->attr);
+  __Pyx_DECREF(__pyx_v_self->attr);
+  __pyx_v_self->attr = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":262
- *                 elif t == NPY_SHORT:       f = "h"
- *                 elif t == NPY_USHORT:      f = "H"
- *                 elif t == NPY_INT:         f = "i"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_UINT:        f = "I"
- *                 elif t == NPY_LONG:        f = "l"
+  /* "adios_mpi.pyx":1204
+ *             return self.attr
+ * 
+ *     def __init__(self,char * fname,             # <<<<<<<<<<<<<<
+ *                  bint is_noxml = True,
+ *                  MPI.Comm comm = MPI.COMM_WORLD):
  */
-      case NPY_INT:
-      __pyx_v_f = __pyx_k_i;
-      break;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":263
- *                 elif t == NPY_USHORT:      f = "H"
- *                 elif t == NPY_INT:         f = "i"
- *                 elif t == NPY_UINT:        f = "I"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_LONG:        f = "l"
- *                 elif t == NPY_ULONG:       f = "L"
- */
-      case NPY_UINT:
-      __pyx_v_f = __pyx_k_I;
-      break;
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.writer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":264
- *                 elif t == NPY_INT:         f = "i"
- *                 elif t == NPY_UINT:        f = "I"
- *                 elif t == NPY_LONG:        f = "l"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_ULONG:       f = "L"
- *                 elif t == NPY_LONGLONG:    f = "q"
+/* "adios_mpi.pyx":1221
+ *     ##    print "attr_factory:", name, value
+ * 
+ *     def declare_group(self, char * gname,             # <<<<<<<<<<<<<<
+ *                       char * method = "POSIX1",
+ *                       char * method_params = ""):
  */
-      case NPY_LONG:
-      __pyx_v_f = __pyx_k_l;
-      break;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":265
- *                 elif t == NPY_UINT:        f = "I"
- *                 elif t == NPY_LONG:        f = "l"
- *                 elif t == NPY_ULONG:       f = "L"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_LONGLONG:    f = "q"
- *                 elif t == NPY_ULONGLONG:   f = "Q"
- */
-      case NPY_ULONG:
-      __pyx_v_f = __pyx_k_L;
-      break;
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_3declare_group(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_6writer_2declare_group[] = "writer.declare_group(self, char *gname, char *method='POSIX1', char *method_params='')\n\n        Define a group associated with the file.\n\n        Args:\n            gname (str): group name.\n            method (str, optional): Adios write method (default: 'POSIX1')\n            method_params (str, optional): parameters for the write method (default: '')\n\n        Example:\n\n        >>>  fw.declare_group('group', method='M [...]
+static PyObject *__pyx_pw_9adios_mpi_6writer_3declare_group(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_gname;
+  char *__pyx_v_method;
+  char *__pyx_v_method_params;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("declare_group (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_gname,&__pyx_n_s_method,&__pyx_n_s_method_params,0};
+    PyObject* values[3] = {0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_method_params);
+          if (value) { values[2] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "declare_group") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1221; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_gname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_gname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1221; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    if (values[1]) {
+      __pyx_v_method = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_method) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_method = ((char *)__pyx_k_POSIX1);
+    }
+    if (values[2]) {
+      __pyx_v_method_params = __Pyx_PyObject_AsString(values[2]); if (unlikely((!__pyx_v_method_params) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1223; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+      __pyx_v_method_params = ((char *)__pyx_k__7);
+    }
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("declare_group", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1221; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.writer.declare_group", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_2declare_group(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self), __pyx_v_gname, __pyx_v_method, __pyx_v_method_params);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":266
- *                 elif t == NPY_LONG:        f = "l"
- *                 elif t == NPY_ULONG:       f = "L"
- *                 elif t == NPY_LONGLONG:    f = "q"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_ULONGLONG:   f = "Q"
- *                 elif t == NPY_FLOAT:       f = "f"
- */
-      case NPY_LONGLONG:
-      __pyx_v_f = __pyx_k_q;
-      break;
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":267
- *                 elif t == NPY_ULONG:       f = "L"
- *                 elif t == NPY_LONGLONG:    f = "q"
- *                 elif t == NPY_ULONGLONG:   f = "Q"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_FLOAT:       f = "f"
- *                 elif t == NPY_DOUBLE:      f = "d"
- */
-      case NPY_ULONGLONG:
-      __pyx_v_f = __pyx_k_Q;
-      break;
+static PyObject *__pyx_pf_9adios_mpi_6writer_2declare_group(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_gname, char *__pyx_v_method, char *__pyx_v_method_params) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int64_t __pyx_t_1;
+  struct __pyx_opt_args_9adios_mpi_declare_group __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  char *__pyx_t_4;
+  char *__pyx_t_5;
+  struct __pyx_opt_args_9adios_mpi_select_method __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("declare_group", 0);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":268
- *                 elif t == NPY_LONGLONG:    f = "q"
- *                 elif t == NPY_ULONGLONG:   f = "Q"
- *                 elif t == NPY_FLOAT:       f = "f"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_DOUBLE:      f = "d"
- *                 elif t == NPY_LONGDOUBLE:  f = "g"
+  /* "adios_mpi.pyx":1237
+ * 
+ *         """
+ *         self.gid = declare_group(gname, "", 1)             # <<<<<<<<<<<<<<
+ *         self.gname = gname
+ *         self.method = method
  */
-      case NPY_FLOAT:
-      __pyx_v_f = __pyx_k_f;
-      break;
+  __pyx_t_2.__pyx_n = 2;
+  __pyx_t_2.time_index = __pyx_k__7;
+  __pyx_t_2.stats = 1;
+  __pyx_t_1 = __pyx_f_9adios_mpi_declare_group(__pyx_v_gname, 0, &__pyx_t_2); 
+  __pyx_v_self->gid = __pyx_t_1;
+
+  /* "adios_mpi.pyx":1238
+ *         """
+ *         self.gid = declare_group(gname, "", 1)
+ *         self.gname = gname             # <<<<<<<<<<<<<<
+ *         self.method = method
+ *         self.method_params = method_params
+ */
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_gname); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->gname);
+  __Pyx_DECREF(__pyx_v_self->gname);
+  __pyx_v_self->gname = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":269
- *                 elif t == NPY_ULONGLONG:   f = "Q"
- *                 elif t == NPY_FLOAT:       f = "f"
- *                 elif t == NPY_DOUBLE:      f = "d"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_LONGDOUBLE:  f = "g"
- *                 elif t == NPY_CFLOAT:      f = "Zf"
+  /* "adios_mpi.pyx":1239
+ *         self.gid = declare_group(gname, "", 1)
+ *         self.gname = gname
+ *         self.method = method             # <<<<<<<<<<<<<<
+ *         self.method_params = method_params
+ *         select_method(self.gid, self.method, self.method_params, "")
  */
-      case NPY_DOUBLE:
-      __pyx_v_f = __pyx_k_d;
-      break;
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_method); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->method);
+  __Pyx_DECREF(__pyx_v_self->method);
+  __pyx_v_self->method = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":270
- *                 elif t == NPY_FLOAT:       f = "f"
- *                 elif t == NPY_DOUBLE:      f = "d"
- *                 elif t == NPY_LONGDOUBLE:  f = "g"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_CFLOAT:      f = "Zf"
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
+  /* "adios_mpi.pyx":1240
+ *         self.gname = gname
+ *         self.method = method
+ *         self.method_params = method_params             # <<<<<<<<<<<<<<
+ *         select_method(self.gid, self.method, self.method_params, "")
+ * 
  */
-      case NPY_LONGDOUBLE:
-      __pyx_v_f = __pyx_k_g;
-      break;
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_method_params); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->method_params);
+  __Pyx_DECREF(__pyx_v_self->method_params);
+  __pyx_v_self->method_params = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":271
- *                 elif t == NPY_DOUBLE:      f = "d"
- *                 elif t == NPY_LONGDOUBLE:  f = "g"
- *                 elif t == NPY_CFLOAT:      f = "Zf"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+  /* "adios_mpi.pyx":1241
+ *         self.method = method
+ *         self.method_params = method_params
+ *         select_method(self.gid, self.method, self.method_params, "")             # <<<<<<<<<<<<<<
+ * 
+ *     def define_var(self, char * varname,
  */
-      case NPY_CFLOAT:
-      __pyx_v_f = __pyx_k_Zf;
-      break;
+  __pyx_t_4 = __Pyx_PyObject_AsString(__pyx_v_self->method); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyObject_AsString(__pyx_v_self->method_params); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6.__pyx_n = 2;
+  __pyx_t_6.parameters = __pyx_t_5;
+  __pyx_t_6.base_path = __pyx_k__7;
+  __pyx_f_9adios_mpi_select_method(__pyx_v_self->gid, __pyx_t_4, 0, &__pyx_t_6); 
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":272
- *                 elif t == NPY_LONGDOUBLE:  f = "g"
- *                 elif t == NPY_CFLOAT:      f = "Zf"
- *                 elif t == NPY_CDOUBLE:     f = "Zd"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
- *                 elif t == NPY_OBJECT:      f = "O"
+  /* "adios_mpi.pyx":1221
+ *     ##    print "attr_factory:", name, value
+ * 
+ *     def declare_group(self, char * gname,             # <<<<<<<<<<<<<<
+ *                       char * method = "POSIX1",
+ *                       char * method_params = ""):
  */
-      case NPY_CDOUBLE:
-      __pyx_v_f = __pyx_k_Zd;
-      break;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":273
- *                 elif t == NPY_CFLOAT:      f = "Zf"
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"             # <<<<<<<<<<<<<<
- *                 elif t == NPY_OBJECT:      f = "O"
- *                 else:
- */
-      case NPY_CLONGDOUBLE:
-      __pyx_v_f = __pyx_k_Zg;
-      break;
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios_mpi.writer.declare_group", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274
- *                 elif t == NPY_CDOUBLE:     f = "Zd"
- *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
- *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
- *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+/* "adios_mpi.pyx":1243
+ *         select_method(self.gid, self.method, self.method_params, "")
+ * 
+ *     def define_var(self, char * varname,             # <<<<<<<<<<<<<<
+ *                    ldim = tuple(),
+ *                    gdim = tuple(),
  */
-      case NPY_OBJECT:
-      __pyx_v_f = __pyx_k_O;
-      break;
-      default:
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":276
- *                 elif t == NPY_OBJECT:      f = "O"
- *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
- *                 info.format = f
- *                 return
- */
-      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6);
-      __Pyx_GIVEREF(__pyx_t_6);
-      __pyx_t_6 = 0;
-      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_Raise(__pyx_t_6, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      break;
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_5define_var(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_6writer_4define_var[] = "writer.define_var(self, char *varname, ldim=<\077\077?>, gdim=<\077\077?>, offset=<\077\077?>)\n\n        Define a variable associated with the file.\n\n        Args:\n            varname (str): variable name.\n            ldim (tuple, optional): local dimension (default: tuple())\n            gdim (tuple, optional): global dimension (default: tuple())\n            offset (tuple, optional): offset (default: tuple())\n\n        Exa [...]
+static PyObject *__pyx_pw_9adios_mpi_6writer_5define_var(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_varname;
+  PyObject *__pyx_v_ldim = 0;
+  PyObject *__pyx_v_gdim = 0;
+  PyObject *__pyx_v_offset = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define_var (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_varname,&__pyx_n_s_ldim,&__pyx_n_s_gdim,&__pyx_n_s_offset,0};
+    PyObject* values[4] = {0,0,0,0};
+    values[1] = __pyx_k__23;
+    values[2] = __pyx_k__24;
+    values[3] = __pyx_k__25;
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_varname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ldim);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gdim);
+          if (value) { values[2] = value; kw_args--; }
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_offset);
+          if (value) { values[3] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_var") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
     }
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277
- *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- *                 info.format = f             # <<<<<<<<<<<<<<
- *                 return
- *             else:
- */
-    __pyx_v_info->format = __pyx_v_f;
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":278
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- *                 info.format = f
- *                 return             # <<<<<<<<<<<<<<
- *             else:
- *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
- */
-    __pyx_r = 0;
-    goto __pyx_L0;
+    __pyx_v_varname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_varname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_ldim = values[1];
+    __pyx_v_gdim = values[2];
+    __pyx_v_offset = values[3];
   }
-  /*else*/ {
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":280
- *                 return
- *             else:
- *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<
- *                 info.format[0] = c'^' # Native data types, manual alignment
- *                 offset = 0
- */
-    __pyx_v_info->format = ((char *)malloc(255));
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":281
- *             else:
- *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
- *                 info.format[0] = c'^' # Native data types, manual alignment             # <<<<<<<<<<<<<<
- *                 offset = 0
- *                 f = _util_dtypestring(descr, info.format + 1,
- */
-    (__pyx_v_info->format[0]) = '^';
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("define_var", 0, 1, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.writer.define_var", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_4define_var(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self), __pyx_v_varname, __pyx_v_ldim, __pyx_v_gdim, __pyx_v_offset);
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":282
- *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
- *                 info.format[0] = c'^' # Native data types, manual alignment
- *                 offset = 0             # <<<<<<<<<<<<<<
- *                 f = _util_dtypestring(descr, info.format + 1,
- *                                       info.format + _buffer_format_string_len,
- */
-    __pyx_v_offset = 0;
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":283
- *                 info.format[0] = c'^' # Native data types, manual alignment
- *                 offset = 0
- *                 f = _util_dtypestring(descr, info.format + 1,             # <<<<<<<<<<<<<<
- *                                       info.format + _buffer_format_string_len,
- *                                       &offset)
- */
-    __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_f = __pyx_t_7;
+static PyObject *__pyx_pf_9adios_mpi_6writer_4define_var(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_varname, PyObject *__pyx_v_ldim, PyObject *__pyx_v_gdim, PyObject *__pyx_v_offset) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define_var", 0);
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":286
- *                                       info.format + _buffer_format_string_len,
- *                                       &offset)
- *                 f[0] = c'\0' # Terminate format string             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":1263
  * 
- *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ *         """
+ *         self.var[varname] = varinfo(varname, ldim, gdim, offset)             # <<<<<<<<<<<<<<
+ * 
+ *     def define_attr(self, char * attrname):
  */
-    (__pyx_v_f[0]) = '\x00';
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_varname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_ldim);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_ldim);
+  __Pyx_GIVEREF(__pyx_v_ldim);
+  __Pyx_INCREF(__pyx_v_gdim);
+  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_gdim);
+  __Pyx_GIVEREF(__pyx_v_gdim);
+  __Pyx_INCREF(__pyx_v_offset);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_offset);
+  __Pyx_GIVEREF(__pyx_v_offset);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_varinfo)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
+  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_varname); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_t_2, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":194
- *         # experimental exception made for __getbuffer__ and __releasebuffer__
- *         # -- the details of this may change.
- *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
- *             # This implementation of getbuffer is geared towards Cython
- *             # requirements, and does not yet fullfill the PEP.
+  /* "adios_mpi.pyx":1243
+ *         select_method(self.gid, self.method, self.method_params, "")
+ * 
+ *     def define_var(self, char * varname,             # <<<<<<<<<<<<<<
+ *                    ldim = tuple(),
+ *                    gdim = tuple(),
  */
 
   /* function exit code */
-  __pyx_r = 0;
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = -1;
-  if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) {
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;
-  }
-  goto __pyx_L2;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("adios_mpi.writer.define_var", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
-  if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) {
-    __Pyx_GOTREF(Py_None);
-    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;
-  }
-  __pyx_L2:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_descr);
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":288
- *                 f[0] = c'\0' # Terminate format string
+/* "adios_mpi.pyx":1265
+ *         self.var[varname] = varinfo(varname, ldim, gdim, offset)
  * 
- *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
- *             if PyArray_HASFIELDS(self):
- *                 stdlib.free(info.format)
+ *     def define_attr(self, char * attrname):             # <<<<<<<<<<<<<<
+ *         """
+ *         Define attribute in the file.
  */
 
 /* Python wrapper */
-static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
-static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0);
-  __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info));
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-}
-
-static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
+static PyObject *__pyx_pw_9adios_mpi_6writer_7define_attr(PyObject *__pyx_v_self, PyObject *__pyx_arg_attrname); /*proto*/
+static char __pyx_doc_9adios_mpi_6writer_6define_attr[] = "writer.define_attr(self, char *attrname)\n\n        Define attribute in the file.\n\n        Args:\n            attrname (str): attribute name.\n        ";
+static PyObject *__pyx_pw_9adios_mpi_6writer_7define_attr(PyObject *__pyx_v_self, PyObject *__pyx_arg_attrname) {
+  char *__pyx_v_attrname;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__releasebuffer__", 0);
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":289
- * 
- *         def __releasebuffer__(ndarray self, Py_buffer* info):
- *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<
- *                 stdlib.free(info.format)
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
- */
-  __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0);
-  if (__pyx_t_1) {
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":290
- *         def __releasebuffer__(ndarray self, Py_buffer* info):
- *             if PyArray_HASFIELDS(self):
- *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
- *                 stdlib.free(info.strides)
- */
-    free(__pyx_v_info->format);
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291
- *             if PyArray_HASFIELDS(self):
- *                 stdlib.free(info.format)
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
- *                 stdlib.free(info.strides)
- *                 # info.shape was stored after info.strides in the same block
- */
-  __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0);
-  if (__pyx_t_1) {
-
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":292
- *                 stdlib.free(info.format)
- *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
- *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<
- *                 # info.shape was stored after info.strides in the same block
- * 
- */
-    free(__pyx_v_info->strides);
-    goto __pyx_L4;
+  __Pyx_RefNannySetupContext("define_attr (wrapper)", 0);
+  assert(__pyx_arg_attrname); {
+    __pyx_v_attrname = __Pyx_PyObject_AsString(__pyx_arg_attrname); if (unlikely((!__pyx_v_attrname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
-  __pyx_L4:;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":288
- *                 f[0] = c'\0' # Terminate format string
- * 
- *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
- *             if PyArray_HASFIELDS(self):
- *                 stdlib.free(info.format)
- */
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.writer.define_attr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_6define_attr(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self), ((char *)__pyx_v_attrname));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":768
- * ctypedef npy_cdouble     complex_t
- * 
- * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(1, <void*>a)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {
+static PyObject *__pyx_pf_9adios_mpi_6writer_6define_attr(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_attrname) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0);
+  __Pyx_RefNannySetupContext("define_attr", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":769
+  /* "adios_mpi.pyx":1273
+ *         """
  * 
- * cdef inline object PyArray_MultiIterNew1(a):
- *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
+ *         self.attr[attrname] = attrinfo(attrname, is_static=True)             # <<<<<<<<<<<<<<
  * 
- * cdef inline object PyArray_MultiIterNew2(a, b):
+ *     def define_dynamic_attr(self, char * attrname,
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_attrname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_is_static, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_attrinfo)), __pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_attrname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (unlikely(PyDict_SetItem(__pyx_v_self->attr, __pyx_t_1, __pyx_t_3) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":768
- * ctypedef npy_cdouble     complex_t
- * 
- * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(1, <void*>a)
+  /* "adios_mpi.pyx":1265
+ *         self.var[varname] = varinfo(varname, ldim, gdim, offset)
  * 
+ *     def define_attr(self, char * attrname):             # <<<<<<<<<<<<<<
+ *         """
+ *         Define attribute in the file.
  */
 
   /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios_mpi.writer.define_attr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771
- *     return PyArray_MultiIterNew(1, <void*>a)
- * 
- * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+/* "adios_mpi.pyx":1275
+ *         self.attr[attrname] = attrinfo(attrname, is_static=True)
  * 
+ *     def define_dynamic_attr(self, char * attrname,             # <<<<<<<<<<<<<<
+ *                             char * varname,
+ *                             dtype):
  */
 
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_9define_dynamic_attr(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_6writer_8define_dynamic_attr[] = "writer.define_dynamic_attr(self, char *attrname, char *varname, dtype)";
+static PyObject *__pyx_pw_9adios_mpi_6writer_9define_dynamic_attr(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_attrname;
+  char *__pyx_v_varname;
+  PyObject *__pyx_v_dtype = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0);
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":772
- * 
- * cdef inline object PyArray_MultiIterNew2(a, b):
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771
- *     return PyArray_MultiIterNew(1, <void*>a)
- * 
- * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
- * 
- */
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define_dynamic_attr (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_attrname,&__pyx_n_s_varname,&__pyx_n_s_dtype,0};
+    PyObject* values[3] = {0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_attrname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_varname)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_dynamic_attr", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1275; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  2:
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dtype)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("define_dynamic_attr", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1275; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "define_dynamic_attr") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1275; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+    }
+    __pyx_v_attrname = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_attrname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1275; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_varname = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_varname) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_dtype = values[2];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("define_dynamic_attr", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1275; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.writer.define_dynamic_attr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_8define_dynamic_attr(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self), __pyx_v_attrname, __pyx_v_varname, __pyx_v_dtype);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {
+static PyObject *__pyx_pf_9adios_mpi_6writer_8define_dynamic_attr(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, char *__pyx_v_attrname, char *__pyx_v_varname, PyObject *__pyx_v_dtype) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0);
+  __Pyx_RefNannySetupContext("define_dynamic_attr", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":775
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+  /* "adios_mpi.pyx":1278
+ *                             char * varname,
+ *                             dtype):
+ *         self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)             # <<<<<<<<<<<<<<
+ *     def __setitem__(self, name, val):
+ *         if self.var.has_key(name):
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_attrname); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
+  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_varname); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_dtype);
+  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_dtype);
+  __Pyx_GIVEREF(__pyx_v_dtype);
   __pyx_t_1 = 0;
-  goto __pyx_L0;
+  __pyx_t_2 = 0;
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_is_static, Py_False) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_attrinfo)), __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_attrname); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (unlikely(PyDict_SetItem(__pyx_v_self->attr, __pyx_t_2, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774
- *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+  /* "adios_mpi.pyx":1275
+ *         self.attr[attrname] = attrinfo(attrname, is_static=True)
  * 
+ *     def define_dynamic_attr(self, char * attrname,             # <<<<<<<<<<<<<<
+ *                             char * varname,
+ *                             dtype):
  */
 
   /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios_mpi.writer.define_dynamic_attr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
- * 
+/* "adios_mpi.pyx":1279
+ *                             dtype):
+ *         self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)
+ *     def __setitem__(self, name, val):             # <<<<<<<<<<<<<<
+ *         if self.var.has_key(name):
+ *             self.var[name].value = val
  */
 
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {
-  PyObject *__pyx_r = NULL;
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_6writer_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pw_9adios_mpi_6writer_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_val) {
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0);
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":778
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777
- *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
- * 
- */
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_10__setitem__(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self), ((PyObject *)__pyx_v_name), ((PyObject *)__pyx_v_val));
 
   /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {
-  PyObject *__pyx_r = NULL;
+static int __pyx_pf_9adios_mpi_6writer_10__setitem__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, PyObject *__pyx_v_name, PyObject *__pyx_v_val) {
+  int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0);
+  __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":781
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
- * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
+  /* "adios_mpi.pyx":1280
+ *         self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)
+ *     def __setitem__(self, name, val):
+ *         if self.var.has_key(name):             # <<<<<<<<<<<<<<
+ *             self.var[name].value = val
+ *         elif self.attr.has_key(name):
  */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = PyDict_Contains(__pyx_v_self->var, __pyx_v_name); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780
- *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+    /* "adios_mpi.pyx":1281
+ *     def __setitem__(self, name, val):
+ *         if self.var.has_key(name):
+ *             self.var[name].value = val             # <<<<<<<<<<<<<<
+ *         elif self.attr.has_key(name):
+ *             self.attr[name].value = val
+ */
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_self->var, __pyx_v_name); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1281; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    if (__Pyx_PyObject_SetAttrStr(__pyx_t_3, __pyx_n_s_value, __pyx_v_val) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    goto __pyx_L3;
+  }
+
+  /* "adios_mpi.pyx":1282
+ *         if self.var.has_key(name):
+ *             self.var[name].value = val
+ *         elif self.attr.has_key(name):             # <<<<<<<<<<<<<<
+ *             self.attr[name].value = val
+ *         else:
+ */
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_2 = PyDict_Contains(__pyx_v_self->attr, __pyx_v_name); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__pyx_t_2 != 0);
+  if (__pyx_t_1) {
+
+    /* "adios_mpi.pyx":1283
+ *             self.var[name].value = val
+ *         elif self.attr.has_key(name):
+ *             self.attr[name].value = val             # <<<<<<<<<<<<<<
+ *         else:
+ *             self.var[name] = val
+ */
+    if (unlikely(__pyx_v_self->attr == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_self->attr, __pyx_v_name); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1283; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    if (__Pyx_PyObject_SetAttrStr(__pyx_t_3, __pyx_n_s_value, __pyx_v_val) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "adios_mpi.pyx":1285
+ *             self.attr[name].value = val
+ *         else:
+ *             self.var[name] = val             # <<<<<<<<<<<<<<
  * 
+ *     def __getitem__(self, name):
+ */
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_v_name, __pyx_v_val) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_L3:;
+
+  /* "adios_mpi.pyx":1279
+ *                             dtype):
+ *         self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)
+ *     def __setitem__(self, name, val):             # <<<<<<<<<<<<<<
+ *         if self.var.has_key(name):
+ *             self.var[name].value = val
  */
 
   /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios_mpi.writer.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+/* "adios_mpi.pyx":1287
+ *             self.var[name] = val
  * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
- *     # Recursive utility function used in __getbuffer__ to get format
- *     # string. The new location in the format string is returned.
+ *     def __getitem__(self, name):             # <<<<<<<<<<<<<<
+ *         if self.var.has_key(name):
+ *             return self.var[name].value
  */
 
-static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
-  PyArray_Descr *__pyx_v_child = 0;
-  int __pyx_v_endian_detector;
-  int __pyx_v_little_endian;
-  PyObject *__pyx_v_fields = 0;
-  PyObject *__pyx_v_childname = NULL;
-  PyObject *__pyx_v_new_offset = NULL;
-  PyObject *__pyx_v_t = NULL;
-  char *__pyx_r;
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_name); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_6writer_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_name) {
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_12__getitem__(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self), ((PyObject *)__pyx_v_name));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_6writer_12__getitem__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self, PyObject *__pyx_v_name) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
   PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  long __pyx_t_8;
-  char *__pyx_t_9;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_util_dtypestring", 0);
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":790
- *     cdef int delta_offset
- *     cdef tuple i
- *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
- *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
- *     cdef tuple fields
- */
-  __pyx_v_endian_detector = 1;
-
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":791
- *     cdef tuple i
- *     cdef int endian_detector = 1
- *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
- *     cdef tuple fields
+  /* "adios_mpi.pyx":1288
  * 
+ *     def __getitem__(self, name):
+ *         if self.var.has_key(name):             # <<<<<<<<<<<<<<
+ *             return self.var[name].value
+ *         elif self.attr.has_key(name):
  */
-  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = PyDict_Contains(__pyx_v_self->var, __pyx_v_name); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794
- *     cdef tuple fields
- * 
- *     for childname in descr.names:             # <<<<<<<<<<<<<<
- *         fields = descr.fields[childname]
- *         child, new_offset = fields
+    /* "adios_mpi.pyx":1289
+ *     def __getitem__(self, name):
+ *         if self.var.has_key(name):
+ *             return self.var[name].value             # <<<<<<<<<<<<<<
+ *         elif self.attr.has_key(name):
+ *             return self.attr[name].value
  */
-  if (unlikely(__pyx_v_descr->names == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_XDECREF(__pyx_r);
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_self->var, __pyx_v_name); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1289; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_r = __pyx_t_4;
+    __pyx_t_4 = 0;
+    goto __pyx_L0;
   }
-  __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
-  for (;;) {
-    if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-    #if CYTHON_COMPILING_IN_CPYTHON
-    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #else
-    __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #endif
-    __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3);
-    __pyx_t_3 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":795
- * 
- *     for childname in descr.names:
- *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
- *         child, new_offset = fields
- * 
+  /* "adios_mpi.pyx":1290
+ *         if self.var.has_key(name):
+ *             return self.var[name].value
+ *         elif self.attr.has_key(name):             # <<<<<<<<<<<<<<
+ *             return self.attr[name].value
+ *         else:
  */
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-    __Pyx_GOTREF(__pyx_t_3);
-    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3));
-    __pyx_t_3 = 0;
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_2 = PyDict_Contains(__pyx_v_self->attr, __pyx_v_name); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__pyx_t_2 != 0);
+  if (__pyx_t_1) {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":796
- *     for childname in descr.names:
- *         fields = descr.fields[childname]
- *         child, new_offset = fields             # <<<<<<<<<<<<<<
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
+    /* "adios_mpi.pyx":1291
+ *             return self.var[name].value
+ *         elif self.attr.has_key(name):
+ *             return self.attr[name].value             # <<<<<<<<<<<<<<
+ *         else:
+ *             raise KeyError(name)
  */
-    if (likely(__pyx_v_fields != Py_None)) {
-      PyObject* sequence = __pyx_v_fields;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 2)) {
-        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
-      __Pyx_INCREF(__pyx_t_3);
-      __Pyx_INCREF(__pyx_t_4);
-      #else
-      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      #endif
-    } else {
-      __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_XDECREF(__pyx_r);
+    if (unlikely(__pyx_v_self->attr == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3));
+    __pyx_t_4 = __Pyx_PyDict_GetItem(__pyx_v_self->attr, __pyx_v_name); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1291; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
-    __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4);
-    __pyx_t_4 = 0;
+    goto __pyx_L0;
+  }
+  /*else*/ {
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798
- *         child, new_offset = fields
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+    /* "adios_mpi.pyx":1293
+ *             return self.attr[name].value
+ *         else:
+ *             raise KeyError(name)             # <<<<<<<<<<<<<<
  * 
+ *     def close(self):
  */
-    __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_INCREF(__pyx_v_name);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_name);
+    __Pyx_GIVEREF(__pyx_v_name);
+    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_KeyError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0);
-    if (__pyx_t_6) {
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":1287
+ *             self.var[name] = val
  * 
- *         if ((child.byteorder == c'>' and little_endian) or
+ *     def __getitem__(self, name):             # <<<<<<<<<<<<<<
+ *         if self.var.has_key(name):
+ *             return self.var[name].value
  */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
- * 
- *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")
- */
-    __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0);
-    if (!__pyx_t_7) {
-      goto __pyx_L8_next_or;
-    } else {
-    }
-    __pyx_t_7 = (__pyx_v_little_endian != 0);
-    if (!__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L7_bool_binop_done;
-    }
-    __pyx_L8_next_or:;
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios_mpi.writer.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802
+/* "adios_mpi.pyx":1295
+ *             raise KeyError(name)
  * 
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
- *             raise ValueError(u"Non-native byte order not supported")
- *             # One could encode it in the format string and have Cython
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         """
+ *         Write variables and attributes to a file and close the writer.
  */
-    __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0);
-    if (__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L7_bool_binop_done;
-    }
-    __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0);
-    __pyx_t_6 = __pyx_t_7;
-    __pyx_L7_bool_binop_done:;
-    if (__pyx_t_6) {
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":803
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
- *             # One could encode it in the format string and have Cython
- *             # complain instead, BUT: < and > in format strings also imply
- */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_15close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_9adios_mpi_6writer_14close[] = "writer.close(self)\n\n        Write variables and attributes to a file and close the writer.\n        ";
+static PyObject *__pyx_pw_9adios_mpi_6writer_15close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("close (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_14close(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self));
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":813
- * 
- *         # Output padding bytes
- *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
- *             f[0] = 120 # "x"; pad byte
- *             f += 1
- */
-    while (1) {
-      __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (!__pyx_t_6) break;
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":814
- *         # Output padding bytes
- *         while offset[0] < new_offset:
- *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
- *             f += 1
- *             offset[0] += 1
- */
-      (__pyx_v_f[0]) = 120;
+static PyObject *__pyx_pf_9adios_mpi_6writer_14close(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self) {
+  int64_t __pyx_v_fd;
+  PyObject *__pyx_v_extra_var = NULL;
+  PyObject *__pyx_v_extra_attr = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_v_val = NULL;
+  PyObject *__pyx_v_n = NULL;
+  PyObject *__pyx_v_groupsize = NULL;
+  PyObject *__pyx_v_var = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  char *__pyx_t_1;
+  char *__pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  Py_ssize_t __pyx_t_5;
+  int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  int __pyx_t_10;
+  int __pyx_t_11;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  PyObject *__pyx_t_14 = NULL;
+  PyObject *(*__pyx_t_15)(PyObject *);
+  uint64_t __pyx_t_16;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("close", 0);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":815
- *         while offset[0] < new_offset:
- *             f[0] = 120 # "x"; pad byte
- *             f += 1             # <<<<<<<<<<<<<<
- *             offset[0] += 1
+  /* "adios_mpi.pyx":1299
+ *         Write variables and attributes to a file and close the writer.
+ *         """
+ *         fd = open(self.gname, self.fname, "w")             # <<<<<<<<<<<<<<
  * 
+ *         extra_var = dict()
  */
-      __pyx_v_f = (__pyx_v_f + 1);
+  __pyx_t_1 = __Pyx_PyObject_AsString(__pyx_v_self->gname); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_AsString(__pyx_v_self->fname); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_fd = __pyx_f_9adios_mpi_open(__pyx_t_1, __pyx_t_2, __pyx_k_w, 0, NULL);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":816
- *             f[0] = 120 # "x"; pad byte
- *             f += 1
- *             offset[0] += 1             # <<<<<<<<<<<<<<
+  /* "adios_mpi.pyx":1301
+ *         fd = open(self.gname, self.fname, "w")
+ * 
+ *         extra_var = dict()             # <<<<<<<<<<<<<<
+ *         extra_attr = dict()
  * 
- *         offset[0] += child.itemsize
  */
-      __pyx_t_8 = 0;
-      (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1);
-    }
+  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_extra_var = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":818
- *             offset[0] += 1
+  /* "adios_mpi.pyx":1302
  * 
- *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
+ *         extra_var = dict()
+ *         extra_attr = dict()             # <<<<<<<<<<<<<<
  * 
- *         if not PyDataType_HASFIELDS(child):
+ *         for key, val in self.var.iteritems():
  */
-    __pyx_t_8 = 0;
-    (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize);
+  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_extra_attr = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":820
- *         offset[0] += child.itemsize
+  /* "adios_mpi.pyx":1304
+ *         extra_attr = dict()
  * 
- *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
- *             t = child.type_num
- *             if end - f < 5:
+ *         for key, val in self.var.iteritems():             # <<<<<<<<<<<<<<
+ *             if not isinstance(val, varinfo):
+ *                 n = np.array(val)
  */
-    __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0);
-    if (__pyx_t_6) {
+  __pyx_t_4 = 0;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_self->var, 1, __pyx_n_s_iteritems, (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_3);
+  __pyx_t_3 = __pyx_t_7;
+  __pyx_t_7 = 0;
+  while (1) {
+    __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_5, &__pyx_t_4, &__pyx_t_7, &__pyx_t_8, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_9 == 0)) break;
+    if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_7);
+    __pyx_t_7 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_8);
+    __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":821
- * 
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num             # <<<<<<<<<<<<<<
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")
+    /* "adios_mpi.pyx":1305
+ * 
+ *         for key, val in self.var.iteritems():
+ *             if not isinstance(val, varinfo):             # <<<<<<<<<<<<<<
+ *                 n = np.array(val)
+ *                 extra_var[key] = varinfo(key, n.shape)
+ */
+    __pyx_t_10 = __Pyx_TypeCheck(__pyx_v_val, ((PyObject*)__pyx_ptype_9adios_mpi_varinfo)); 
+    __pyx_t_11 = ((!(__pyx_t_10 != 0)) != 0);
+    if (__pyx_t_11) {
+
+      /* "adios_mpi.pyx":1306
+ *         for key, val in self.var.iteritems():
+ *             if not isinstance(val, varinfo):
+ *                 n = np.array(val)             # <<<<<<<<<<<<<<
+ *                 extra_var[key] = varinfo(key, n.shape)
+ *                 extra_var[key].value = val
+ */
+      __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_array); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_12);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_7 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_12))) {
+        __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12);
+        if (likely(__pyx_t_7)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+          __Pyx_INCREF(__pyx_t_7);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_12, function);
+        }
+      }
+      if (!__pyx_t_7) {
+        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_v_val); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+      } else {
+        __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_13);
+        PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+        __Pyx_INCREF(__pyx_v_val);
+        PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_val);
+        __Pyx_GIVEREF(__pyx_v_val);
+        __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      __Pyx_XDECREF_SET(__pyx_v_n, __pyx_t_8);
+      __pyx_t_8 = 0;
+
+      /* "adios_mpi.pyx":1307
+ *             if not isinstance(val, varinfo):
+ *                 n = np.array(val)
+ *                 extra_var[key] = varinfo(key, n.shape)             # <<<<<<<<<<<<<<
+ *                 extra_var[key].value = val
+ *             else:
  */
-      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4);
-      __pyx_t_4 = 0;
+      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_n, __pyx_n_s_shape); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_12);
+      __Pyx_INCREF(__pyx_v_key);
+      PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_key);
+      __Pyx_GIVEREF(__pyx_v_key);
+      PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_8);
+      __Pyx_GIVEREF(__pyx_t_8);
+      __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_varinfo)), __pyx_t_12, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      if (unlikely(PyDict_SetItem(__pyx_v_extra_var, __pyx_v_key, __pyx_t_8) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":822
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num
- *             if end - f < 5:             # <<<<<<<<<<<<<<
- *                 raise RuntimeError(u"Format string allocated too short.")
- * 
+      /* "adios_mpi.pyx":1308
+ *                 n = np.array(val)
+ *                 extra_var[key] = varinfo(key, n.shape)
+ *                 extra_var[key].value = val             # <<<<<<<<<<<<<<
+ *             else:
+ *                 if self.is_noxml: val.define(self.gid)
  */
-      __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0);
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyDict_GetItem(__pyx_v_extra_var, __pyx_v_key); if (unlikely(__pyx_t_8 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+      __Pyx_GOTREF(__pyx_t_8);
+      if (__Pyx_PyObject_SetAttrStr(__pyx_t_8, __pyx_n_s_value, __pyx_v_val) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L5;
+    }
+    /*else*/ {
 
-        /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823
- *             t = child.type_num
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
+      /* "adios_mpi.pyx":1310
+ *                 extra_var[key].value = val
+ *             else:
+ *                 if self.is_noxml: val.define(self.gid)             # <<<<<<<<<<<<<<
+ * 
+ *         for key, val in extra_var.iteritems():
+ */
+      __pyx_t_11 = (__pyx_v_self->is_noxml != 0);
+      if (__pyx_t_11) {
+        __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_define); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_12);
+        __pyx_t_13 = __Pyx_PyInt_From_int64_t(__pyx_v_self->gid); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_13);
+        __pyx_t_7 = NULL;
+        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_12))) {
+          __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12);
+          if (likely(__pyx_t_7)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+            __Pyx_INCREF(__pyx_t_7);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_12, function);
+          }
+        }
+        if (!__pyx_t_7) {
+          __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_t_13); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+          __Pyx_GOTREF(__pyx_t_8);
+        } else {
+          __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_14);
+          PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
+          PyTuple_SET_ITEM(__pyx_t_14, 0+1, __pyx_t_13);
+          __Pyx_GIVEREF(__pyx_t_13);
+          __pyx_t_13 = 0;
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_14, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    __pyx_L5:;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "adios_mpi.pyx":1312
+ *                 if self.is_noxml: val.define(self.gid)
  * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
+ *         for key, val in extra_var.iteritems():             # <<<<<<<<<<<<<<
+ *             if self.is_noxml: val.define(self.gid)
+ *             self.var[key] = val
  */
-        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
+  __pyx_t_5 = 0;
+  __pyx_t_8 = __Pyx_dict_iterator(__pyx_v_extra_var, 1, __pyx_n_s_iteritems, (&__pyx_t_4), (&__pyx_t_6)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_3);
+  __pyx_t_3 = __pyx_t_8;
+  __pyx_t_8 = 0;
+  while (1) {
+    __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_4, &__pyx_t_5, &__pyx_t_8, &__pyx_t_12, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_9 == 0)) break;
+    if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_GOTREF(__pyx_t_12);
+    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_8);
+    __pyx_t_8 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_12);
+    __pyx_t_12 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826
+    /* "adios_mpi.pyx":1313
+ * 
+ *         for key, val in extra_var.iteritems():
+ *             if self.is_noxml: val.define(self.gid)             # <<<<<<<<<<<<<<
+ *             self.var[key] = val
  * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 98;
-        goto __pyx_L15;
+    __pyx_t_11 = (__pyx_v_self->is_noxml != 0);
+    if (__pyx_t_11) {
+      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_define); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_14 = __Pyx_PyInt_From_int64_t(__pyx_v_self->gid); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_14);
+      __pyx_t_13 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
+        __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_8);
+        if (likely(__pyx_t_13)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
+          __Pyx_INCREF(__pyx_t_13);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_8, function);
+        }
       }
+      if (!__pyx_t_13) {
+        __pyx_t_12 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_14); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+        __Pyx_GOTREF(__pyx_t_12);
+      } else {
+        __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_13); __Pyx_GIVEREF(__pyx_t_13); __pyx_t_13 = NULL;
+        PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_14);
+        __Pyx_GIVEREF(__pyx_t_14);
+        __pyx_t_14 = 0;
+        __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_7, NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_12);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      goto __pyx_L9;
+    }
+    __pyx_L9:;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":827
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+    /* "adios_mpi.pyx":1314
+ *         for key, val in extra_var.iteritems():
+ *             if self.is_noxml: val.define(self.gid)
+ *             self.var[key] = val             # <<<<<<<<<<<<<<
+ * 
+ *         for key, val in self.attr.iteritems():
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 66;
-        goto __pyx_L15;
-      }
+    if (unlikely(__pyx_v_self->var == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    if (unlikely(PyDict_SetItem(__pyx_v_self->var, __pyx_v_key, __pyx_v_val) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":828
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"
+  /* "adios_mpi.pyx":1316
+ *             self.var[key] = val
+ * 
+ *         for key, val in self.attr.iteritems():             # <<<<<<<<<<<<<<
+ *             if not isinstance(val, attrinfo):
+ *                 extra_attr[key] = attrinfo(key, val, np.array(val).dtype)
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 104;
-        goto __pyx_L15;
-      }
+  __pyx_t_4 = 0;
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_12 = __Pyx_dict_iterator(__pyx_v_self->attr, 1, __pyx_n_s_iteritems, (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_3);
+  __pyx_t_3 = __pyx_t_12;
+  __pyx_t_12 = 0;
+  while (1) {
+    __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_5, &__pyx_t_4, &__pyx_t_12, &__pyx_t_8, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_9 == 0)) break;
+    if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_12);
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_12);
+    __pyx_t_12 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_8);
+    __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":829
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
+    /* "adios_mpi.pyx":1317
+ * 
+ *         for key, val in self.attr.iteritems():
+ *             if not isinstance(val, attrinfo):             # <<<<<<<<<<<<<<
+ *                 extra_attr[key] = attrinfo(key, val, np.array(val).dtype)
+ *             else:
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 72;
-        goto __pyx_L15;
+    __pyx_t_11 = __Pyx_TypeCheck(__pyx_v_val, ((PyObject*)__pyx_ptype_9adios_mpi_attrinfo)); 
+    __pyx_t_10 = ((!(__pyx_t_11 != 0)) != 0);
+    if (__pyx_t_10) {
+
+      /* "adios_mpi.pyx":1318
+ *         for key, val in self.attr.iteritems():
+ *             if not isinstance(val, attrinfo):
+ *                 extra_attr[key] = attrinfo(key, val, np.array(val).dtype)             # <<<<<<<<<<<<<<
+ *             else:
+ *                 if self.is_noxml: val.define(self.gid)
+ */
+      __pyx_t_12 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_12);
+      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_array); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      __pyx_t_12 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) {
+        __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7);
+        if (likely(__pyx_t_12)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+          __Pyx_INCREF(__pyx_t_12);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_7, function);
+        }
+      }
+      if (!__pyx_t_12) {
+        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_v_val); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+      } else {
+        __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_14);
+        PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_12); __Pyx_GIVEREF(__pyx_t_12); __pyx_t_12 = NULL;
+        __Pyx_INCREF(__pyx_v_val);
+        PyTuple_SET_ITEM(__pyx_t_14, 0+1, __pyx_v_val);
+        __Pyx_GIVEREF(__pyx_v_val);
+        __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_14, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
       }
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_dtype); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_INCREF(__pyx_v_key);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_key);
+      __Pyx_GIVEREF(__pyx_v_key);
+      __Pyx_INCREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_val);
+      __Pyx_GIVEREF(__pyx_v_val);
+      PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
+      __pyx_t_7 = 0;
+      __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_attrinfo)), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      if (unlikely(PyDict_SetItem(__pyx_v_extra_attr, __pyx_v_key, __pyx_t_7) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L12;
+    }
+    /*else*/ {
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":830
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- */
-      __pyx_t_4 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 105;
-        goto __pyx_L15;
+      /* "adios_mpi.pyx":1320
+ *                 extra_attr[key] = attrinfo(key, val, np.array(val).dtype)
+ *             else:
+ *                 if self.is_noxml: val.define(self.gid)             # <<<<<<<<<<<<<<
+ * 
+ *         for key, val in extra_attr.iteritems():
+ */
+      __pyx_t_10 = (__pyx_v_self->is_noxml != 0);
+      if (__pyx_t_10) {
+        __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_define); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_14 = __Pyx_PyInt_From_int64_t(__pyx_v_self->gid); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_14);
+        __pyx_t_12 = NULL;
+        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
+          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_8);
+          if (likely(__pyx_t_12)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
+            __Pyx_INCREF(__pyx_t_12);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_8, function);
+          }
+        }
+        if (!__pyx_t_12) {
+          __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_14); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+          __Pyx_GOTREF(__pyx_t_7);
+        } else {
+          __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_13);
+          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_12); __Pyx_GIVEREF(__pyx_t_12); __pyx_t_12 = NULL;
+          PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_t_14);
+          __Pyx_GIVEREF(__pyx_t_14);
+          __pyx_t_14 = 0;
+          __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_13, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L13;
       }
+      __pyx_L13:;
+    }
+    __pyx_L12:;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":831
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+  /* "adios_mpi.pyx":1322
+ *                 if self.is_noxml: val.define(self.gid)
+ * 
+ *         for key, val in extra_attr.iteritems():             # <<<<<<<<<<<<<<
+ *             if self.is_noxml: val.define(self.gid)
+ * 
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 73;
-        goto __pyx_L15;
+  __pyx_t_5 = 0;
+  __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_extra_attr, 1, __pyx_n_s_iteritems, (&__pyx_t_4), (&__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_3);
+  __pyx_t_3 = __pyx_t_7;
+  __pyx_t_7 = 0;
+  while (1) {
+    __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_4, &__pyx_t_5, &__pyx_t_7, &__pyx_t_8, NULL, __pyx_t_6);
+    if (unlikely(__pyx_t_9 == 0)) break;
+    if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_7);
+    __pyx_t_7 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_8);
+    __pyx_t_8 = 0;
+
+    /* "adios_mpi.pyx":1323
+ * 
+ *         for key, val in extra_attr.iteritems():
+ *             if self.is_noxml: val.define(self.gid)             # <<<<<<<<<<<<<<
+ * 
+ *         groupsize = 0
+ */
+    __pyx_t_10 = (__pyx_v_self->is_noxml != 0);
+    if (__pyx_t_10) {
+      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_define); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_13 = __Pyx_PyInt_From_int64_t(__pyx_v_self->gid); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_13);
+      __pyx_t_14 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_7))) {
+        __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_7);
+        if (likely(__pyx_t_14)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+          __Pyx_INCREF(__pyx_t_14);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_7, function);
+        }
       }
+      if (!__pyx_t_14) {
+        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_13); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+        __Pyx_GOTREF(__pyx_t_8);
+      } else {
+        __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_12);
+        PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_14); __Pyx_GIVEREF(__pyx_t_14); __pyx_t_14 = NULL;
+        PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_13);
+        __Pyx_GIVEREF(__pyx_t_13);
+        __pyx_t_13 = 0;
+        __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L16;
+    }
+    __pyx_L16:;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":832
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+  /* "adios_mpi.pyx":1325
+ *             if self.is_noxml: val.define(self.gid)
+ * 
+ *         groupsize = 0             # <<<<<<<<<<<<<<
+ *         for var in self.var.values():
+ *             groupsize = groupsize + var.bytes()
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 108;
-        goto __pyx_L15;
-      }
+  __Pyx_INCREF(__pyx_int_0);
+  __pyx_v_groupsize = __pyx_int_0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":833
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+  /* "adios_mpi.pyx":1326
+ * 
+ *         groupsize = 0
+ *         for var in self.var.values():             # <<<<<<<<<<<<<<
+ *             groupsize = groupsize + var.bytes()
+ * 
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "values");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_3 = __Pyx_PyDict_Values(__pyx_v_self->var); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  if (likely(PyList_CheckExact(__pyx_t_3)) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_8 = __pyx_t_3; __Pyx_INCREF(__pyx_t_8); __pyx_t_4 = 0;
+    __pyx_t_15 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_15 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (likely(!__pyx_t_15)) {
+      if (likely(PyList_CheckExact(__pyx_t_8))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_8)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_3 = __pyx_t_15(__pyx_t_8);
+      if (unlikely(!__pyx_t_3)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 76;
-        goto __pyx_L15;
+    }
+    __Pyx_XDECREF_SET(__pyx_v_var, __pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "adios_mpi.pyx":1327
+ *         groupsize = 0
+ *         for var in self.var.values():
+ *             groupsize = groupsize + var.bytes()             # <<<<<<<<<<<<<<
+ * 
+ *         set_group_size(fd, groupsize)
+ */
+    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_var, __pyx_n_s_bytes_2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_12 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_7))) {
+      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7);
+      if (likely(__pyx_t_12)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+        __Pyx_INCREF(__pyx_t_12);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_7, function);
       }
+    }
+    if (__pyx_t_12) {
+      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_12); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+    } else {
+      __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __pyx_t_7 = PyNumber_Add(__pyx_v_groupsize, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF_SET(__pyx_v_groupsize, __pyx_t_7);
+    __pyx_t_7 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":834
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+    /* "adios_mpi.pyx":1326
+ * 
+ *         groupsize = 0
+ *         for var in self.var.values():             # <<<<<<<<<<<<<<
+ *             groupsize = groupsize + var.bytes()
+ * 
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 113;
-        goto __pyx_L15;
-      }
+  }
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":835
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+  /* "adios_mpi.pyx":1329
+ *             groupsize = groupsize + var.bytes()
+ * 
+ *         set_group_size(fd, groupsize)             # <<<<<<<<<<<<<<
+ * 
+ *         for var in self.var.values():
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 81;
-        goto __pyx_L15;
-      }
+  __pyx_t_16 = __Pyx_PyInt_As_uint64_t(__pyx_v_groupsize); if (unlikely((__pyx_t_16 == (uint64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_f_9adios_mpi_set_group_size(__pyx_v_fd, __pyx_t_16, 0);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":836
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+  /* "adios_mpi.pyx":1331
+ *         set_group_size(fd, groupsize)
+ * 
+ *         for var in self.var.values():             # <<<<<<<<<<<<<<
+ *             var.write(fd)
+ * 
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 102;
-        goto __pyx_L15;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "values");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_8 = __Pyx_PyDict_Values(__pyx_v_self->var); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  if (likely(PyList_CheckExact(__pyx_t_8)) || PyTuple_CheckExact(__pyx_t_8)) {
+    __pyx_t_7 = __pyx_t_8; __Pyx_INCREF(__pyx_t_7); __pyx_t_4 = 0;
+    __pyx_t_15 = NULL;
+  } else {
+    __pyx_t_4 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_t_8); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_15 = Py_TYPE(__pyx_t_7)->tp_iternext; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  for (;;) {
+    if (likely(!__pyx_t_15)) {
+      if (likely(PyList_CheckExact(__pyx_t_7))) {
+        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_7)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_8 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_4); __Pyx_INCREF(__pyx_t_8); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_4); __Pyx_INCREF(__pyx_t_8); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      }
+    } else {
+      __pyx_t_8 = __pyx_t_15(__pyx_t_7);
+      if (unlikely(!__pyx_t_8)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
       }
+      __Pyx_GOTREF(__pyx_t_8);
+    }
+    __Pyx_XDECREF_SET(__pyx_v_var, __pyx_t_8);
+    __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":837
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+    /* "adios_mpi.pyx":1332
+ * 
+ *         for var in self.var.values():
+ *             var.write(fd)             # <<<<<<<<<<<<<<
+ * 
+ *         close(fd)
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 100;
-        goto __pyx_L15;
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_var, __pyx_n_s_write); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_12 = __Pyx_PyInt_From_int64_t(__pyx_v_fd); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_12);
+    __pyx_t_13 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_13)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_13);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
       }
+    }
+    if (!__pyx_t_13) {
+      __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_12); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      __Pyx_GOTREF(__pyx_t_8);
+    } else {
+      __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_14);
+      PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13); __Pyx_GIVEREF(__pyx_t_13); __pyx_t_13 = NULL;
+      PyTuple_SET_ITEM(__pyx_t_14, 0+1, __pyx_t_12);
+      __Pyx_GIVEREF(__pyx_t_12);
+      __pyx_t_12 = 0;
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_14, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":838
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+    /* "adios_mpi.pyx":1331
+ *         set_group_size(fd, groupsize)
+ * 
+ *         for var in self.var.values():             # <<<<<<<<<<<<<<
+ *             var.write(fd)
+ * 
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 103;
-        goto __pyx_L15;
-      }
+  }
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":839
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+  /* "adios_mpi.pyx":1334
+ *             var.write(fd)
+ * 
+ *         close(fd)             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 102;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
+  __pyx_f_9adios_mpi_close(__pyx_v_fd, 0);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":840
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+  /* "adios_mpi.pyx":1295
+ *             raise KeyError(name)
+ * 
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         """
+ *         Write variables and attributes to a file and close the writer.
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 100;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":841
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- *             else:
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_13);
+  __Pyx_XDECREF(__pyx_t_14);
+  __Pyx_AddTraceback("adios_mpi.writer.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_extra_var);
+  __Pyx_XDECREF(__pyx_v_extra_attr);
+  __Pyx_XDECREF(__pyx_v_key);
+  __Pyx_XDECREF(__pyx_v_val);
+  __Pyx_XDECREF(__pyx_v_n);
+  __Pyx_XDECREF(__pyx_v_groupsize);
+  __Pyx_XDECREF(__pyx_v_var);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1336
+ *         close(fd)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosWriter (fname=%r, gname=%r, "
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 103;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":842
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_6writer_17__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_6writer_17__repr__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_6writer_16__repr__(((struct __pyx_obj_9adios_mpi_writer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_6writer_16__repr__(struct __pyx_obj_9adios_mpi_writer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__repr__", 0);
+
+  /* "adios_mpi.pyx":1337
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosWriter (fname=%r, gname=%r, "             # <<<<<<<<<<<<<<
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \
+ *                 (self.fname,
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 79;
-        goto __pyx_L15;
-      }
-      /*else*/ {
+  __Pyx_XDECREF(__pyx_r);
 
-        /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":844
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
- *             f += 1
- *         else:
+  /* "adios_mpi.pyx":1343
+ *                  self.method,
+ *                  self.method_params,
+ *                  self.var.keys(),             # <<<<<<<<<<<<<<
+ *                  self.attr.keys())
+ * 
  */
-        __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
-        __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_t_3 = 0;
-        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      __pyx_L15:;
+  if (unlikely(__pyx_v_self->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = __Pyx_PyDict_Keys(__pyx_v_self->var); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":845
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- *             f += 1             # <<<<<<<<<<<<<<
- *         else:
- *             # Cython ignores struct boundary information ("T{...}"),
+  /* "adios_mpi.pyx":1344
+ *                  self.method_params,
+ *                  self.var.keys(),
+ *                  self.attr.keys())             # <<<<<<<<<<<<<<
+ * 
+ * cdef class attrinfo:
  */
-      __pyx_v_f = (__pyx_v_f + 1);
-      goto __pyx_L13;
-    }
-    /*else*/ {
+  if (unlikely(__pyx_v_self->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "keys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_2 = __Pyx_PyDict_Keys(__pyx_v_self->attr); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
 
-      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":849
- *             # Cython ignores struct boundary information ("T{...}"),
- *             # so don't output it
- *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
- *     return f
+  /* "adios_mpi.pyx":1339
+ *         return ("AdiosWriter (fname=%r, gname=%r, "
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \
+ *                 (self.fname,             # <<<<<<<<<<<<<<
+ *                  self.gname,
+ *                  self.method,
+ */
+  __pyx_t_3 = PyTuple_New(6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_INCREF(__pyx_v_self->fname);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->fname);
+  __Pyx_GIVEREF(__pyx_v_self->fname);
+  __Pyx_INCREF(__pyx_v_self->gname);
+  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->gname);
+  __Pyx_GIVEREF(__pyx_v_self->gname);
+  __Pyx_INCREF(__pyx_v_self->method);
+  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_self->method);
+  __Pyx_GIVEREF(__pyx_v_self->method);
+  __Pyx_INCREF(__pyx_v_self->method_params);
+  PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_v_self->method_params);
+  __Pyx_GIVEREF(__pyx_v_self->method_params);
+  PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1338
+ *     def __repr__(self):
+ *         return ("AdiosWriter (fname=%r, gname=%r, "
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.fname,
+ *                  self.gname,
+ */
+  __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_AdiosWriter_fname_r_gname_r_meth, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1338; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1336
+ *         close(fd)
  * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosWriter (fname=%r, gname=%r, "
+ *                 "method=%r, method_params=%r, var=%r, attr=%r)") % \
  */
-      __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_f = __pyx_t_9;
-    }
-    __pyx_L13:;
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794
- *     cdef tuple fields
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios_mpi.writer.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1353
+ * 
+ *     property name:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
  * 
- *     for childname in descr.names:             # <<<<<<<<<<<<<<
- *         fields = descr.fields[childname]
- *         child, new_offset = fields
  */
-  }
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":850
- *             # so don't output it
- *             f = _util_dtypestring(child, f, end, offset)
- *     return f             # <<<<<<<<<<<<<<
- * 
- * 
- */
-  __pyx_r = __pyx_v_f;
-  goto __pyx_L0;
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_4name_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_8attrinfo_4name___get__(((struct __pyx_obj_9adios_mpi_attrinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_4name___get__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1354
+ *     property name:
+ *         def __get__(self):
+ *             return self.name             # <<<<<<<<<<<<<<
+ * 
+ *     property is_static:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->name);
+  __pyx_r = __pyx_v_self->name;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1353
+ * 
+ *     property name:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.name
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1357
+ * 
+ *     property is_static:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_static
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_9is_static_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_9is_static_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_8attrinfo_9is_static___get__(((struct __pyx_obj_9adios_mpi_attrinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_9is_static___get__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1358
+ *     property is_static:
+ *         def __get__(self):
+ *             return self.is_static             # <<<<<<<<<<<<<<
+ * 
+ *     property dtype:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_static); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1358; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1357
+ * 
+ *     property is_static:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.is_static
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.attrinfo.is_static.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1361
+ * 
+ *     property dtype:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_5dtype_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_5dtype_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_8attrinfo_5dtype___get__(((struct __pyx_obj_9adios_mpi_attrinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_5dtype___get__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1362
+ *     property dtype:
+ *         def __get__(self):
+ *             return self.dtype             # <<<<<<<<<<<<<<
+ * 
+ *     property value:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->dtype);
+  __pyx_r = __pyx_v_self->dtype;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1361
+ * 
+ *     property dtype:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.dtype
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1365
+ * 
+ *     property value:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.value
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_5value_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_5value_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_8attrinfo_5value___get__(((struct __pyx_obj_9adios_mpi_attrinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_5value___get__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+
+  /* "adios_mpi.pyx":1366
+ *     property value:
+ *         def __get__(self):
+ *             return self.value             # <<<<<<<<<<<<<<
+ * 
+ *         def __set__(self, value):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->value);
+  __pyx_r = __pyx_v_self->value;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1365
+ * 
+ *     property value:
+ *         def __get__(self):             # <<<<<<<<<<<<<<
+ *             return self.value
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1368
+ *             return self.value
+ * 
+ *         def __set__(self, value):             # <<<<<<<<<<<<<<
+ *             self.value = value
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_8attrinfo_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_9adios_mpi_8attrinfo_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_8attrinfo_5value_2__set__(((struct __pyx_obj_9adios_mpi_attrinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_8attrinfo_5value_2__set__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+
+  /* "adios_mpi.pyx":1369
+ * 
+ *         def __set__(self, value):
+ *             self.value = value             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, char * name,
+ */
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->value);
+  __Pyx_DECREF(__pyx_v_self->value);
+  __pyx_v_self->value = __pyx_v_value;
+
+  /* "adios_mpi.pyx":1368
+ *             return self.value
+ * 
+ *         def __set__(self, value):             # <<<<<<<<<<<<<<
+ *             self.value = value
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1371
+ *             self.value = value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  value = None,
+ *                  dtype = None,
+ */
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_8attrinfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_9adios_mpi_8attrinfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_name;
+  PyObject *__pyx_v_value = 0;
+  PyObject *__pyx_v_dtype = 0;
+  int __pyx_v_is_static;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,&__pyx_n_s_value,&__pyx_n_s_dtype,&__pyx_n_s_is_static,0};
+    PyObject* values[4] = {0,0,0,0};
+
+    /* "adios_mpi.pyx":1372
+ * 
+ *     def __init__(self, char * name,
+ *                  value = None,             # <<<<<<<<<<<<<<
+ *                  dtype = None,
+ *                  bint is_static = True):
+ */
+    values[1] = ((PyObject *)Py_None);
+
+    /* "adios_mpi.pyx":1373
+ *     def __init__(self, char * name,
+ *                  value = None,
+ *                  dtype = None,             # <<<<<<<<<<<<<<
+ *                  bint is_static = True):
+ *         self.name = name
+ */
+    values[2] = ((PyObject *)Py_None);
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dtype);
+          if (value) { values[2] = value; kw_args--; }
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_is_static);
+          if (value) { values[3] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1371; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1371; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_value = values[1];
+    __pyx_v_dtype = values[2];
+    if (values[3]) {
+      __pyx_v_is_static = __Pyx_PyObject_IsTrue(values[3]); if (unlikely((__pyx_v_is_static == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    } else {
+
+      /* "adios_mpi.pyx":1374
+ *                  value = None,
+ *                  dtype = None,
+ *                  bint is_static = True):             # <<<<<<<<<<<<<<
+ *         self.name = name
+ *         self.value = value
+ */
+      __pyx_v_is_static = ((int)1);
+    }
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1371; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.attrinfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_8attrinfo___init__(((struct __pyx_obj_9adios_mpi_attrinfo *)__pyx_v_self), __pyx_v_name, __pyx_v_value, __pyx_v_dtype, __pyx_v_is_static);
+
+  /* "adios_mpi.pyx":1371
+ *             self.value = value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  value = None,
+ *                  dtype = None,
+ */
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_8attrinfo___init__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self, char *__pyx_v_name, PyObject *__pyx_v_value, PyObject *__pyx_v_dtype, int __pyx_v_is_static) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__init__", 0);
+
+  /* "adios_mpi.pyx":1375
+ *                  dtype = None,
+ *                  bint is_static = True):
+ *         self.name = name             # <<<<<<<<<<<<<<
+ *         self.value = value
+ *         self.dtype = dtype
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->name);
+  __Pyx_DECREF(__pyx_v_self->name);
+  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":1376
+ *                  bint is_static = True):
+ *         self.name = name
+ *         self.value = value             # <<<<<<<<<<<<<<
+ *         self.dtype = dtype
+ *         self.is_static = is_static
+ */
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->value);
+  __Pyx_DECREF(__pyx_v_self->value);
+  __pyx_v_self->value = __pyx_v_value;
+
+  /* "adios_mpi.pyx":1377
+ *         self.name = name
+ *         self.value = value
+ *         self.dtype = dtype             # <<<<<<<<<<<<<<
+ *         self.is_static = is_static
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_dtype);
+  __Pyx_GIVEREF(__pyx_v_dtype);
+  __Pyx_GOTREF(__pyx_v_self->dtype);
+  __Pyx_DECREF(__pyx_v_self->dtype);
+  __pyx_v_self->dtype = __pyx_v_dtype;
+
+  /* "adios_mpi.pyx":1378
+ *         self.value = value
+ *         self.dtype = dtype
+ *         self.is_static = is_static             # <<<<<<<<<<<<<<
+ * 
+ *     def define(self, int64_t gid):
+ */
+  __pyx_v_self->is_static = __pyx_v_is_static;
+
+  /* "adios_mpi.pyx":1371
+ *             self.value = value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  value = None,
+ *                  dtype = None,
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.attrinfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1380
+ *         self.is_static = is_static
+ * 
+ *     def define(self, int64_t gid):             # <<<<<<<<<<<<<<
+ *         if self.is_static:
+ *             if self.value is None:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_3define(PyObject *__pyx_v_self, PyObject *__pyx_arg_gid); /*proto*/
+static char __pyx_doc_9adios_mpi_8attrinfo_2define[] = "attrinfo.define(self, int64_t gid)";
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_3define(PyObject *__pyx_v_self, PyObject *__pyx_arg_gid) {
+  int64_t __pyx_v_gid;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define (wrapper)", 0);
+  assert(__pyx_arg_gid); {
+    __pyx_v_gid = __Pyx_PyInt_As_int64_t(__pyx_arg_gid); if (unlikely((__pyx_v_gid == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.attrinfo.define", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_8attrinfo_2define(((struct __pyx_obj_9adios_mpi_attrinfo *)__pyx_v_self), ((int64_t)__pyx_v_gid));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_2define(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self, int64_t __pyx_v_gid) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  char *__pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define", 0);
+
+  /* "adios_mpi.pyx":1381
+ * 
+ *     def define(self, int64_t gid):
+ *         if self.is_static:             # <<<<<<<<<<<<<<
+ *             if self.value is None:
+ *                 raise TypeError("Value is none")
+ */
+  __pyx_t_1 = (__pyx_v_self->is_static != 0);
+  if (__pyx_t_1) {
+
+    /* "adios_mpi.pyx":1382
+ *     def define(self, int64_t gid):
+ *         if self.is_static:
+ *             if self.value is None:             # <<<<<<<<<<<<<<
+ *                 raise TypeError("Value is none")
+ * 
+ */
+    __pyx_t_1 = (__pyx_v_self->value == Py_None);
+    __pyx_t_2 = (__pyx_t_1 != 0);
+    if (__pyx_t_2) {
+
+      /* "adios_mpi.pyx":1383
+ *         if self.is_static:
+ *             if self.value is None:
+ *                 raise TypeError("Value is none")             # <<<<<<<<<<<<<<
+ * 
+ *             define_attribute_byvalue(gid, self.name, "", self.value)
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "adios_mpi.pyx":1385
+ *                 raise TypeError("Value is none")
+ * 
+ *             define_attribute_byvalue(gid, self.name, "", self.value)             # <<<<<<<<<<<<<<
+ *         else:
+ *             ##atype = np2adiostype(np.dtype(self.dtype))
+ */
+    __pyx_t_4 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __pyx_v_self->value;
+    __Pyx_INCREF(__pyx_t_3);
+    __pyx_f_9adios_mpi_define_attribute_byvalue(__pyx_v_gid, __pyx_t_4, __pyx_k__7, __pyx_t_3, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "adios_mpi.pyx":1390
+ *             ##define_attribute(gid, self.name, "",
+ *             ##                 atype, "", str(self.value))
+ *             raise NotImplementedError             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
+ */
+    __Pyx_Raise(__pyx_builtin_NotImplementedError, 0, 0, 0);
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_L3:;
+
+  /* "adios_mpi.pyx":1380
+ *         self.is_static = is_static
+ * 
+ *     def define(self, int64_t gid):             # <<<<<<<<<<<<<<
+ *         if self.is_static:
+ *             if self.value is None:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("adios_mpi.attrinfo.define", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1392
+ *             raise NotImplementedError
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+ *                 (self.name,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_5__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_8attrinfo_5__repr__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_8attrinfo_4__repr__(((struct __pyx_obj_9adios_mpi_attrinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_8attrinfo_4__repr__(struct __pyx_obj_9adios_mpi_attrinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__repr__", 0);
+
+  /* "adios_mpi.pyx":1393
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.name,
+ *                  self.is_static,
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "adios_mpi.pyx":1395
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+ *                 (self.name,
+ *                  self.is_static,             # <<<<<<<<<<<<<<
+ *                  self.value,
+ *                  self.dtype)
+ */
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->is_static); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "adios_mpi.pyx":1394
+ *     def __repr__(self):
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+ *                 (self.name,             # <<<<<<<<<<<<<<
+ *                  self.is_static,
+ *                  self.value,
+ */
+  __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_self->name);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->name);
+  __Pyx_GIVEREF(__pyx_v_self->name);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_self->value);
+  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->value);
+  __Pyx_GIVEREF(__pyx_v_self->value);
+  __Pyx_INCREF(__pyx_v_self->dtype);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->dtype);
+  __Pyx_GIVEREF(__pyx_v_self->dtype);
+  __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":1393
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.name,
+ *                  self.is_static,
+ */
+  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_AdiosAttrinfo_name_r_is_static_r, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1392
+ *             raise NotImplementedError
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+ *                 (self.name,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("adios_mpi.attrinfo.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1406
+ *     cdef public value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  ldim = tuple(),
+ *                  gdim = tuple(),
+ */
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_7varinfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_9adios_mpi_7varinfo_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_name;
+  PyObject *__pyx_v_ldim = 0;
+  PyObject *__pyx_v_gdim = 0;
+  PyObject *__pyx_v_offset = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,&__pyx_n_s_ldim,&__pyx_n_s_gdim,&__pyx_n_s_offset,0};
+    PyObject* values[4] = {0,0,0,0};
+    values[1] = __pyx_k__27;
+    values[2] = __pyx_k__28;
+    values[3] = __pyx_k__29;
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ldim);
+          if (value) { values[1] = value; kw_args--; }
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gdim);
+          if (value) { values[2] = value; kw_args--; }
+        }
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_offset);
+          if (value) { values[3] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1406; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_name = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_name) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1406; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_ldim = values[1];
+    __pyx_v_gdim = values[2];
+    __pyx_v_offset = values[3];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1406; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.varinfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo___init__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self), __pyx_v_name, __pyx_v_ldim, __pyx_v_gdim, __pyx_v_offset);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_7varinfo___init__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, char *__pyx_v_name, PyObject *__pyx_v_ldim, PyObject *__pyx_v_gdim, PyObject *__pyx_v_offset) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__init__", 0);
+
+  /* "adios_mpi.pyx":1410
+ *                  gdim = tuple(),
+ *                  offset = tuple()):
+ *         self.name = name             # <<<<<<<<<<<<<<
+ *         self.ldim = ldim
+ *         self.gdim = gdim
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->name);
+  __Pyx_DECREF(__pyx_v_self->name);
+  __pyx_v_self->name = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":1411
+ *                  offset = tuple()):
+ *         self.name = name
+ *         self.ldim = ldim             # <<<<<<<<<<<<<<
+ *         self.gdim = gdim
+ *         self.offset = offset
+ */
+  __Pyx_INCREF(__pyx_v_ldim);
+  __Pyx_GIVEREF(__pyx_v_ldim);
+  __Pyx_GOTREF(__pyx_v_self->ldim);
+  __Pyx_DECREF(__pyx_v_self->ldim);
+  __pyx_v_self->ldim = __pyx_v_ldim;
+
+  /* "adios_mpi.pyx":1412
+ *         self.name = name
+ *         self.ldim = ldim
+ *         self.gdim = gdim             # <<<<<<<<<<<<<<
+ *         self.offset = offset
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_gdim);
+  __Pyx_GIVEREF(__pyx_v_gdim);
+  __Pyx_GOTREF(__pyx_v_self->gdim);
+  __Pyx_DECREF(__pyx_v_self->gdim);
+  __pyx_v_self->gdim = __pyx_v_gdim;
+
+  /* "adios_mpi.pyx":1413
+ *         self.ldim = ldim
+ *         self.gdim = gdim
+ *         self.offset = offset             # <<<<<<<<<<<<<<
+ * 
+ *     def define(self, int64_t gid):
+ */
+  __Pyx_INCREF(__pyx_v_offset);
+  __Pyx_GIVEREF(__pyx_v_offset);
+  __Pyx_GOTREF(__pyx_v_self->offset);
+  __Pyx_DECREF(__pyx_v_self->offset);
+  __pyx_v_self->offset = __pyx_v_offset;
+
+  /* "adios_mpi.pyx":1406
+ *     cdef public value
+ * 
+ *     def __init__(self, char * name,             # <<<<<<<<<<<<<<
+ *                  ldim = tuple(),
+ *                  gdim = tuple(),
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("adios_mpi.varinfo.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1415
+ *         self.offset = offset
+ * 
+ *     def define(self, int64_t gid):             # <<<<<<<<<<<<<<
+ *         if self.value is None:
+ *             raise TypeError("Value is none")
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_3define(PyObject *__pyx_v_self, PyObject *__pyx_arg_gid); /*proto*/
+static char __pyx_doc_9adios_mpi_7varinfo_2define[] = "varinfo.define(self, int64_t gid)";
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_3define(PyObject *__pyx_v_self, PyObject *__pyx_arg_gid) {
+  int64_t __pyx_v_gid;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("define (wrapper)", 0);
+  assert(__pyx_arg_gid); {
+    __pyx_v_gid = __Pyx_PyInt_As_int64_t(__pyx_arg_gid); if (unlikely((__pyx_v_gid == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1415; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.varinfo.define", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_2define(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self), ((int64_t)__pyx_v_gid));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_2define(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, int64_t __pyx_v_gid) {
+  PyObject *__pyx_v_ldim_ = NULL;
+  PyObject *__pyx_v_gdim_ = NULL;
+  PyObject *__pyx_v_offset_ = NULL;
+  PyObject *__pyx_v_val_ = NULL;
+  PyObject *__pyx_v_atype = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  char *__pyx_t_8;
+  int __pyx_t_9;
+  char *__pyx_t_10;
+  char *__pyx_t_11;
+  char *__pyx_t_12;
+  struct __pyx_opt_args_9adios_mpi_define_var __pyx_t_13;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("define", 0);
+
+  /* "adios_mpi.pyx":1416
+ * 
+ *     def define(self, int64_t gid):
+ *         if self.value is None:             # <<<<<<<<<<<<<<
+ *             raise TypeError("Value is none")
+ * 
+ */
+  __pyx_t_1 = (__pyx_v_self->value == Py_None);
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
+
+    /* "adios_mpi.pyx":1417
+ *     def define(self, int64_t gid):
+ *         if self.value is None:
+ *             raise TypeError("Value is none")             # <<<<<<<<<<<<<<
+ * 
+ *         ldim_ = self.ldim
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__30, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "adios_mpi.pyx":1419
+ *             raise TypeError("Value is none")
+ * 
+ *         ldim_ = self.ldim             # <<<<<<<<<<<<<<
+ *         if isinstance(self.ldim, (tuple, list)):
+ *             ldim_ = tuple(self.ldim)
+ */
+  __pyx_t_3 = __pyx_v_self->ldim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_ldim_ = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios_mpi.pyx":1420
+ * 
+ *         ldim_ = self.ldim
+ *         if isinstance(self.ldim, (tuple, list)):             # <<<<<<<<<<<<<<
+ *             ldim_ = tuple(self.ldim)
+ * 
+ */
+  __pyx_t_3 = __pyx_v_self->ldim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_1 = PyTuple_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_4 = (__pyx_t_1 != 0);
+  if (!__pyx_t_4) {
+  } else {
+    __pyx_t_2 = __pyx_t_4;
+    goto __pyx_L5_bool_binop_done;
+  }
+  __pyx_t_3 = __pyx_v_self->ldim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_4 = PyList_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_1 = (__pyx_t_4 != 0);
+  __pyx_t_2 = __pyx_t_1;
+  __pyx_L5_bool_binop_done:;
+  __pyx_t_1 = (__pyx_t_2 != 0);
+  if (__pyx_t_1) {
+
+    /* "adios_mpi.pyx":1421
+ *         ldim_ = self.ldim
+ *         if isinstance(self.ldim, (tuple, list)):
+ *             ldim_ = tuple(self.ldim)             # <<<<<<<<<<<<<<
+ * 
+ *         gdim_ = self.gdim
+ */
+    __pyx_t_3 = PySequence_Tuple(__pyx_v_self->ldim); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF_SET(__pyx_v_ldim_, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L4;
+  }
+  __pyx_L4:;
+
+  /* "adios_mpi.pyx":1423
+ *             ldim_ = tuple(self.ldim)
+ * 
+ *         gdim_ = self.gdim             # <<<<<<<<<<<<<<
+ *         if isinstance(self.gdim, (tuple, list)):
+ *             gdim_ = tuple(self.gdim)
+ */
+  __pyx_t_3 = __pyx_v_self->gdim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_gdim_ = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios_mpi.pyx":1424
+ * 
+ *         gdim_ = self.gdim
+ *         if isinstance(self.gdim, (tuple, list)):             # <<<<<<<<<<<<<<
+ *             gdim_ = tuple(self.gdim)
+ * 
+ */
+  __pyx_t_3 = __pyx_v_self->gdim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_2 = PyTuple_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_4 = (__pyx_t_2 != 0);
+  if (!__pyx_t_4) {
+  } else {
+    __pyx_t_1 = __pyx_t_4;
+    goto __pyx_L8_bool_binop_done;
+  }
+  __pyx_t_3 = __pyx_v_self->gdim;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_4 = PyList_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_2 = (__pyx_t_4 != 0);
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L8_bool_binop_done:;
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
+
+    /* "adios_mpi.pyx":1425
+ *         gdim_ = self.gdim
+ *         if isinstance(self.gdim, (tuple, list)):
+ *             gdim_ = tuple(self.gdim)             # <<<<<<<<<<<<<<
+ * 
+ *         offset_ = self.offset
+ */
+    __pyx_t_3 = PySequence_Tuple(__pyx_v_self->gdim); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF_SET(__pyx_v_gdim_, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L7;
+  }
+  __pyx_L7:;
+
+  /* "adios_mpi.pyx":1427
+ *             gdim_ = tuple(self.gdim)
+ * 
+ *         offset_ = self.offset             # <<<<<<<<<<<<<<
+ *         if isinstance(self.offset, (tuple, list)):
+ *             offset_ = tuple(self.offset)
+ */
+  __pyx_t_3 = __pyx_v_self->offset;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_offset_ = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios_mpi.pyx":1428
+ * 
+ *         offset_ = self.offset
+ *         if isinstance(self.offset, (tuple, list)):             # <<<<<<<<<<<<<<
+ *             offset_ = tuple(self.offset)
+ * 
+ */
+  __pyx_t_3 = __pyx_v_self->offset;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_1 = PyTuple_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_4 = (__pyx_t_1 != 0);
+  if (!__pyx_t_4) {
+  } else {
+    __pyx_t_2 = __pyx_t_4;
+    goto __pyx_L11_bool_binop_done;
+  }
+  __pyx_t_3 = __pyx_v_self->offset;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_4 = PyList_Check(__pyx_t_3); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_1 = (__pyx_t_4 != 0);
+  __pyx_t_2 = __pyx_t_1;
+  __pyx_L11_bool_binop_done:;
+  __pyx_t_1 = (__pyx_t_2 != 0);
+  if (__pyx_t_1) {
+
+    /* "adios_mpi.pyx":1429
+ *         offset_ = self.offset
+ *         if isinstance(self.offset, (tuple, list)):
+ *             offset_ = tuple(self.offset)             # <<<<<<<<<<<<<<
+ * 
+ *         val_ = self.value
+ */
+    __pyx_t_3 = PySequence_Tuple(__pyx_v_self->offset); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF_SET(__pyx_v_offset_, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L10;
+  }
+  __pyx_L10:;
+
+  /* "adios_mpi.pyx":1431
+ *             offset_ = tuple(self.offset)
+ * 
+ *         val_ = self.value             # <<<<<<<<<<<<<<
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)
+ */
+  __pyx_t_3 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_val_ = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "adios_mpi.pyx":1432
+ * 
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *             val_ = np.array(self.value)
+ * 
+ */
+  __pyx_t_3 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_1 = __Pyx_TypeCheck(__pyx_t_3, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
+  if (__pyx_t_2) {
+
+    /* "adios_mpi.pyx":1433
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)             # <<<<<<<<<<<<<<
+ * 
+ *         atype = np2adiostype(val_.dtype)
+ */
+    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_array); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_6))) {
+      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6);
+      if (likely(__pyx_t_5)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+        __Pyx_INCREF(__pyx_t_5);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_6, function);
+      }
+    }
+    if (!__pyx_t_5) {
+      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_v_self->value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+    } else {
+      __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
+      __Pyx_INCREF(__pyx_v_self->value);
+      PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_v_self->value);
+      __Pyx_GIVEREF(__pyx_v_self->value);
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_DECREF_SET(__pyx_v_val_, __pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L13;
+  }
+  __pyx_L13:;
+
+  /* "adios_mpi.pyx":1435
+ *             val_ = np.array(self.value)
+ * 
+ *         atype = np2adiostype(val_.dtype)             # <<<<<<<<<<<<<<
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_val_, __pyx_n_s_dtype); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __pyx_f_9adios_mpi_np2adiostype(((PyArray_Descr *)__pyx_t_3), 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_atype = __pyx_t_6;
+  __pyx_t_6 = 0;
+
+  /* "adios_mpi.pyx":1437
+ *         atype = np2adiostype(val_.dtype)
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,             # <<<<<<<<<<<<<<
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ */
+  __pyx_t_8 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_atype); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":1438
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,
+ *                    str(ldim_).replace(' ', '').strip('(,)'),             # <<<<<<<<<<<<<<
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ */
+  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_v_ldim_);
+  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_ldim_);
+  __Pyx_GIVEREF(__pyx_v_ldim_);
+  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_replace); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__32, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_strip); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__34, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_10 = __Pyx_PyObject_AsString(__pyx_t_3); if (unlikely((!__pyx_t_10) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":1439
+ *         define_var(gid, self.name, "", atype,
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),             # <<<<<<<<<<<<<<
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ * 
+ */
+  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_v_gdim_);
+  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_gdim_);
+  __Pyx_GIVEREF(__pyx_v_gdim_);
+  __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_6, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_replace); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_strip); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__36, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_11 = __Pyx_PyObject_AsString(__pyx_t_7); if (unlikely((!__pyx_t_11) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":1440
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ *                    str(offset_).replace(' ', '').strip('(,)'))             # <<<<<<<<<<<<<<
+ * 
+ *     def bytes(self):
+ */
+  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_v_offset_);
+  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_offset_);
+  __Pyx_GIVEREF(__pyx_v_offset_);
+  __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_replace); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__37, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_strip); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_12 = __Pyx_PyObject_AsString(__pyx_t_5); if (unlikely((!__pyx_t_12) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":1437
+ *         atype = np2adiostype(val_.dtype)
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,             # <<<<<<<<<<<<<<
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ */
+  __pyx_t_13.__pyx_n = 3;
+  __pyx_t_13.dimensions = __pyx_t_10;
+  __pyx_t_13.global_dimensions = __pyx_t_11;
+  __pyx_t_13.local_offsets = __pyx_t_12;
+  __pyx_f_9adios_mpi_define_var(__pyx_v_gid, __pyx_t_8, __pyx_k__7, __pyx_t_9, 0, &__pyx_t_13); 
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+  /* "adios_mpi.pyx":1415
+ *         self.offset = offset
+ * 
+ *     def define(self, int64_t gid):             # <<<<<<<<<<<<<<
+ *         if self.value is None:
+ *             raise TypeError("Value is none")
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("adios_mpi.varinfo.define", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_ldim_);
+  __Pyx_XDECREF(__pyx_v_gdim_);
+  __Pyx_XDECREF(__pyx_v_offset_);
+  __Pyx_XDECREF(__pyx_v_val_);
+  __Pyx_XDECREF(__pyx_v_atype);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1442
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ * 
+ *     def bytes(self):             # <<<<<<<<<<<<<<
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_5bytes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_9adios_mpi_7varinfo_4bytes[] = "varinfo.bytes(self)";
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_5bytes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("bytes (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_4bytes(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_4bytes(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  PyObject *__pyx_v_val_ = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("bytes", 0);
+
+  /* "adios_mpi.pyx":1443
+ * 
+ *     def bytes(self):
+ *         val_ = self.value             # <<<<<<<<<<<<<<
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)
+ */
+  __pyx_t_1 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_v_val_ = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":1444
+ *     def bytes(self):
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *             val_ = np.array(self.value)
+ * 
+ */
+  __pyx_t_1 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_TypeCheck(__pyx_t_1, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0);
+  if (__pyx_t_3) {
+
+    /* "adios_mpi.pyx":1445
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)             # <<<<<<<<<<<<<<
+ * 
+ *         return val_.size * val_.itemsize
+ */
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_5, function);
+      }
+    }
+    if (!__pyx_t_4) {
+      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_self->value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+    } else {
+      __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = NULL;
+      __Pyx_INCREF(__pyx_v_self->value);
+      PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_v_self->value);
+      __Pyx_GIVEREF(__pyx_v_self->value);
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF_SET(__pyx_v_val_, __pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios_mpi.pyx":1447
+ *             val_ = np.array(self.value)
+ * 
+ *         return val_.size * val_.itemsize             # <<<<<<<<<<<<<<
+ * 
+ *     def write(self, int64_t fd):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_val_, __pyx_n_s_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_val_, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_6 = PyNumber_Multiply(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_r = __pyx_t_6;
+  __pyx_t_6 = 0;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1442
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ * 
+ *     def bytes(self):             # <<<<<<<<<<<<<<
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("adios_mpi.varinfo.bytes", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_val_);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1449
+ *         return val_.size * val_.itemsize
+ * 
+ *     def write(self, int64_t fd):             # <<<<<<<<<<<<<<
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_7write(PyObject *__pyx_v_self, PyObject *__pyx_arg_fd); /*proto*/
+static char __pyx_doc_9adios_mpi_7varinfo_6write[] = "varinfo.write(self, int64_t fd)";
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_7write(PyObject *__pyx_v_self, PyObject *__pyx_arg_fd) {
+  int64_t __pyx_v_fd;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write (wrapper)", 0);
+  assert(__pyx_arg_fd); {
+    __pyx_v_fd = __Pyx_PyInt_As_int64_t(__pyx_arg_fd); if (unlikely((__pyx_v_fd == (int64_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1449; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.varinfo.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_6write(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self), ((int64_t)__pyx_v_fd));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_6write(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, int64_t __pyx_v_fd) {
+  PyObject *__pyx_v_val_ = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  char *__pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write", 0);
+
+  /* "adios_mpi.pyx":1450
+ * 
+ *     def write(self, int64_t fd):
+ *         val_ = self.value             # <<<<<<<<<<<<<<
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)
+ */
+  __pyx_t_1 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_v_val_ = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":1451
+ *     def write(self, int64_t fd):
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):             # <<<<<<<<<<<<<<
+ *             val_ = np.array(self.value)
+ * 
+ */
+  __pyx_t_1 = __pyx_v_self->value;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_TypeCheck(__pyx_t_1, ((PyObject*)__pyx_ptype_5numpy_ndarray)); 
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0);
+  if (__pyx_t_3) {
+
+    /* "adios_mpi.pyx":1452
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ *             val_ = np.array(self.value)             # <<<<<<<<<<<<<<
+ * 
+ *         write(fd, self.name, val_)
+ */
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = NULL;
+    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_5, function);
+      }
+    }
+    if (!__pyx_t_4) {
+      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_self->value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+    } else {
+      __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = NULL;
+      __Pyx_INCREF(__pyx_v_self->value);
+      PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_v_self->value);
+      __Pyx_GIVEREF(__pyx_v_self->value);
+      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF_SET(__pyx_v_val_, __pyx_t_1);
+    __pyx_t_1 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "adios_mpi.pyx":1454
+ *             val_ = np.array(self.value)
+ * 
+ *         write(fd, self.name, val_)             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
+ */
+  __pyx_t_7 = __Pyx_PyObject_AsString(__pyx_v_self->name); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_f_9adios_mpi_write(__pyx_v_fd, __pyx_t_7, __pyx_v_val_, 0, NULL);
+
+  /* "adios_mpi.pyx":1449
+ *         return val_.size * val_.itemsize
+ * 
+ *     def write(self, int64_t fd):             # <<<<<<<<<<<<<<
+ *         val_ = self.value
+ *         if not isinstance(self.value, (np.ndarray)):
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("adios_mpi.varinfo.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_val_);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1456
+ *         write(fd, self.name, val_)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_9__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_9__repr__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_8__repr__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_8__repr__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__repr__", 0);
+
+  /* "adios_mpi.pyx":1457
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "adios_mpi.pyx":1458
+ *     def __repr__(self):
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)             # <<<<<<<<<<<<<<
+ * 
+ * ## ====================
+ */
+  __pyx_t_1 = PyTuple_New(5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_self->name);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name);
+  __Pyx_GIVEREF(__pyx_v_self->name);
+  __Pyx_INCREF(__pyx_v_self->ldim);
+  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->ldim);
+  __Pyx_GIVEREF(__pyx_v_self->ldim);
+  __Pyx_INCREF(__pyx_v_self->gdim);
+  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_self->gdim);
+  __Pyx_GIVEREF(__pyx_v_self->gdim);
+  __Pyx_INCREF(__pyx_v_self->offset);
+  PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_self->offset);
+  __Pyx_GIVEREF(__pyx_v_self->offset);
+  __Pyx_INCREF(__pyx_v_self->value);
+  PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_self->value);
+  __Pyx_GIVEREF(__pyx_v_self->value);
+
+  /* "adios_mpi.pyx":1457
+ * 
+ *     def __repr__(self):
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \             # <<<<<<<<<<<<<<
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_AdiosVarinfo_name_r_ldim_r_gdim, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1456
+ *         write(fd, self.name, val_)
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \
+ *                 (self.name, self.ldim, self.gdim, self.offset, self.value)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("adios_mpi.varinfo.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1401
+ * cdef class varinfo:
+ *     cdef bytes name
+ *     cdef public ldim             # <<<<<<<<<<<<<<
+ *     cdef public gdim
+ *     cdef public offset
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_4ldim_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_4ldim_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_4ldim___get__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_4ldim___get__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->ldim);
+  __pyx_r = __pyx_v_self->ldim;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_7varinfo_4ldim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_9adios_mpi_7varinfo_4ldim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_4ldim_2__set__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_7varinfo_4ldim_2__set__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->ldim);
+  __Pyx_DECREF(__pyx_v_self->ldim);
+  __pyx_v_self->ldim = __pyx_v_value;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_7varinfo_4ldim_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_9adios_mpi_7varinfo_4ldim_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_4ldim_4__del__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_7varinfo_4ldim_4__del__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->ldim);
+  __Pyx_DECREF(__pyx_v_self->ldim);
+  __pyx_v_self->ldim = Py_None;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1402
+ *     cdef bytes name
+ *     cdef public ldim
+ *     cdef public gdim             # <<<<<<<<<<<<<<
+ *     cdef public offset
+ *     cdef public value
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_4gdim_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_4gdim_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_4gdim___get__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_4gdim___get__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->gdim);
+  __pyx_r = __pyx_v_self->gdim;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_7varinfo_4gdim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_9adios_mpi_7varinfo_4gdim_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_4gdim_2__set__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_7varinfo_4gdim_2__set__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->gdim);
+  __Pyx_DECREF(__pyx_v_self->gdim);
+  __pyx_v_self->gdim = __pyx_v_value;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_7varinfo_4gdim_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_9adios_mpi_7varinfo_4gdim_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_4gdim_4__del__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_7varinfo_4gdim_4__del__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->gdim);
+  __Pyx_DECREF(__pyx_v_self->gdim);
+  __pyx_v_self->gdim = Py_None;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1403
+ *     cdef public ldim
+ *     cdef public gdim
+ *     cdef public offset             # <<<<<<<<<<<<<<
+ *     cdef public value
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_6offset_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_6offset_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_6offset___get__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_6offset___get__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->offset);
+  __pyx_r = __pyx_v_self->offset;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_7varinfo_6offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_9adios_mpi_7varinfo_6offset_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_6offset_2__set__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_7varinfo_6offset_2__set__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->offset);
+  __Pyx_DECREF(__pyx_v_self->offset);
+  __pyx_v_self->offset = __pyx_v_value;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_7varinfo_6offset_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_9adios_mpi_7varinfo_6offset_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_6offset_4__del__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_7varinfo_6offset_4__del__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->offset);
+  __Pyx_DECREF(__pyx_v_self->offset);
+  __pyx_v_self->offset = Py_None;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1404
+ *     cdef public gdim
+ *     cdef public offset
+ *     cdef public value             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, char * name,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_5value_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_9adios_mpi_7varinfo_5value_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_5value___get__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_7varinfo_5value___get__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->value);
+  __pyx_r = __pyx_v_self->value;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_7varinfo_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_9adios_mpi_7varinfo_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_5value_2__set__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_7varinfo_5value_2__set__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->value);
+  __Pyx_DECREF(__pyx_v_self->value);
+  __pyx_v_self->value = __pyx_v_value;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_9adios_mpi_7varinfo_5value_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_9adios_mpi_7varinfo_5value_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_7varinfo_5value_4__del__(((struct __pyx_obj_9adios_mpi_varinfo *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_9adios_mpi_7varinfo_5value_4__del__(struct __pyx_obj_9adios_mpi_varinfo *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->value);
+  __Pyx_DECREF(__pyx_v_self->value);
+  __pyx_v_self->value = Py_None;
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1464
+ * ## ====================
+ * 
+ * def readvar(fname, varname):             # <<<<<<<<<<<<<<
+ *     """ Retrieve a variable value from an Adios file.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_49readvar(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9adios_mpi_48readvar[] = "readvar(fname, varname)\n Retrieve a variable value from an Adios file.\n\n    Args:\n        fname (str): Adios file name\n        varname (str): Variable name to retrieve\n\n    Returns:\n        NumPy ndarray: variable value\n    ";
+static PyMethodDef __pyx_mdef_9adios_mpi_49readvar = {"readvar", (PyCFunction)__pyx_pw_9adios_mpi_49readvar, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_48readvar};
+static PyObject *__pyx_pw_9adios_mpi_49readvar(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_fname = 0;
+  PyObject *__pyx_v_varname = 0;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("readvar (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fname,&__pyx_n_s_varname,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fname)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_varname)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("readvar", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1464; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "readvar") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1464; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_fname = values[0];
+    __pyx_v_varname = values[1];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("readvar", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1464; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("adios_mpi.readvar", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_9adios_mpi_48readvar(__pyx_self, __pyx_v_fname, __pyx_v_varname);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_48readvar(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname, PyObject *__pyx_v_varname) {
+  struct __pyx_obj_9adios_mpi_file *__pyx_v_f = NULL;
+  PyObject *__pyx_v_v = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("readvar", 0);
+
+  /* "adios_mpi.pyx":1474
+ *         NumPy ndarray: variable value
+ *     """
+ *     f = file(fname, comm=MPI.COMM_SELF)             # <<<<<<<<<<<<<<
+ *     if not f.var.has_key(varname):
+ *         print "No valid variable"
+ */
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_fname);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fname);
+  __Pyx_GIVEREF(__pyx_v_fname);
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_COMM_SELF); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_comm, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_file)), __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_f = ((struct __pyx_obj_9adios_mpi_file *)__pyx_t_4);
+  __pyx_t_4 = 0;
+
+  /* "adios_mpi.pyx":1475
+ *     """
+ *     f = file(fname, comm=MPI.COMM_SELF)
+ *     if not f.var.has_key(varname):             # <<<<<<<<<<<<<<
+ *         print "No valid variable"
+ *         return
+ */
+  if (unlikely(__pyx_v_f->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "has_key");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_5 = PyDict_Contains(__pyx_v_f->var, __pyx_v_varname); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = ((!(__pyx_t_5 != 0)) != 0);
+  if (__pyx_t_6) {
+
+    /* "adios_mpi.pyx":1476
+ *     f = file(fname, comm=MPI.COMM_SELF)
+ *     if not f.var.has_key(varname):
+ *         print "No valid variable"             # <<<<<<<<<<<<<<
+ *         return
+ * 
+ */
+    if (__Pyx_PrintOne(0, __pyx_kp_s_No_valid_variable) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "adios_mpi.pyx":1477
+ *     if not f.var.has_key(varname):
+ *         print "No valid variable"
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ *     v = f.var[varname]
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+  }
+
+  /* "adios_mpi.pyx":1479
+ *         return
+ * 
+ *     v = f.var[varname]             # <<<<<<<<<<<<<<
+ *     return v.read(from_steps=0, nsteps=v.nsteps)
+ * 
+ */
+  if (unlikely(__pyx_v_f->var == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_4 = __Pyx_PyDict_GetItem(__pyx_v_f->var, __pyx_v_varname); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1479; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_v_v = __pyx_t_4;
+  __pyx_t_4 = 0;
+
+  /* "adios_mpi.pyx":1480
+ * 
+ *     v = f.var[varname]
+ *     return v.read(from_steps=0, nsteps=v.nsteps)             # <<<<<<<<<<<<<<
+ * 
+ * def bpls(fname):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_read); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_from_steps, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_v, __pyx_n_s_nsteps); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_nsteps, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1464
+ * ## ====================
+ * 
+ * def readvar(fname, varname):             # <<<<<<<<<<<<<<
+ *     """ Retrieve a variable value from an Adios file.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios_mpi.readvar", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_f);
+  __Pyx_XDECREF(__pyx_v_v);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "adios_mpi.pyx":1482
+ *     return v.read(from_steps=0, nsteps=v.nsteps)
+ * 
+ * def bpls(fname):             # <<<<<<<<<<<<<<
+ *     """ Return meta data of an Adios file as a Python dictionary object.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_9adios_mpi_51bpls(PyObject *__pyx_self, PyObject *__pyx_v_fname); /*proto*/
+static char __pyx_doc_9adios_mpi_50bpls[] = "bpls(fname)\n Return meta data of an Adios file as a Python dictionary object.\n\n    Args:\n        fname (str): Adios file name\n\n    Returns:\n        dict: Adios file meta data\n    ";
+static PyMethodDef __pyx_mdef_9adios_mpi_51bpls = {"bpls", (PyCFunction)__pyx_pw_9adios_mpi_51bpls, METH_O, __pyx_doc_9adios_mpi_50bpls};
+static PyObject *__pyx_pw_9adios_mpi_51bpls(PyObject *__pyx_self, PyObject *__pyx_v_fname) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("bpls (wrapper)", 0);
+  __pyx_r = __pyx_pf_9adios_mpi_50bpls(__pyx_self, ((PyObject *)__pyx_v_fname));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_9adios_mpi_50bpls(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fname) {
+  struct __pyx_obj_9adios_mpi_file *__pyx_v_f = NULL;
+  PyObject *__pyx_v_k = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  Py_ssize_t __pyx_t_5;
+  Py_ssize_t __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("bpls", 0);
+
+  /* "adios_mpi.pyx":1491
+ *         dict: Adios file meta data
+ *     """
+ *     f = file(fname, comm=MPI.COMM_SELF)             # <<<<<<<<<<<<<<
+ *     return {'nvars': f.nvars,
+ *             'nattrs': f.nattrs,
+ */
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_fname);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fname);
+  __Pyx_GIVEREF(__pyx_v_fname);
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_COMM_SELF); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_comm, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_9adios_mpi_file)), __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_f = ((struct __pyx_obj_9adios_mpi_file *)__pyx_t_4);
+  __pyx_t_4 = 0;
+
+  /* "adios_mpi.pyx":1492
+ *     """
+ *     f = file(fname, comm=MPI.COMM_SELF)
+ *     return {'nvars': f.nvars,             # <<<<<<<<<<<<<<
+ *             'nattrs': f.nattrs,
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->nvars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_nvars, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1493
+ *     f = file(fname, comm=MPI.COMM_SELF)
+ *     return {'nvars': f.nvars,
+ *             'nattrs': f.nattrs,             # <<<<<<<<<<<<<<
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->nattrs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_nattrs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1494
+ *     return {'nvars': f.nvars,
+ *             'nattrs': f.nattrs,
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),             # <<<<<<<<<<<<<<
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
+ *             'time_steps': (f.current_step, f.last_step),
+ */
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_5 = 0;
+  if (unlikely(__pyx_v_f->var == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iterkeys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_f->var, 1, __pyx_n_s_iterkeys, (&__pyx_t_6), (&__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_1);
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_t_3 = 0;
+  while (1) {
+    __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_6, &__pyx_t_5, &__pyx_t_3, NULL, NULL, __pyx_t_7);
+    if (unlikely(__pyx_t_8 == 0)) break;
+    if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_3);
+    __pyx_t_3 = 0;
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_v_k))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_vars, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "adios_mpi.pyx":1495
+ *             'nattrs': f.nattrs,
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),             # <<<<<<<<<<<<<<
+ *             'time_steps': (f.current_step, f.last_step),
+ *             'file_size': f.file_size}
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_6 = 0;
+  if (unlikely(__pyx_v_f->attr == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iterkeys");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_f->attr, 1, __pyx_n_s_iterkeys, (&__pyx_t_5), (&__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_2);
+  __pyx_t_2 = __pyx_t_3;
+  __pyx_t_3 = 0;
+  while (1) {
+    __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_2, __pyx_t_5, &__pyx_t_6, &__pyx_t_3, NULL, NULL, __pyx_t_7);
+    if (unlikely(__pyx_t_8 == 0)) break;
+    if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_3);
+    __pyx_t_3 = 0;
+    if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_v_k))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_attrs, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1496
+ *             'vars': tuple([ k for k in f.var.iterkeys() ]),
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
+ *             'time_steps': (f.current_step, f.last_step),             # <<<<<<<<<<<<<<
+ *             'file_size': f.file_size}
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_f->current_step); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_f->last_step); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_2 = 0;
+  __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_time_steps, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "adios_mpi.pyx":1497
+ *             'attrs': tuple([ k for k in f.attr.iterkeys() ]),
+ *             'time_steps': (f.current_step, f.last_step),
+ *             'file_size': f.file_size}             # <<<<<<<<<<<<<<
+ */
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_f->file_size); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_file_size, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_4;
+  __pyx_t_4 = 0;
+  goto __pyx_L0;
+
+  /* "adios_mpi.pyx":1482
+ *     return v.read(from_steps=0, nsteps=v.nsteps)
+ * 
+ * def bpls(fname):             # <<<<<<<<<<<<<<
+ *     """ Return meta data of an Adios file as a Python dictionary object.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("adios_mpi.bpls", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_f);
+  __Pyx_XDECREF(__pyx_v_k);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197
+ *         # experimental exception made for __getbuffer__ and __releasebuffer__
+ *         # -- the details of this may change.
+ *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
+ *             # This implementation of getbuffer is geared towards Cython
+ *             # requirements, and does not yet fullfill the PEP.
+ */
+
+/* Python wrapper */
+static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
+static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
+  int __pyx_v_copy_shape;
+  int __pyx_v_i;
+  int __pyx_v_ndim;
+  int __pyx_v_endian_detector;
+  int __pyx_v_little_endian;
+  int __pyx_v_t;
+  char *__pyx_v_f;
+  PyArray_Descr *__pyx_v_descr = 0;
+  int __pyx_v_offset;
+  int __pyx_v_hasfields;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  char *__pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__getbuffer__", 0);
+  if (__pyx_v_info != NULL) {
+    __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(__pyx_v_info->obj);
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":203
+ *             # of flags
+ * 
+ *             if info == NULL: return             # <<<<<<<<<<<<<<
+ * 
+ *             cdef int copy_shape, i, ndim
+ */
+  __pyx_t_1 = ((__pyx_v_info == NULL) != 0);
+  if (__pyx_t_1) {
+    __pyx_r = 0;
+    goto __pyx_L0;
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":206
+ * 
+ *             cdef int copy_shape, i, ndim
+ *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<
+ *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+ * 
+ */
+  __pyx_v_endian_detector = 1;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":207
+ *             cdef int copy_shape, i, ndim
+ *             cdef int endian_detector = 1
+ *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
+ * 
+ *             ndim = PyArray_NDIM(self)
+ */
+  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":209
+ *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+ * 
+ *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<
+ * 
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ */
+  __pyx_v_ndim = PyArray_NDIM(__pyx_v_self);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211
+ *             ndim = PyArray_NDIM(self)
+ * 
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
+ *                 copy_shape = 1
+ *             else:
+ */
+  __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":212
+ * 
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *                 copy_shape = 1             # <<<<<<<<<<<<<<
+ *             else:
+ *                 copy_shape = 0
+ */
+    __pyx_v_copy_shape = 1;
+    goto __pyx_L4;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":214
+ *                 copy_shape = 1
+ *             else:
+ *                 copy_shape = 0             # <<<<<<<<<<<<<<
+ * 
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ */
+    __pyx_v_copy_shape = 0;
+  }
+  __pyx_L4:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216
+ *                 copy_shape = 0
+ * 
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not C contiguous")
+ */
+  __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0);
+  if (__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L6_bool_binop_done;
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":217
+ * 
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<
+ *                 raise ValueError(u"ndarray is not C contiguous")
+ * 
+ */
+  __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0);
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L6_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__39, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220
+ *                 raise ValueError(u"ndarray is not C contiguous")
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<
+ *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ */
+  __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0);
+  if (__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L9_bool_binop_done;
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":221
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ * 
+ */
+  __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0);
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L9_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
+ * 
+ *             info.buf = PyArray_DATA(self)
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__40, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":224
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ * 
+ *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<
+ *             info.ndim = ndim
+ *             if copy_shape:
+ */
+  __pyx_v_info->buf = PyArray_DATA(__pyx_v_self);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":225
+ * 
+ *             info.buf = PyArray_DATA(self)
+ *             info.ndim = ndim             # <<<<<<<<<<<<<<
+ *             if copy_shape:
+ *                 # Allocate new buffer for strides and shape info.
+ */
+  __pyx_v_info->ndim = __pyx_v_ndim;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226
+ *             info.buf = PyArray_DATA(self)
+ *             info.ndim = ndim
+ *             if copy_shape:             # <<<<<<<<<<<<<<
+ *                 # Allocate new buffer for strides and shape info.
+ *                 # This is allocated as one block, strides first.
+ */
+  __pyx_t_1 = (__pyx_v_copy_shape != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":229
+ *                 # Allocate new buffer for strides and shape info.
+ *                 # This is allocated as one block, strides first.
+ *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)             # <<<<<<<<<<<<<<
+ *                 info.shape = info.strides + ndim
+ *                 for i in range(ndim):
+ */
+    __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2)));
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":230
+ *                 # This is allocated as one block, strides first.
+ *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)
+ *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<
+ *                 for i in range(ndim):
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]
+ */
+    __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":231
+ *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)
+ *                 info.shape = info.strides + ndim
+ *                 for i in range(ndim):             # <<<<<<<<<<<<<<
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]
+ *                     info.shape[i] = PyArray_DIMS(self)[i]
+ */
+    __pyx_t_4 = __pyx_v_ndim;
+    for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
+      __pyx_v_i = __pyx_t_5;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":232
+ *                 info.shape = info.strides + ndim
+ *                 for i in range(ndim):
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<
+ *                     info.shape[i] = PyArray_DIMS(self)[i]
+ *             else:
+ */
+      (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]);
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":233
+ *                 for i in range(ndim):
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]
+ *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<
+ *             else:
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+ */
+      (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]);
+    }
+    goto __pyx_L11;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":235
+ *                     info.shape[i] = PyArray_DIMS(self)[i]
+ *             else:
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
+ *             info.suboffsets = NULL
+ */
+    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self));
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":236
+ *             else:
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)             # <<<<<<<<<<<<<<
+ *             info.suboffsets = NULL
+ *             info.itemsize = PyArray_ITEMSIZE(self)
+ */
+    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self));
+  }
+  __pyx_L11:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":237
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
+ *             info.suboffsets = NULL             # <<<<<<<<<<<<<<
+ *             info.itemsize = PyArray_ITEMSIZE(self)
+ *             info.readonly = not PyArray_ISWRITEABLE(self)
+ */
+  __pyx_v_info->suboffsets = NULL;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":238
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
+ *             info.suboffsets = NULL
+ *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<
+ *             info.readonly = not PyArray_ISWRITEABLE(self)
+ * 
+ */
+  __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":239
+ *             info.suboffsets = NULL
+ *             info.itemsize = PyArray_ITEMSIZE(self)
+ *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<
+ * 
+ *             cdef int t
+ */
+  __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0));
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":242
+ * 
+ *             cdef int t
+ *             cdef char* f = NULL             # <<<<<<<<<<<<<<
+ *             cdef dtype descr = self.descr
+ *             cdef list stack
+ */
+  __pyx_v_f = NULL;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":243
+ *             cdef int t
+ *             cdef char* f = NULL
+ *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<
+ *             cdef list stack
+ *             cdef int offset
+ */
+  __pyx_t_3 = ((PyObject *)__pyx_v_self->descr);
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":247
+ *             cdef int offset
+ * 
+ *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<
+ * 
+ *             if not hasfields and not copy_shape:
+ */
+  __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":249
+ *             cdef bint hasfields = PyDataType_HASFIELDS(descr)
+ * 
+ *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<
+ *                 # do not call releasebuffer
+ *                 info.obj = None
+ */
+  __pyx_t_2 = ((!(__pyx_v_hasfields != 0)) != 0);
+  if (__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L15_bool_binop_done;
+  }
+  __pyx_t_2 = ((!(__pyx_v_copy_shape != 0)) != 0);
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L15_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":251
+ *             if not hasfields and not copy_shape:
+ *                 # do not call releasebuffer
+ *                 info.obj = None             # <<<<<<<<<<<<<<
+ *             else:
+ *                 # need to call releasebuffer
+ */
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj);
+    __pyx_v_info->obj = Py_None;
+    goto __pyx_L14;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":254
+ *             else:
+ *                 # need to call releasebuffer
+ *                 info.obj = self             # <<<<<<<<<<<<<<
+ * 
+ *             if not hasfields:
+ */
+    __Pyx_INCREF(((PyObject *)__pyx_v_self));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj);
+    __pyx_v_info->obj = ((PyObject *)__pyx_v_self);
+  }
+  __pyx_L14:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":256
+ *                 info.obj = self
+ * 
+ *             if not hasfields:             # <<<<<<<<<<<<<<
+ *                 t = descr.type_num
+ *                 if ((descr.byteorder == c'>' and little_endian) or
+ */
+  __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257
+ * 
+ *             if not hasfields:
+ *                 t = descr.type_num             # <<<<<<<<<<<<<<
+ *                 if ((descr.byteorder == c'>' and little_endian) or
+ *                     (descr.byteorder == c'<' and not little_endian)):
+ */
+    __pyx_t_4 = __pyx_v_descr->type_num;
+    __pyx_v_t = __pyx_t_4;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":258
+ *             if not hasfields:
+ *                 t = descr.type_num
+ *                 if ((descr.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
+ *                     (descr.byteorder == c'<' and not little_endian)):
+ *                     raise ValueError(u"Non-native byte order not supported")
+ */
+    __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0);
+    if (!__pyx_t_2) {
+      goto __pyx_L20_next_or;
+    } else {
+    }
+    __pyx_t_2 = (__pyx_v_little_endian != 0);
+    if (!__pyx_t_2) {
+    } else {
+      __pyx_t_1 = __pyx_t_2;
+      goto __pyx_L19_bool_binop_done;
+    }
+    __pyx_L20_next_or:;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259
+ *                 t = descr.type_num
+ *                 if ((descr.byteorder == c'>' and little_endian) or
+ *                     (descr.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
+ *                     raise ValueError(u"Non-native byte order not supported")
+ *                 if   t == NPY_BYTE:        f = "b"
+ */
+    __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0);
+    if (__pyx_t_2) {
+    } else {
+      __pyx_t_1 = __pyx_t_2;
+      goto __pyx_L19_bool_binop_done;
+    }
+    __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0);
+    __pyx_t_1 = __pyx_t_2;
+    __pyx_L19_bool_binop_done:;
+    if (__pyx_t_1) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260
+ *                 if ((descr.byteorder == c'>' and little_endian) or
+ *                     (descr.byteorder == c'<' and not little_endian)):
+ *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *                 if   t == NPY_BYTE:        f = "b"
+ *                 elif t == NPY_UBYTE:       f = "B"
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__41, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ */
+    switch (__pyx_v_t) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":261
+ *                     (descr.byteorder == c'<' and not little_endian)):
+ *                     raise ValueError(u"Non-native byte order not supported")
+ *                 if   t == NPY_BYTE:        f = "b"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_UBYTE:       f = "B"
+ *                 elif t == NPY_SHORT:       f = "h"
+ */
+      case NPY_BYTE:
+      __pyx_v_f = __pyx_k_b;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":262
+ *                     raise ValueError(u"Non-native byte order not supported")
+ *                 if   t == NPY_BYTE:        f = "b"
+ *                 elif t == NPY_UBYTE:       f = "B"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_SHORT:       f = "h"
+ *                 elif t == NPY_USHORT:      f = "H"
+ */
+      case NPY_UBYTE:
+      __pyx_v_f = __pyx_k_B;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":263
+ *                 if   t == NPY_BYTE:        f = "b"
+ *                 elif t == NPY_UBYTE:       f = "B"
+ *                 elif t == NPY_SHORT:       f = "h"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_USHORT:      f = "H"
+ *                 elif t == NPY_INT:         f = "i"
+ */
+      case NPY_SHORT:
+      __pyx_v_f = __pyx_k_h;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":264
+ *                 elif t == NPY_UBYTE:       f = "B"
+ *                 elif t == NPY_SHORT:       f = "h"
+ *                 elif t == NPY_USHORT:      f = "H"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_INT:         f = "i"
+ *                 elif t == NPY_UINT:        f = "I"
+ */
+      case NPY_USHORT:
+      __pyx_v_f = __pyx_k_H;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":265
+ *                 elif t == NPY_SHORT:       f = "h"
+ *                 elif t == NPY_USHORT:      f = "H"
+ *                 elif t == NPY_INT:         f = "i"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_UINT:        f = "I"
+ *                 elif t == NPY_LONG:        f = "l"
+ */
+      case NPY_INT:
+      __pyx_v_f = __pyx_k_i;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":266
+ *                 elif t == NPY_USHORT:      f = "H"
+ *                 elif t == NPY_INT:         f = "i"
+ *                 elif t == NPY_UINT:        f = "I"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_LONG:        f = "l"
+ *                 elif t == NPY_ULONG:       f = "L"
+ */
+      case NPY_UINT:
+      __pyx_v_f = __pyx_k_I;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":267
+ *                 elif t == NPY_INT:         f = "i"
+ *                 elif t == NPY_UINT:        f = "I"
+ *                 elif t == NPY_LONG:        f = "l"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_ULONG:       f = "L"
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ */
+      case NPY_LONG:
+      __pyx_v_f = __pyx_k_l;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":268
+ *                 elif t == NPY_UINT:        f = "I"
+ *                 elif t == NPY_LONG:        f = "l"
+ *                 elif t == NPY_ULONG:       f = "L"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ */
+      case NPY_ULONG:
+      __pyx_v_f = __pyx_k_L;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":269
+ *                 elif t == NPY_LONG:        f = "l"
+ *                 elif t == NPY_ULONG:       f = "L"
+ *                 elif t == NPY_LONGLONG:    f = "q"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ *                 elif t == NPY_FLOAT:       f = "f"
+ */
+      case NPY_LONGLONG:
+      __pyx_v_f = __pyx_k_q;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":270
+ *                 elif t == NPY_ULONG:       f = "L"
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ *                 elif t == NPY_ULONGLONG:   f = "Q"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_FLOAT:       f = "f"
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ */
+      case NPY_ULONGLONG:
+      __pyx_v_f = __pyx_k_Q;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":271
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ *                 elif t == NPY_FLOAT:       f = "f"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ */
+      case NPY_FLOAT:
+      __pyx_v_f = __pyx_k_f;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":272
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ *                 elif t == NPY_FLOAT:       f = "f"
+ *                 elif t == NPY_DOUBLE:      f = "d"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ */
+      case NPY_DOUBLE:
+      __pyx_v_f = __pyx_k_d;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":273
+ *                 elif t == NPY_FLOAT:       f = "f"
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ */
+      case NPY_LONGDOUBLE:
+      __pyx_v_f = __pyx_k_g;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ *                 elif t == NPY_CFLOAT:      f = "Zf"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ */
+      case NPY_CFLOAT:
+      __pyx_v_f = __pyx_k_Zf;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":275
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ *                 elif t == NPY_OBJECT:      f = "O"
+ */
+      case NPY_CDOUBLE:
+      __pyx_v_f = __pyx_k_Zd;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":276
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_OBJECT:      f = "O"
+ *                 else:
+ */
+      case NPY_CLONGDOUBLE:
+      __pyx_v_f = __pyx_k_Zg;
+      break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":277
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ */
+      case NPY_OBJECT:
+      __pyx_v_f = __pyx_k_O;
+      break;
+      default:
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":279
+ *                 elif t == NPY_OBJECT:      f = "O"
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *                 info.format = f
+ *                 return
+ */
+      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6);
+      __Pyx_GIVEREF(__pyx_t_6);
+      __pyx_t_6 = 0;
+      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_Raise(__pyx_t_6, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      break;
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":280
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                 info.format = f             # <<<<<<<<<<<<<<
+ *                 return
+ *             else:
+ */
+    __pyx_v_info->format = __pyx_v_f;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":281
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                 info.format = f
+ *                 return             # <<<<<<<<<<<<<<
+ *             else:
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+ */
+    __pyx_r = 0;
+    goto __pyx_L0;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":283
+ *                 return
+ *             else:
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<
+ *                 info.format[0] = c'^' # Native data types, manual alignment
+ *                 offset = 0
+ */
+    __pyx_v_info->format = ((char *)malloc(255));
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":284
+ *             else:
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+ *                 info.format[0] = c'^' # Native data types, manual alignment             # <<<<<<<<<<<<<<
+ *                 offset = 0
+ *                 f = _util_dtypestring(descr, info.format + 1,
+ */
+    (__pyx_v_info->format[0]) = '^';
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":285
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+ *                 info.format[0] = c'^' # Native data types, manual alignment
+ *                 offset = 0             # <<<<<<<<<<<<<<
+ *                 f = _util_dtypestring(descr, info.format + 1,
+ *                                       info.format + _buffer_format_string_len,
+ */
+    __pyx_v_offset = 0;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":286
+ *                 info.format[0] = c'^' # Native data types, manual alignment
+ *                 offset = 0
+ *                 f = _util_dtypestring(descr, info.format + 1,             # <<<<<<<<<<<<<<
+ *                                       info.format + _buffer_format_string_len,
+ *                                       &offset)
+ */
+    __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_f = __pyx_t_7;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":289
+ *                                       info.format + _buffer_format_string_len,
+ *                                       &offset)
+ *                 f[0] = c'\0' # Terminate format string             # <<<<<<<<<<<<<<
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ */
+    (__pyx_v_f[0]) = '\x00';
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197
+ *         # experimental exception made for __getbuffer__ and __releasebuffer__
+ *         # -- the details of this may change.
+ *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
+ *             # This implementation of getbuffer is geared towards Cython
+ *             # requirements, and does not yet fullfill the PEP.
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) {
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;
+  }
+  goto __pyx_L2;
+  __pyx_L0:;
+  if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) {
+    __Pyx_GOTREF(Py_None);
+    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;
+  }
+  __pyx_L2:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_descr);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291
+ *                 f[0] = c'\0' # Terminate format string
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)
+ */
+
+/* Python wrapper */
+static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
+static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0);
+  __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__releasebuffer__", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":292
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<
+ *                 stdlib.free(info.format)
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ */
+  __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":293
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *                 stdlib.free(info.strides)
+ */
+    free(__pyx_v_info->format);
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":294
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
+ *                 stdlib.free(info.strides)
+ *                 # info.shape was stored after info.strides in the same block
+ */
+  __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":295
+ *                 stdlib.free(info.format)
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<
+ *                 # info.shape was stored after info.strides in the same block
+ * 
+ */
+    free(__pyx_v_info->strides);
+    goto __pyx_L4;
+  }
+  __pyx_L4:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291
+ *                 f[0] = c'\0' # Terminate format string
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)
+ */
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771
+ * ctypedef npy_cdouble     complex_t
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":772
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):
+ *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771
+ * ctypedef npy_cdouble     complex_t
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":775
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":778
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":781
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":784
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":786
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
+ *     # Recursive utility function used in __getbuffer__ to get format
+ *     # string. The new location in the format string is returned.
+ */
+
+static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
+  PyArray_Descr *__pyx_v_child = 0;
+  int __pyx_v_endian_detector;
+  int __pyx_v_little_endian;
+  PyObject *__pyx_v_fields = 0;
+  PyObject *__pyx_v_childname = NULL;
+  PyObject *__pyx_v_new_offset = NULL;
+  PyObject *__pyx_v_t = NULL;
+  char *__pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  long __pyx_t_8;
+  char *__pyx_t_9;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_util_dtypestring", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":793
+ *     cdef int delta_offset
+ *     cdef tuple i
+ *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
+ *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+ *     cdef tuple fields
+ */
+  __pyx_v_endian_detector = 1;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794
+ *     cdef tuple i
+ *     cdef int endian_detector = 1
+ *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
+ *     cdef tuple fields
+ * 
+ */
+  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":797
+ *     cdef tuple fields
+ * 
+ *     for childname in descr.names:             # <<<<<<<<<<<<<<
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields
+ */
+  if (unlikely(__pyx_v_descr->names == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  for (;;) {
+    if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+    #if CYTHON_COMPILING_IN_CPYTHON
+    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #else
+    __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798
+ * 
+ *     for childname in descr.names:
+ *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
+ *         child, new_offset = fields
+ * 
+ */
+    if (unlikely(__pyx_v_descr->fields == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    __Pyx_GOTREF(__pyx_t_3);
+    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3));
+    __pyx_t_3 = 0;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799
+ *     for childname in descr.names:
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields             # <<<<<<<<<<<<<<
+ * 
+ *         if (end - f) - <int>(new_offset - offset[0]) < 15:
+ */
+    if (likely(__pyx_v_fields != Py_None)) {
+      PyObject* sequence = __pyx_v_fields;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 2)) {
+        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      #else
+      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      #endif
+    } else {
+      __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3));
+    __pyx_t_3 = 0;
+    __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801
+ *         child, new_offset = fields
+ * 
+ *         if (end - f) - <int>(new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+ * 
+ */
+    __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0);
+    if (__pyx_t_6) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802
+ * 
+ *         if (end - f) - <int>(new_offset - offset[0]) < 15:
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
+ * 
+ *         if ((child.byteorder == c'>' and little_endian) or
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__42, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":804
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+ * 
+ *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
+ *             (child.byteorder == c'<' and not little_endian)):
+ *             raise ValueError(u"Non-native byte order not supported")
+ */
+    __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0);
+    if (!__pyx_t_7) {
+      goto __pyx_L8_next_or;
+    } else {
+    }
+    __pyx_t_7 = (__pyx_v_little_endian != 0);
+    if (!__pyx_t_7) {
+    } else {
+      __pyx_t_6 = __pyx_t_7;
+      goto __pyx_L7_bool_binop_done;
+    }
+    __pyx_L8_next_or:;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":805
+ * 
+ *         if ((child.byteorder == c'>' and little_endian) or
+ *             (child.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
+ *             raise ValueError(u"Non-native byte order not supported")
+ *             # One could encode it in the format string and have Cython
+ */
+    __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0);
+    if (__pyx_t_7) {
+    } else {
+      __pyx_t_6 = __pyx_t_7;
+      goto __pyx_L7_bool_binop_done;
+    }
+    __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0);
+    __pyx_t_6 = __pyx_t_7;
+    __pyx_L7_bool_binop_done:;
+    if (__pyx_t_6) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":806
+ *         if ((child.byteorder == c'>' and little_endian) or
+ *             (child.byteorder == c'<' and not little_endian)):
+ *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *             # One could encode it in the format string and have Cython
+ *             # complain instead, BUT: < and > in format strings also imply
+ */
+      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__43, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":816
+ * 
+ *         # Output padding bytes
+ *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
+ *             f[0] = 120 # "x"; pad byte
+ *             f += 1
+ */
+    while (1) {
+      __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (!__pyx_t_6) break;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":817
+ *         # Output padding bytes
+ *         while offset[0] < new_offset:
+ *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
+ *             f += 1
+ *             offset[0] += 1
+ */
+      (__pyx_v_f[0]) = 120;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":818
+ *         while offset[0] < new_offset:
+ *             f[0] = 120 # "x"; pad byte
+ *             f += 1             # <<<<<<<<<<<<<<
+ *             offset[0] += 1
+ * 
+ */
+      __pyx_v_f = (__pyx_v_f + 1);
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":819
+ *             f[0] = 120 # "x"; pad byte
+ *             f += 1
+ *             offset[0] += 1             # <<<<<<<<<<<<<<
+ * 
+ *         offset[0] += child.itemsize
+ */
+      __pyx_t_8 = 0;
+      (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1);
+    }
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":821
+ *             offset[0] += 1
+ * 
+ *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
+ * 
+ *         if not PyDataType_HASFIELDS(child):
+ */
+    __pyx_t_8 = 0;
+    (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize);
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823
+ *         offset[0] += child.itemsize
+ * 
+ *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
+ *             t = child.type_num
+ *             if end - f < 5:
+ */
+    __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0);
+    if (__pyx_t_6) {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":824
+ * 
+ *         if not PyDataType_HASFIELDS(child):
+ *             t = child.type_num             # <<<<<<<<<<<<<<
+ *             if end - f < 5:
+ *                 raise RuntimeError(u"Format string allocated too short.")
+ */
+      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4);
+      __pyx_t_4 = 0;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":825
+ *         if not PyDataType_HASFIELDS(child):
+ *             t = child.type_num
+ *             if end - f < 5:             # <<<<<<<<<<<<<<
+ *                 raise RuntimeError(u"Format string allocated too short.")
+ * 
+ */
+      __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0);
+      if (__pyx_t_6) {
+
+        /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826
+ *             t = child.type_num
+ *             if end - f < 5:
+ *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
+ * 
+ *             # Until ticket #99 is fixed, use integers to avoid warnings
+ */
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__44, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":829
+ * 
+ *             # Until ticket #99 is fixed, use integers to avoid warnings
+ *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 98;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":830
+ *             # Until ticket #99 is fixed, use integers to avoid warnings
+ *             if   t == NPY_BYTE:        f[0] =  98 #"b"
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 66;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":831
+ *             if   t == NPY_BYTE:        f[0] =  98 #"b"
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 104;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":832
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 72;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":833
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 105;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":834
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 73;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":835
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 108;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":836
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 76;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":837
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 113;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":838
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 81;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":839
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 102;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":840
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 100;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":841
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 103;
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":842
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 90;
+        (__pyx_v_f[1]) = 102;
+        __pyx_v_f = (__pyx_v_f + 1);
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":843
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 90;
+        (__pyx_v_f[1]) = 100;
+        __pyx_v_f = (__pyx_v_f + 1);
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":844
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+ *             else:
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 90;
+        (__pyx_v_f[1]) = 103;
+        __pyx_v_f = (__pyx_v_f + 1);
+        goto __pyx_L15;
+      }
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":845
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
+ *             else:
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ */
+      __pyx_t_4 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 79;
+        goto __pyx_L15;
+      }
+      /*else*/ {
+
+        /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":847
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+ *             else:
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *             f += 1
+ *         else:
+ */
+        __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
+        __Pyx_GIVEREF(__pyx_t_3);
+        __pyx_t_3 = 0;
+        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_L15:;
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":848
+ *             else:
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *             f += 1             # <<<<<<<<<<<<<<
+ *         else:
+ *             # Cython ignores struct boundary information ("T{...}"),
+ */
+      __pyx_v_f = (__pyx_v_f + 1);
+      goto __pyx_L13;
+    }
+    /*else*/ {
+
+      /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":852
+ *             # Cython ignores struct boundary information ("T{...}"),
+ *             # so don't output it
+ *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
+ *     return f
+ * 
+ */
+      __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_f = __pyx_t_9;
+    }
+    __pyx_L13:;
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":797
+ *     cdef tuple fields
+ * 
+ *     for childname in descr.names:             # <<<<<<<<<<<<<<
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields
+ */
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":853
+ *             # so don't output it
+ *             f = _util_dtypestring(child, f, end, offset)
+ *     return f             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_f;
+  goto __pyx_L0;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":786
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
+ *     # Recursive utility function used in __getbuffer__ to get format
+ *     # string. The new location in the format string is returned.
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_child);
+  __Pyx_XDECREF(__pyx_v_fields);
+  __Pyx_XDECREF(__pyx_v_childname);
+  __Pyx_XDECREF(__pyx_v_new_offset);
+  __Pyx_XDECREF(__pyx_v_t);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969
+ * 
+ * 
+ * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ */
+
+static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
+  PyObject *__pyx_v_baseptr;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  __Pyx_RefNannySetupContext("set_array_base", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":971
+ * cdef inline void set_array_base(ndarray arr, object base):
+ *      cdef PyObject* baseptr
+ *      if base is None:             # <<<<<<<<<<<<<<
+ *          baseptr = NULL
+ *      else:
+ */
+  __pyx_t_1 = (__pyx_v_base == Py_None);
+  __pyx_t_2 = (__pyx_t_1 != 0);
+  if (__pyx_t_2) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":972
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ *          baseptr = NULL             # <<<<<<<<<<<<<<
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!
+ */
+    __pyx_v_baseptr = NULL;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":974
+ *          baseptr = NULL
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<
+ *          baseptr = <PyObject*>base
+ *      Py_XDECREF(arr.base)
+ */
+    Py_INCREF(__pyx_v_base);
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":975
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!
+ *          baseptr = <PyObject*>base             # <<<<<<<<<<<<<<
+ *      Py_XDECREF(arr.base)
+ *      arr.base = baseptr
+ */
+    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);
+  }
+  __pyx_L3:;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976
+ *          Py_INCREF(base) # important to do this before decref below!
+ *          baseptr = <PyObject*>base
+ *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<
+ *      arr.base = baseptr
+ * 
+ */
+  Py_XDECREF(__pyx_v_arr->base);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977
+ *          baseptr = <PyObject*>base
+ *      Py_XDECREF(arr.base)
+ *      arr.base = baseptr             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object get_array_base(ndarray arr):
+ */
+  __pyx_v_arr->base = __pyx_v_baseptr;
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969
+ * 
+ * 
+ * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ */
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979
+ *      arr.base = baseptr
+ * 
+ * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
+ *     if arr.base is NULL:
+ *         return None
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("get_array_base", 0);
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":980
+ * 
+ * cdef inline object get_array_base(ndarray arr):
+ *     if arr.base is NULL:             # <<<<<<<<<<<<<<
+ *         return None
+ *     else:
+ */
+  __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0);
+  if (__pyx_t_1) {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":981
+ * cdef inline object get_array_base(ndarray arr):
+ *     if arr.base is NULL:
+ *         return None             # <<<<<<<<<<<<<<
+ *     else:
+ *         return <object>arr.base
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(Py_None);
+    __pyx_r = Py_None;
+    goto __pyx_L0;
+  }
+  /*else*/ {
+
+    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":983
+ *         return None
+ *     else:
+ *         return <object>arr.base             # <<<<<<<<<<<<<<
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));
+    __pyx_r = ((PyObject *)__pyx_v_arr->base);
+    goto __pyx_L0;
+  }
+
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979
+ *      arr.base = baseptr
+ * 
+ * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
+ *     if arr.base is NULL:
+ *         return None
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static struct __pyx_vtabstruct_9adios_mpi_file __pyx_vtable_9adios_mpi_file;
+
+static PyObject *__pyx_tp_new_9adios_mpi_file(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_9adios_mpi_file *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_9adios_mpi_file *)o);
+  p->__pyx_vtab = __pyx_vtabptr_9adios_mpi_file;
+  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_9adios_mpi_file(PyObject *o) {
+  struct __pyx_obj_9adios_mpi_file *p = (struct __pyx_obj_9adios_mpi_file *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->name);
+  Py_CLEAR(p->var);
+  Py_CLEAR(p->attr);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_9adios_mpi_file(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_9adios_mpi_file *p = (struct __pyx_obj_9adios_mpi_file *)o;
+  if (p->var) {
+    e = (*v)(p->var, a); if (e) return e;
+  }
+  if (p->attr) {
+    e = (*v)(p->attr, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_9adios_mpi_file(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_9adios_mpi_file *p = (struct __pyx_obj_9adios_mpi_file *)o;
+  tmp = ((PyObject*)p->var);
+  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->attr);
+  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+static PyObject *__pyx_sq_item_9adios_mpi_file(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_name(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_4name_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_nvars(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_5nvars_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_nattrs(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_6nattrs_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_current_step(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_12current_step_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_last_step(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_9last_step_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_endianness(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_10endianness_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_version(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_7version_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_file_sizec(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_10file_sizec_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_is_stream(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_9is_stream_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_var(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_3var_1__get__(o);
+}
+
+static int __pyx_setprop_9adios_mpi_4file_var(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_9adios_mpi_4file_3var_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_9adios_mpi_4file_3var_5__del__(o);
+  }
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4file_attr(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4file_4attr_1__get__(o);
+}
+
+static int __pyx_setprop_9adios_mpi_4file_attr(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_9adios_mpi_4file_4attr_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_9adios_mpi_4file_4attr_5__del__(o);
+  }
+}
+
+static PyMethodDef __pyx_methods_9adios_mpi_file[] = {
+  {"__del__", (PyCFunction)__pyx_pw_9adios_mpi_4file_3__del__, METH_NOARGS, __pyx_doc_9adios_mpi_4file_2__del__},
+  {"close", (PyCFunction)__pyx_pw_9adios_mpi_4file_5close, METH_NOARGS, __pyx_doc_9adios_mpi_4file_4close},
+  {"printself", (PyCFunction)__pyx_pw_9adios_mpi_4file_7printself, METH_NOARGS, __pyx_doc_9adios_mpi_4file_6printself},
+  {"advance", (PyCFunction)__pyx_pw_9adios_mpi_4file_9advance, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_4file_8advance},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_9adios_mpi_file[] = {
+  {(char *)"name", __pyx_getprop_9adios_mpi_4file_name, 0, __pyx_k_The_filename_or_stream_name_ass, 0},
+  {(char *)"nvars", __pyx_getprop_9adios_mpi_4file_nvars, 0, __pyx_k_The_number_of_variables, 0},
+  {(char *)"nattrs", __pyx_getprop_9adios_mpi_4file_nattrs, 0, __pyx_k_The_number_of_attributes, 0},
+  {(char *)"current_step", __pyx_getprop_9adios_mpi_4file_current_step, 0, __pyx_k_The_current_timestep_index, 0},
+  {(char *)"last_step", __pyx_getprop_9adios_mpi_4file_last_step, 0, __pyx_k_The_last_timestep_index, 0},
+  {(char *)"endianness", __pyx_getprop_9adios_mpi_4file_endianness, 0, __pyx_k_The_endianness_of_the_stored_da, 0},
+  {(char *)"version", __pyx_getprop_9adios_mpi_4file_version, 0, __pyx_k_The_version_of_Adios, 0},
+  {(char *)"file_sizec", __pyx_getprop_9adios_mpi_4file_file_sizec, 0, __pyx_k_The_size_of_Adios_file, 0},
+  {(char *)"is_stream", __pyx_getprop_9adios_mpi_4file_is_stream, 0, __pyx_k_Indicating_reader_type_file_rea, 0},
+  {(char *)"var", __pyx_getprop_9adios_mpi_4file_var, __pyx_setprop_9adios_mpi_4file_var, __pyx_k_var_dict, 0},
+  {(char *)"attr", __pyx_getprop_9adios_mpi_4file_attr, __pyx_setprop_9adios_mpi_4file_attr, __pyx_k_attr_dict, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_file = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  __pyx_sq_item_9adios_mpi_file, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_file = {
+  0, /*mp_length*/
+  __pyx_pw_9adios_mpi_4file_11__getitem__, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyTypeObject __pyx_type_9adios_mpi_file = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios_mpi.file", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi_file), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_9adios_mpi_file, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_9adios_mpi_4file_13__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  &__pyx_tp_as_sequence_file, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_file, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "file(char *fname, char *method_name='BP', Comm comm=MPI.COMM_WORLD, is_stream=False, ADIOS_LOCKMODE lock_mode=ADIOS_LOCKMODE_ALL, float timeout_sec=0.0)\n\n    file class for Adios file read and write.\n\n    Args:\n        fname (str): filename.\n        method_name (str, optional): Adios read method (default: 'BP').\n        comm (MPI.Comm, optional): MPI comm for parallel read/write (default: MPI.COMM_WORLD).\n        is_stream (bool, optional): Set True if use stream reader (defau [...]
+  __pyx_tp_traverse_9adios_mpi_file, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi_file, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_9adios_mpi_file, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_9adios_mpi_file, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_9adios_mpi_4file_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_9adios_mpi_file, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+static struct __pyx_vtabstruct_9adios_mpi_var __pyx_vtable_9adios_mpi_var;
+
+static PyObject *__pyx_tp_new_9adios_mpi_var(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_9adios_mpi_var *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_9adios_mpi_var *)o);
+  p->__pyx_vtab = __pyx_vtabptr_9adios_mpi_var;
+  p->file = ((struct __pyx_obj_9adios_mpi_file *)Py_None); Py_INCREF(Py_None);
+  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->dtype = ((PyArray_Descr *)Py_None); Py_INCREF(Py_None);
+  p->dims = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_9adios_mpi_var(PyObject *o) {
+  struct __pyx_obj_9adios_mpi_var *p = (struct __pyx_obj_9adios_mpi_var *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->file);
+  Py_CLEAR(p->name);
+  Py_CLEAR(p->dtype);
+  Py_CLEAR(p->dims);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_9adios_mpi_var(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_9adios_mpi_var *p = (struct __pyx_obj_9adios_mpi_var *)o;
+  if (p->file) {
+    e = (*v)(((PyObject*)p->file), a); if (e) return e;
+  }
+  if (p->dtype) {
+    e = (*v)(((PyObject*)p->dtype), a); if (e) return e;
+  }
+  if (p->dims) {
+    e = (*v)(p->dims, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_9adios_mpi_var(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_9adios_mpi_var *p = (struct __pyx_obj_9adios_mpi_var *)o;
+  tmp = ((PyObject*)p->file);
+  p->file = ((struct __pyx_obj_9adios_mpi_file *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->dtype);
+  p->dtype = ((PyArray_Descr *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->dims);
+  p->dims = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+static PyObject *__pyx_sq_item_9adios_mpi_var(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_3var_name(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_3var_4name_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_3var_varid(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_3var_5varid_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_3var_dtype(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_3var_5dtype_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_3var_ndim(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_3var_4ndim_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_3var_dims(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_3var_4dims_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_3var_nsteps(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_3var_6nsteps_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_9adios_mpi_var[] = {
+  {"__del__", (PyCFunction)__pyx_pw_9adios_mpi_3var_3__del__, METH_NOARGS, __pyx_doc_9adios_mpi_3var_2__del__},
+  {"close", (PyCFunction)__pyx_pw_9adios_mpi_3var_5close, METH_NOARGS, __pyx_doc_9adios_mpi_3var_4close},
+  {"advance", (PyCFunction)__pyx_pw_9adios_mpi_3var_7advance, METH_NOARGS, __pyx_doc_9adios_mpi_3var_6advance},
+  {"read", (PyCFunction)__pyx_pw_9adios_mpi_3var_9read, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_3var_8read},
+  {"printself", (PyCFunction)__pyx_pw_9adios_mpi_3var_11printself, METH_NOARGS, __pyx_doc_9adios_mpi_3var_10printself},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_9adios_mpi_var[] = {
+  {(char *)"name", __pyx_getprop_9adios_mpi_3var_name, 0, __pyx_k_The_variable_name, 0},
+  {(char *)"varid", __pyx_getprop_9adios_mpi_3var_varid, 0, __pyx_k_Internal_variable_id, 0},
+  {(char *)"dtype", __pyx_getprop_9adios_mpi_3var_dtype, 0, __pyx_k_Variable_type_as_in_numpy_dtype, 0},
+  {(char *)"ndim", __pyx_getprop_9adios_mpi_3var_ndim, 0, __pyx_k_The_number_of_dimensions_of_the, 0},
+  {(char *)"dims", __pyx_getprop_9adios_mpi_3var_dims, 0, __pyx_k_The_shape_of_the_variable, 0},
+  {(char *)"nsteps", __pyx_getprop_9adios_mpi_3var_nsteps, 0, __pyx_k_The_number_of_time_steps_of_the, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_var = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  __pyx_sq_item_9adios_mpi_var, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_var = {
+  0, /*mp_length*/
+  __pyx_pw_9adios_mpi_3var_15__getitem__, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyTypeObject __pyx_type_9adios_mpi_var = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios_mpi.var", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi_var), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_9adios_mpi_var, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_9adios_mpi_3var_13__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  &__pyx_tp_as_sequence_var, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_var, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "var(file file, char *name)\n\n    Adios variable class.\n\n    Unlike attributes whose values are populated on initialization,\n    variable's values will be returned by explicitly calling read() or\n    array access interface ([]).  \n\n    Args:\n        file (file): Associated file class\n        name (str): variable name\n\n    Note:\n        Users do not need to create this class manually.\n    ", /*tp_doc*/
+  __pyx_tp_traverse_9adios_mpi_var, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi_var, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_9adios_mpi_var, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_9adios_mpi_var, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_9adios_mpi_3var_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_9adios_mpi_var, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_9adios_mpi_attr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_9adios_mpi_attr *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_9adios_mpi_attr *)o);
+  p->file = ((struct __pyx_obj_9adios_mpi_file *)Py_None); Py_INCREF(Py_None);
+  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->dtype = ((PyArray_Descr *)Py_None); Py_INCREF(Py_None);
+  p->value = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_9adios_mpi_attr(PyObject *o) {
+  struct __pyx_obj_9adios_mpi_attr *p = (struct __pyx_obj_9adios_mpi_attr *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->file);
+  Py_CLEAR(p->name);
+  Py_CLEAR(p->dtype);
+  Py_CLEAR(p->value);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_9adios_mpi_attr(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_9adios_mpi_attr *p = (struct __pyx_obj_9adios_mpi_attr *)o;
+  if (p->file) {
+    e = (*v)(((PyObject*)p->file), a); if (e) return e;
+  }
+  if (p->dtype) {
+    e = (*v)(((PyObject*)p->dtype), a); if (e) return e;
+  }
+  if (p->value) {
+    e = (*v)(((PyObject*)p->value), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_9adios_mpi_attr(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_9adios_mpi_attr *p = (struct __pyx_obj_9adios_mpi_attr *)o;
+  tmp = ((PyObject*)p->file);
+  p->file = ((struct __pyx_obj_9adios_mpi_file *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->dtype);
+  p->dtype = ((PyArray_Descr *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->value);
+  p->value = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4attr_name(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4attr_4name_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4attr_dtype(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4attr_5dtype_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_9adios_mpi_4attr_value(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_4attr_5value_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_9adios_mpi_attr[] = {
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_9adios_mpi_attr[] = {
+  {(char *)"name", __pyx_getprop_9adios_mpi_4attr_name, 0, __pyx_k_The_attribute_name, 0},
+  {(char *)"dtype", __pyx_getprop_9adios_mpi_4attr_dtype, 0, __pyx_k_The_attribute_type_as_in_numpy, 0},
+  {(char *)"value", __pyx_getprop_9adios_mpi_4attr_value, 0, __pyx_k_The_attribute_s_value, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyTypeObject __pyx_type_9adios_mpi_attr = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios_mpi.attr", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi_attr), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_9adios_mpi_attr, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_9adios_mpi_4attr_3__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "attr(file file, char *name)\n\n    Adios attribute class.\n    \n    Attribute values are loaded on initialization.\n\n    Args:\n        attr_name (str): attribute name\n\n    Raises:\n        KeyError: If no attribute name exists.\n\n    Note:\n        Users do not need to create this class manually.        \n    ", /*tp_doc*/
+  __pyx_tp_traverse_9adios_mpi_attr, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi_attr, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_9adios_mpi_attr, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_9adios_mpi_attr, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_9adios_mpi_4attr_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_9adios_mpi_attr, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_9adios_mpi_smartdict(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_9adios_mpi_smartdict *p;
+  PyObject *o = (&PyDict_Type)->tp_new(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_9adios_mpi_smartdict *)o);
+  p->factory = Py_None; Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_9adios_mpi_smartdict(PyObject *o) {
+  struct __pyx_obj_9adios_mpi_smartdict *p = (struct __pyx_obj_9adios_mpi_smartdict *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->factory);
+  PyObject_GC_Track(o);
+  (&PyDict_Type)->tp_dealloc(o);
+}
+
+static int __pyx_tp_traverse_9adios_mpi_smartdict(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_9adios_mpi_smartdict *p = (struct __pyx_obj_9adios_mpi_smartdict *)o;
+  if (!(&PyDict_Type)->tp_traverse); else { e = (&PyDict_Type)->tp_traverse(o,v,a); if (e) return e; }
+  if (p->factory) {
+    e = (*v)(p->factory, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_9adios_mpi_smartdict(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_9adios_mpi_smartdict *p = (struct __pyx_obj_9adios_mpi_smartdict *)o;
+  if (!(&PyDict_Type)->tp_clear); else (&PyDict_Type)->tp_clear(o);
+  tmp = ((PyObject*)p->factory);
+  p->factory = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static int __pyx_mp_ass_subscript_9adios_mpi_smartdict(PyObject *o, PyObject *i, PyObject *v) {
+  if (v) {
+    return __pyx_pw_9adios_mpi_9smartdict_3__setitem__(o, i, v);
+  }
+  else {
+    if ((&PyDict_Type)->tp_as_mapping && (&PyDict_Type)->tp_as_mapping->mp_ass_subscript)
+      return (&PyDict_Type)->tp_as_mapping->mp_ass_subscript(o, i, v);
+    PyErr_Format(PyExc_NotImplementedError,
+      "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name);
+    return -1;
+  }
+}
+
+static PyMethodDef __pyx_methods_9adios_mpi_smartdict[] = {
+  {0, 0, 0, 0}
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_smartdict = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  __pyx_mp_ass_subscript_9adios_mpi_smartdict, /*mp_ass_subscript*/
+};
+
+static PyTypeObject __pyx_type_9adios_mpi_smartdict = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios_mpi.smartdict", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi_smartdict), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_9adios_mpi_smartdict, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_smartdict, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "smartdict(factory)", /*tp_doc*/
+  __pyx_tp_traverse_9adios_mpi_smartdict, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi_smartdict, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_9adios_mpi_smartdict, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_9adios_mpi_9smartdict_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_9adios_mpi_smartdict, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_9adios_mpi_writer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_9adios_mpi_writer *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_9adios_mpi_writer *)o);
+  p->fname = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->gname = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->method = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->method_params = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->comm = ((struct PyMPICommObject *)Py_None); Py_INCREF(Py_None);
+  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_9adios_mpi_writer(PyObject *o) {
+  struct __pyx_obj_9adios_mpi_writer *p = (struct __pyx_obj_9adios_mpi_writer *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->fname);
+  Py_CLEAR(p->gname);
+  Py_CLEAR(p->method);
+  Py_CLEAR(p->method_params);
+  Py_CLEAR(p->comm);
+  Py_CLEAR(p->var);
+  Py_CLEAR(p->attr);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_9adios_mpi_writer(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_9adios_mpi_writer *p = (struct __pyx_obj_9adios_mpi_writer *)o;
+  if (p->comm) {
+    e = (*v)(((PyObject*)p->comm), a); if (e) return e;
+  }
+  if (p->var) {
+    e = (*v)(p->var, a); if (e) return e;
+  }
+  if (p->attr) {
+    e = (*v)(p->attr, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_9adios_mpi_writer(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_9adios_mpi_writer *p = (struct __pyx_obj_9adios_mpi_writer *)o;
+  tmp = ((PyObject*)p->comm);
+  p->comm = ((struct PyMPICommObject *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->var);
+  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->attr);
+  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+static PyObject *__pyx_sq_item_9adios_mpi_writer(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783
- *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
- * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
- *     # Recursive utility function used in __getbuffer__ to get format
- *     # string. The new location in the format string is returned.
- */
+static int __pyx_mp_ass_subscript_9adios_mpi_writer(PyObject *o, PyObject *i, PyObject *v) {
+  if (v) {
+    return __pyx_pw_9adios_mpi_6writer_11__setitem__(o, i, v);
+  }
+  else {
+    PyErr_Format(PyExc_NotImplementedError,
+      "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name);
+    return -1;
+  }
+}
 
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_child);
-  __Pyx_XDECREF(__pyx_v_fields);
-  __Pyx_XDECREF(__pyx_v_childname);
-  __Pyx_XDECREF(__pyx_v_new_offset);
-  __Pyx_XDECREF(__pyx_v_t);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
+static PyObject *__pyx_getprop_9adios_mpi_6writer_fname(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_6writer_5fname_1__get__(o);
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":966
- * 
- * 
- * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
- *      cdef PyObject* baseptr
- *      if base is None:
- */
+static PyObject *__pyx_getprop_9adios_mpi_6writer_gname(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_6writer_5gname_1__get__(o);
+}
 
-static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
-  PyObject *__pyx_v_baseptr;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  __Pyx_RefNannySetupContext("set_array_base", 0);
+static PyObject *__pyx_getprop_9adios_mpi_6writer_is_noxml(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_6writer_8is_noxml_1__get__(o);
+}
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":968
- * cdef inline void set_array_base(ndarray arr, object base):
- *      cdef PyObject* baseptr
- *      if base is None:             # <<<<<<<<<<<<<<
- *          baseptr = NULL
- *      else:
- */
-  __pyx_t_1 = (__pyx_v_base == Py_None);
-  __pyx_t_2 = (__pyx_t_1 != 0);
-  if (__pyx_t_2) {
+static PyObject *__pyx_getprop_9adios_mpi_6writer_var(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_6writer_3var_1__get__(o);
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969
- *      cdef PyObject* baseptr
- *      if base is None:
- *          baseptr = NULL             # <<<<<<<<<<<<<<
- *      else:
- *          Py_INCREF(base) # important to do this before decref below!
- */
-    __pyx_v_baseptr = NULL;
-    goto __pyx_L3;
-  }
-  /*else*/ {
+static PyObject *__pyx_getprop_9adios_mpi_6writer_attr(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_6writer_4attr_1__get__(o);
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":971
- *          baseptr = NULL
- *      else:
- *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<
- *          baseptr = <PyObject*>base
- *      Py_XDECREF(arr.base)
- */
-    Py_INCREF(__pyx_v_base);
+static PyMethodDef __pyx_methods_9adios_mpi_writer[] = {
+  {"declare_group", (PyCFunction)__pyx_pw_9adios_mpi_6writer_3declare_group, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_6writer_2declare_group},
+  {"define_var", (PyCFunction)__pyx_pw_9adios_mpi_6writer_5define_var, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_6writer_4define_var},
+  {"define_attr", (PyCFunction)__pyx_pw_9adios_mpi_6writer_7define_attr, METH_O, __pyx_doc_9adios_mpi_6writer_6define_attr},
+  {"define_dynamic_attr", (PyCFunction)__pyx_pw_9adios_mpi_6writer_9define_dynamic_attr, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_6writer_8define_dynamic_attr},
+  {"close", (PyCFunction)__pyx_pw_9adios_mpi_6writer_15close, METH_NOARGS, __pyx_doc_9adios_mpi_6writer_14close},
+  {0, 0, 0, 0}
+};
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":972
- *      else:
- *          Py_INCREF(base) # important to do this before decref below!
- *          baseptr = <PyObject*>base             # <<<<<<<<<<<<<<
- *      Py_XDECREF(arr.base)
- *      arr.base = baseptr
- */
-    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);
-  }
-  __pyx_L3:;
+static struct PyGetSetDef __pyx_getsets_9adios_mpi_writer[] = {
+  {(char *)"fname", __pyx_getprop_9adios_mpi_6writer_fname, 0, __pyx_k_The_filename_to_write, 0},
+  {(char *)"gname", __pyx_getprop_9adios_mpi_6writer_gname, 0, __pyx_k_The_groupname_associated_with_t, 0},
+  {(char *)"is_noxml", __pyx_getprop_9adios_mpi_6writer_is_noxml, 0, __pyx_k_Boolean_to_indicate_using_No_XM, 0},
+  {(char *)"var", __pyx_getprop_9adios_mpi_6writer_var, 0, __pyx_k_Dictionary_of_variables_to_writ, 0},
+  {(char *)"attr", __pyx_getprop_9adios_mpi_6writer_attr, 0, __pyx_k_Dictionary_of_attributes_to_wri, 0},
+  {0, 0, 0, 0, 0}
+};
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":973
- *          Py_INCREF(base) # important to do this before decref below!
- *          baseptr = <PyObject*>base
- *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<
- *      arr.base = baseptr
- * 
- */
-  Py_XDECREF(__pyx_v_arr->base);
+static PySequenceMethods __pyx_tp_as_sequence_writer = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  __pyx_sq_item_9adios_mpi_writer, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":974
- *          baseptr = <PyObject*>base
- *      Py_XDECREF(arr.base)
- *      arr.base = baseptr             # <<<<<<<<<<<<<<
- * 
- * cdef inline object get_array_base(ndarray arr):
- */
-  __pyx_v_arr->base = __pyx_v_baseptr;
+static PyMappingMethods __pyx_tp_as_mapping_writer = {
+  0, /*mp_length*/
+  __pyx_pw_9adios_mpi_6writer_13__getitem__, /*mp_subscript*/
+  __pyx_mp_ass_subscript_9adios_mpi_writer, /*mp_ass_subscript*/
+};
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":966
- * 
- * 
- * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
- *      cdef PyObject* baseptr
- *      if base is None:
- */
+static PyTypeObject __pyx_type_9adios_mpi_writer = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios_mpi.writer", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi_writer), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_9adios_mpi_writer, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_9adios_mpi_6writer_17__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  &__pyx_tp_as_sequence_writer, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_writer, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "writer(char *fname, bool is_noxml=True, Comm comm=MPI.COMM_WORLD)\n\n    writer class for Adios write.\n\n    Args:\n        fname (str): filename.\n        is_noxml (bool, optional): Set True if use noxml APIs (default: True).\n        comm (MPI.Comm, optional): MPI comm for parallel read/write (default: MPI.COMM_WORLD).\n\n    Example:\n    \n    >>> import adios as ad\n    >>> f = ad.writer('adiosfile.bp')\n    \n    ", /*tp_doc*/
+  __pyx_tp_traverse_9adios_mpi_writer, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi_writer, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_9adios_mpi_writer, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_9adios_mpi_writer, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_9adios_mpi_6writer_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_9adios_mpi_writer, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
 
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
+static PyObject *__pyx_tp_new_9adios_mpi_attrinfo(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_9adios_mpi_attrinfo *p;
+  PyObject *o;
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_9adios_mpi_attrinfo *)o);
+  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->dtype = Py_None; Py_INCREF(Py_None);
+  p->value = Py_None; Py_INCREF(Py_None);
+  return o;
 }
 
-/* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976
- *      arr.base = baseptr
- * 
- * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
- *     if arr.base is NULL:
- *         return None
- */
+static void __pyx_tp_dealloc_9adios_mpi_attrinfo(PyObject *o) {
+  struct __pyx_obj_9adios_mpi_attrinfo *p = (struct __pyx_obj_9adios_mpi_attrinfo *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->name);
+  Py_CLEAR(p->dtype);
+  Py_CLEAR(p->value);
+  (*Py_TYPE(o)->tp_free)(o);
+}
 
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("get_array_base", 0);
+static int __pyx_tp_traverse_9adios_mpi_attrinfo(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_9adios_mpi_attrinfo *p = (struct __pyx_obj_9adios_mpi_attrinfo *)o;
+  if (p->dtype) {
+    e = (*v)(p->dtype, a); if (e) return e;
+  }
+  if (p->value) {
+    e = (*v)(p->value, a); if (e) return e;
+  }
+  return 0;
+}
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977
- * 
- * cdef inline object get_array_base(ndarray arr):
- *     if arr.base is NULL:             # <<<<<<<<<<<<<<
- *         return None
- *     else:
- */
-  __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0);
-  if (__pyx_t_1) {
+static int __pyx_tp_clear_9adios_mpi_attrinfo(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_9adios_mpi_attrinfo *p = (struct __pyx_obj_9adios_mpi_attrinfo *)o;
+  tmp = ((PyObject*)p->dtype);
+  p->dtype = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->value);
+  p->value = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":978
- * cdef inline object get_array_base(ndarray arr):
- *     if arr.base is NULL:
- *         return None             # <<<<<<<<<<<<<<
- *     else:
- *         return <object>arr.base
- */
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_INCREF(Py_None);
-    __pyx_r = Py_None;
-    goto __pyx_L0;
-  }
-  /*else*/ {
+static PyObject *__pyx_getprop_9adios_mpi_8attrinfo_name(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_8attrinfo_4name_1__get__(o);
+}
 
-    /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":980
- *         return None
- *     else:
- *         return <object>arr.base             # <<<<<<<<<<<<<<
- */
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));
-    __pyx_r = ((PyObject *)__pyx_v_arr->base);
-    goto __pyx_L0;
-  }
+static PyObject *__pyx_getprop_9adios_mpi_8attrinfo_is_static(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_8attrinfo_9is_static_1__get__(o);
+}
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976
- *      arr.base = baseptr
- * 
- * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
- *     if arr.base is NULL:
- *         return None
- */
+static PyObject *__pyx_getprop_9adios_mpi_8attrinfo_dtype(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_8attrinfo_5dtype_1__get__(o);
+}
 
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
+static PyObject *__pyx_getprop_9adios_mpi_8attrinfo_value(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_8attrinfo_5value_1__get__(o);
+}
+
+static int __pyx_setprop_9adios_mpi_8attrinfo_value(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_9adios_mpi_8attrinfo_5value_3__set__(o, v);
+  }
+  else {
+    PyErr_SetString(PyExc_NotImplementedError, "__del__");
+    return -1;
+  }
 }
-static struct __pyx_vtabstruct_9adios_mpi_file __pyx_vtable_9adios_mpi_file;
 
-static PyObject *__pyx_tp_new_9adios_mpi_file(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
-  struct __pyx_obj_9adios_mpi_file *p;
+static PyMethodDef __pyx_methods_9adios_mpi_attrinfo[] = {
+  {"define", (PyCFunction)__pyx_pw_9adios_mpi_8attrinfo_3define, METH_O, __pyx_doc_9adios_mpi_8attrinfo_2define},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_9adios_mpi_attrinfo[] = {
+  {(char *)"name", __pyx_getprop_9adios_mpi_8attrinfo_name, 0, 0, 0},
+  {(char *)"is_static", __pyx_getprop_9adios_mpi_8attrinfo_is_static, 0, 0, 0},
+  {(char *)"dtype", __pyx_getprop_9adios_mpi_8attrinfo_dtype, 0, 0, 0},
+  {(char *)"value", __pyx_getprop_9adios_mpi_8attrinfo_value, __pyx_setprop_9adios_mpi_8attrinfo_value, 0, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyTypeObject __pyx_type_9adios_mpi_attrinfo = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios_mpi.attrinfo", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi_attrinfo), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_9adios_mpi_attrinfo, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_9adios_mpi_8attrinfo_5__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "attrinfo(char *name, value=None, dtype=None, bool is_static=True)", /*tp_doc*/
+  __pyx_tp_traverse_9adios_mpi_attrinfo, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi_attrinfo, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_9adios_mpi_attrinfo, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_9adios_mpi_attrinfo, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_9adios_mpi_8attrinfo_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_9adios_mpi_attrinfo, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_9adios_mpi_varinfo(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_9adios_mpi_varinfo *p;
   PyObject *o;
   if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
     o = (*t->tp_alloc)(t, 0);
@@ -13307,16 +24140,17 @@ static PyObject *__pyx_tp_new_9adios_mpi_file(PyTypeObject *t, CYTHON_UNUSED PyO
     o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
   }
   if (unlikely(!o)) return 0;
-  p = ((struct __pyx_obj_9adios_mpi_file *)o);
-  p->__pyx_vtab = __pyx_vtabptr_9adios_mpi_file;
+  p = ((struct __pyx_obj_9adios_mpi_varinfo *)o);
   p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->ldim = Py_None; Py_INCREF(Py_None);
+  p->gdim = Py_None; Py_INCREF(Py_None);
+  p->offset = Py_None; Py_INCREF(Py_None);
+  p->value = Py_None; Py_INCREF(Py_None);
   return o;
 }
 
-static void __pyx_tp_dealloc_9adios_mpi_file(PyObject *o) {
-  struct __pyx_obj_9adios_mpi_file *p = (struct __pyx_obj_9adios_mpi_file *)o;
+static void __pyx_tp_dealloc_9adios_mpi_varinfo(PyObject *o) {
+  struct __pyx_obj_9adios_mpi_varinfo *p = (struct __pyx_obj_9adios_mpi_varinfo *)o;
   #if PY_VERSION_HEX >= 0x030400a1
   if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
     if (PyObject_CallFinalizerFromDealloc(o)) return;
@@ -13324,215 +24158,356 @@ static void __pyx_tp_dealloc_9adios_mpi_file(PyObject *o) {
   #endif
   PyObject_GC_UnTrack(o);
   Py_CLEAR(p->name);
-  Py_CLEAR(p->var);
-  Py_CLEAR(p->attr);
+  Py_CLEAR(p->ldim);
+  Py_CLEAR(p->gdim);
+  Py_CLEAR(p->offset);
+  Py_CLEAR(p->value);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_9adios_mpi_file(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_9adios_mpi_varinfo(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_9adios_mpi_file *p = (struct __pyx_obj_9adios_mpi_file *)o;
-  if (p->var) {
-    e = (*v)(p->var, a); if (e) return e;
+  struct __pyx_obj_9adios_mpi_varinfo *p = (struct __pyx_obj_9adios_mpi_varinfo *)o;
+  if (p->ldim) {
+    e = (*v)(p->ldim, a); if (e) return e;
   }
-  if (p->attr) {
-    e = (*v)(p->attr, a); if (e) return e;
+  if (p->gdim) {
+    e = (*v)(p->gdim, a); if (e) return e;
+  }
+  if (p->offset) {
+    e = (*v)(p->offset, a); if (e) return e;
+  }
+  if (p->value) {
+    e = (*v)(p->value, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_9adios_mpi_file(PyObject *o) {
+static int __pyx_tp_clear_9adios_mpi_varinfo(PyObject *o) {
   PyObject* tmp;
-  struct __pyx_obj_9adios_mpi_file *p = (struct __pyx_obj_9adios_mpi_file *)o;
-  tmp = ((PyObject*)p->var);
-  p->var = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  struct __pyx_obj_9adios_mpi_varinfo *p = (struct __pyx_obj_9adios_mpi_varinfo *)o;
+  tmp = ((PyObject*)p->ldim);
+  p->ldim = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->attr);
-  p->attr = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->gdim);
+  p->gdim = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->offset);
+  p->offset = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->value);
+  p->value = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_name(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_4name_1__get__(o);
+static PyObject *__pyx_getprop_9adios_mpi_7varinfo_ldim(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_7varinfo_4ldim_1__get__(o);
 }
 
-static int __pyx_setprop_9adios_mpi_4file_name(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_9adios_mpi_7varinfo_ldim(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pw_9adios_mpi_4file_4name_3__set__(o, v);
+    return __pyx_pw_9adios_mpi_7varinfo_4ldim_3__set__(o, v);
   }
   else {
-    return __pyx_pw_9adios_mpi_4file_4name_5__del__(o);
+    return __pyx_pw_9adios_mpi_7varinfo_4ldim_5__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_nvars(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_5nvars_1__get__(o);
+static PyObject *__pyx_getprop_9adios_mpi_7varinfo_gdim(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_7varinfo_4gdim_1__get__(o);
 }
 
-static int __pyx_setprop_9adios_mpi_4file_nvars(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_9adios_mpi_7varinfo_gdim(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pw_9adios_mpi_4file_5nvars_3__set__(o, v);
+    return __pyx_pw_9adios_mpi_7varinfo_4gdim_3__set__(o, v);
   }
   else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
+    return __pyx_pw_9adios_mpi_7varinfo_4gdim_5__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_nattrs(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_6nattrs_1__get__(o);
+static PyObject *__pyx_getprop_9adios_mpi_7varinfo_offset(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_7varinfo_6offset_1__get__(o);
 }
 
-static int __pyx_setprop_9adios_mpi_4file_nattrs(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_9adios_mpi_7varinfo_offset(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pw_9adios_mpi_4file_6nattrs_3__set__(o, v);
+    return __pyx_pw_9adios_mpi_7varinfo_6offset_3__set__(o, v);
   }
   else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
+    return __pyx_pw_9adios_mpi_7varinfo_6offset_5__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_current_step(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_12current_step_1__get__(o);
+static PyObject *__pyx_getprop_9adios_mpi_7varinfo_value(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_9adios_mpi_7varinfo_5value_1__get__(o);
 }
 
-static int __pyx_setprop_9adios_mpi_4file_current_step(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_9adios_mpi_7varinfo_value(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pw_9adios_mpi_4file_12current_step_3__set__(o, v);
+    return __pyx_pw_9adios_mpi_7varinfo_5value_3__set__(o, v);
   }
   else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
+    return __pyx_pw_9adios_mpi_7varinfo_5value_5__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_last_step(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_9last_step_1__get__(o);
-}
-
-static int __pyx_setprop_9adios_mpi_4file_last_step(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_4file_9last_step_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
+static PyMethodDef __pyx_methods_9adios_mpi_varinfo[] = {
+  {"define", (PyCFunction)__pyx_pw_9adios_mpi_7varinfo_3define, METH_O, __pyx_doc_9adios_mpi_7varinfo_2define},
+  {"bytes", (PyCFunction)__pyx_pw_9adios_mpi_7varinfo_5bytes, METH_NOARGS, __pyx_doc_9adios_mpi_7varinfo_4bytes},
+  {"write", (PyCFunction)__pyx_pw_9adios_mpi_7varinfo_7write, METH_O, __pyx_doc_9adios_mpi_7varinfo_6write},
+  {0, 0, 0, 0}
+};
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_endianness(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_10endianness_1__get__(o);
-}
+static struct PyGetSetDef __pyx_getsets_9adios_mpi_varinfo[] = {
+  {(char *)"ldim", __pyx_getprop_9adios_mpi_7varinfo_ldim, __pyx_setprop_9adios_mpi_7varinfo_ldim, __pyx_k_ldim_object, 0},
+  {(char *)"gdim", __pyx_getprop_9adios_mpi_7varinfo_gdim, __pyx_setprop_9adios_mpi_7varinfo_gdim, __pyx_k_gdim_object, 0},
+  {(char *)"offset", __pyx_getprop_9adios_mpi_7varinfo_offset, __pyx_setprop_9adios_mpi_7varinfo_offset, __pyx_k_offset_object, 0},
+  {(char *)"value", __pyx_getprop_9adios_mpi_7varinfo_value, __pyx_setprop_9adios_mpi_7varinfo_value, __pyx_k_value_object, 0},
+  {0, 0, 0, 0, 0}
+};
 
-static int __pyx_setprop_9adios_mpi_4file_endianness(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_4file_10endianness_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
+static PyTypeObject __pyx_type_9adios_mpi_varinfo = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios_mpi.varinfo", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi_varinfo), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_9adios_mpi_varinfo, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  __pyx_pw_9adios_mpi_7varinfo_9__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  "varinfo(char *name, ldim=<\077\077?>, gdim=<\077\077?>, offset=<\077\077?>)", /*tp_doc*/
+  __pyx_tp_traverse_9adios_mpi_varinfo, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi_varinfo, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_9adios_mpi_varinfo, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_9adios_mpi_varinfo, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_pw_9adios_mpi_7varinfo_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_9adios_mpi_varinfo, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_version(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_7version_1__get__(o);
-}
+static struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *__pyx_freelist_9adios_mpi___pyx_scope_struct____getitem__[8];
+static int __pyx_freecount_9adios_mpi___pyx_scope_struct____getitem__ = 0;
 
-static int __pyx_setprop_9adios_mpi_4file_version(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_4file_7version_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
+static PyObject *__pyx_tp_new_9adios_mpi___pyx_scope_struct____getitem__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_9adios_mpi___pyx_scope_struct____getitem__ > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__)))) {
+    o = (PyObject*)__pyx_freelist_9adios_mpi___pyx_scope_struct____getitem__[--__pyx_freecount_9adios_mpi___pyx_scope_struct____getitem__];
+    memset(o, 0, sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
   }
+  return o;
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_file_size(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_9file_size_1__get__(o);
-}
-
-static int __pyx_setprop_9adios_mpi_4file_file_size(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_4file_9file_size_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
+static void __pyx_tp_dealloc_9adios_mpi___pyx_scope_struct____getitem__(PyObject *o) {
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *p = (struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *)o;
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_dims_);
+  Py_CLEAR(p->__pyx_v_index_);
+  Py_CLEAR(p->__pyx_v_self);
+  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_9adios_mpi___pyx_scope_struct____getitem__ < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__)))) {
+    __pyx_freelist_9adios_mpi___pyx_scope_struct____getitem__[__pyx_freecount_9adios_mpi___pyx_scope_struct____getitem__++] = ((struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *)o);
+  } else {
+    (*Py_TYPE(o)->tp_free)(o);
   }
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_var(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_3var_1__get__(o);
-}
-
-static int __pyx_setprop_9adios_mpi_4file_var(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_4file_3var_3__set__(o, v);
+static int __pyx_tp_traverse_9adios_mpi___pyx_scope_struct____getitem__(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *p = (struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *)o;
+  if (p->__pyx_v_dims_) {
+    e = (*v)(p->__pyx_v_dims_, a); if (e) return e;
   }
-  else {
-    return __pyx_pw_9adios_mpi_4file_3var_5__del__(o);
+  if (p->__pyx_v_index_) {
+    e = (*v)(p->__pyx_v_index_, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
+  return 0;
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_attr(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_4attr_1__get__(o);
+static int __pyx_tp_clear_9adios_mpi___pyx_scope_struct____getitem__(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *p = (struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *)o;
+  tmp = ((PyObject*)p->__pyx_v_dims_);
+  p->__pyx_v_dims_ = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_index_);
+  p->__pyx_v_index_ = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_self);
+  p->__pyx_v_self = ((struct __pyx_obj_9adios_mpi_var *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
 }
 
-static int __pyx_setprop_9adios_mpi_4file_attr(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_4file_4attr_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_9adios_mpi_4file_4attr_5__del__(o);
+static PyTypeObject __pyx_type_9adios_mpi___pyx_scope_struct____getitem__ = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "adios_mpi.__pyx_scope_struct____getitem__", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_9adios_mpi___pyx_scope_struct____getitem__, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  0, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_9adios_mpi___pyx_scope_struct____getitem__, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi___pyx_scope_struct____getitem__, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  0, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_9adios_mpi___pyx_scope_struct____getitem__, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
+  #endif
+};
+
+static struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *__pyx_freelist_9adios_mpi___pyx_scope_struct_1_genexpr[8];
+static int __pyx_freecount_9adios_mpi___pyx_scope_struct_1_genexpr = 0;
+
+static PyObject *__pyx_tp_new_9adios_mpi___pyx_scope_struct_1_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_9adios_mpi___pyx_scope_struct_1_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr)))) {
+    o = (PyObject*)__pyx_freelist_9adios_mpi___pyx_scope_struct_1_genexpr[--__pyx_freecount_9adios_mpi___pyx_scope_struct_1_genexpr];
+    memset(o, 0, sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
   }
+  return o;
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_4file_is_stream(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_4file_9is_stream_1__get__(o);
+static void __pyx_tp_dealloc_9adios_mpi___pyx_scope_struct_1_genexpr(PyObject *o) {
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *)o;
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_x);
+  Py_CLEAR(p->__pyx_t_0);
+  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_9adios_mpi___pyx_scope_struct_1_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr)))) {
+    __pyx_freelist_9adios_mpi___pyx_scope_struct_1_genexpr[__pyx_freecount_9adios_mpi___pyx_scope_struct_1_genexpr++] = ((struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *)o);
+  } else {
+    (*Py_TYPE(o)->tp_free)(o);
+  }
 }
 
-static int __pyx_setprop_9adios_mpi_4file_is_stream(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_4file_9is_stream_3__set__(o, v);
+static int __pyx_tp_traverse_9adios_mpi___pyx_scope_struct_1_genexpr(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
+  if (p->__pyx_v_x) {
+    e = (*v)(p->__pyx_v_x, a); if (e) return e;
   }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  return 0;
 }
 
-static PyMethodDef __pyx_methods_9adios_mpi_file[] = {
-  {"__del__", (PyCFunction)__pyx_pw_9adios_mpi_4file_3__del__, METH_NOARGS, 0},
-  {"close", (PyCFunction)__pyx_pw_9adios_mpi_4file_5close, METH_NOARGS, 0},
-  {"printself", (PyCFunction)__pyx_pw_9adios_mpi_4file_7printself, METH_NOARGS, 0},
-  {"advance", (PyCFunction)__pyx_pw_9adios_mpi_4file_9advance, METH_VARARGS|METH_KEYWORDS, 0},
-  {0, 0, 0, 0}
-};
-
-static struct PyGetSetDef __pyx_getsets_9adios_mpi_file[] = {
-  {(char *)"name", __pyx_getprop_9adios_mpi_4file_name, __pyx_setprop_9adios_mpi_4file_name, 0, 0},
-  {(char *)"nvars", __pyx_getprop_9adios_mpi_4file_nvars, __pyx_setprop_9adios_mpi_4file_nvars, 0, 0},
-  {(char *)"nattrs", __pyx_getprop_9adios_mpi_4file_nattrs, __pyx_setprop_9adios_mpi_4file_nattrs, 0, 0},
-  {(char *)"current_step", __pyx_getprop_9adios_mpi_4file_current_step, __pyx_setprop_9adios_mpi_4file_current_step, 0, 0},
-  {(char *)"last_step", __pyx_getprop_9adios_mpi_4file_last_step, __pyx_setprop_9adios_mpi_4file_last_step, 0, 0},
-  {(char *)"endianness", __pyx_getprop_9adios_mpi_4file_endianness, __pyx_setprop_9adios_mpi_4file_endianness, 0, 0},
-  {(char *)"version", __pyx_getprop_9adios_mpi_4file_version, __pyx_setprop_9adios_mpi_4file_version, 0, 0},
-  {(char *)"file_size", __pyx_getprop_9adios_mpi_4file_file_size, __pyx_setprop_9adios_mpi_4file_file_size, 0, 0},
-  {(char *)"var", __pyx_getprop_9adios_mpi_4file_var, __pyx_setprop_9adios_mpi_4file_var, 0, 0},
-  {(char *)"attr", __pyx_getprop_9adios_mpi_4file_attr, __pyx_setprop_9adios_mpi_4file_attr, 0, 0},
-  {(char *)"is_stream", __pyx_getprop_9adios_mpi_4file_is_stream, __pyx_setprop_9adios_mpi_4file_is_stream, 0, 0},
-  {0, 0, 0, 0, 0}
-};
+static int __pyx_tp_clear_9adios_mpi___pyx_scope_struct_1_genexpr(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr *)o;
+  tmp = ((PyObject*)p->__pyx_outer_scope);
+  p->__pyx_outer_scope = ((struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_x);
+  p->__pyx_v_x = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_0);
+  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
 
-static PyTypeObject __pyx_type_9adios_mpi_file = {
+static PyTypeObject __pyx_type_9adios_mpi___pyx_scope_struct_1_genexpr = {
   PyVarObject_HEAD_INIT(0, 0)
-  "adios_mpi.file", /*tp_name*/
-  sizeof(struct __pyx_obj_9adios_mpi_file), /*tp_basicsize*/
+  "adios_mpi.__pyx_scope_struct_1_genexpr", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct_1_genexpr), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_9adios_mpi_file, /*tp_dealloc*/
+  __pyx_tp_dealloc_9adios_mpi___pyx_scope_struct_1_genexpr, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -13551,25 +24526,25 @@ static PyTypeObject __pyx_type_9adios_mpi_file = {
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   0, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  " Private Memeber ", /*tp_doc*/
-  __pyx_tp_traverse_9adios_mpi_file, /*tp_traverse*/
-  __pyx_tp_clear_9adios_mpi_file, /*tp_clear*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_9adios_mpi___pyx_scope_struct_1_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi___pyx_scope_struct_1_genexpr, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_9adios_mpi_file, /*tp_methods*/
+  0, /*tp_methods*/
   0, /*tp_members*/
-  __pyx_getsets_9adios_mpi_file, /*tp_getset*/
+  0, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pw_9adios_mpi_4file_1__init__, /*tp_init*/
+  0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_9adios_mpi_file, /*tp_new*/
+  __pyx_tp_new_9adios_mpi___pyx_scope_struct_1_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -13583,176 +24558,73 @@ static PyTypeObject __pyx_type_9adios_mpi_file = {
   0, /*tp_finalize*/
   #endif
 };
-static struct __pyx_vtabstruct_9adios_mpi_var __pyx_vtable_9adios_mpi_var;
 
-static PyObject *__pyx_tp_new_9adios_mpi_var(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
-  struct __pyx_obj_9adios_mpi_var *p;
+static struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *__pyx_freelist_9adios_mpi___pyx_scope_struct_2_genexpr[8];
+static int __pyx_freecount_9adios_mpi___pyx_scope_struct_2_genexpr = 0;
+
+static PyObject *__pyx_tp_new_9adios_mpi___pyx_scope_struct_2_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o;
-  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
-    o = (*t->tp_alloc)(t, 0);
+  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_9adios_mpi___pyx_scope_struct_2_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr)))) {
+    o = (PyObject*)__pyx_freelist_9adios_mpi___pyx_scope_struct_2_genexpr[--__pyx_freecount_9adios_mpi___pyx_scope_struct_2_genexpr];
+    memset(o, 0, sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
   } else {
-    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
   }
-  if (unlikely(!o)) return 0;
-  p = ((struct __pyx_obj_9adios_mpi_var *)o);
-  p->__pyx_vtab = __pyx_vtabptr_9adios_mpi_var;
-  p->file = ((struct __pyx_obj_9adios_mpi_file *)Py_None); Py_INCREF(Py_None);
-  p->name = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  p->type = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  p->dims = ((PyObject*)Py_None); Py_INCREF(Py_None);
   return o;
 }
 
-static void __pyx_tp_dealloc_9adios_mpi_var(PyObject *o) {
-  struct __pyx_obj_9adios_mpi_var *p = (struct __pyx_obj_9adios_mpi_var *)o;
-  #if PY_VERSION_HEX >= 0x030400a1
-  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
-    if (PyObject_CallFinalizerFromDealloc(o)) return;
-  }
-  #endif
+static void __pyx_tp_dealloc_9adios_mpi___pyx_scope_struct_2_genexpr(PyObject *o) {
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *)o;
   PyObject_GC_UnTrack(o);
-  Py_CLEAR(p->file);
-  Py_CLEAR(p->name);
-  Py_CLEAR(p->type);
-  Py_CLEAR(p->dims);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_x);
+  Py_CLEAR(p->__pyx_t_0);
+  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_9adios_mpi___pyx_scope_struct_2_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr)))) {
+    __pyx_freelist_9adios_mpi___pyx_scope_struct_2_genexpr[__pyx_freecount_9adios_mpi___pyx_scope_struct_2_genexpr++] = ((struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *)o);
+  } else {
+    (*Py_TYPE(o)->tp_free)(o);
+  }
 }
 
-static int __pyx_tp_traverse_9adios_mpi_var(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_9adios_mpi___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_9adios_mpi_var *p = (struct __pyx_obj_9adios_mpi_var *)o;
-  if (p->file) {
-    e = (*v)(((PyObject*)p->file), a); if (e) return e;
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
-  if (p->type) {
-    e = (*v)(p->type, a); if (e) return e;
+  if (p->__pyx_v_x) {
+    e = (*v)(p->__pyx_v_x, a); if (e) return e;
   }
-  if (p->dims) {
-    e = (*v)(p->dims, a); if (e) return e;
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_9adios_mpi_var(PyObject *o) {
+static int __pyx_tp_clear_9adios_mpi___pyx_scope_struct_2_genexpr(PyObject *o) {
   PyObject* tmp;
-  struct __pyx_obj_9adios_mpi_var *p = (struct __pyx_obj_9adios_mpi_var *)o;
-  tmp = ((PyObject*)p->file);
-  p->file = ((struct __pyx_obj_9adios_mpi_file *)Py_None); Py_INCREF(Py_None);
+  struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr *)o;
+  tmp = ((PyObject*)p->__pyx_outer_scope);
+  p->__pyx_outer_scope = ((struct __pyx_obj_9adios_mpi___pyx_scope_struct____getitem__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->type);
-  p->type = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_x);
+  p->__pyx_v_x = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->dims);
-  p->dims = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_t_0);
+  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyObject *__pyx_getprop_9adios_mpi_3var_name(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_3var_4name_1__get__(o);
-}
-
-static int __pyx_setprop_9adios_mpi_3var_name(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_3var_4name_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_9adios_mpi_3var_4name_5__del__(o);
-  }
-}
-
-static PyObject *__pyx_getprop_9adios_mpi_3var_varid(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_3var_5varid_1__get__(o);
-}
-
-static int __pyx_setprop_9adios_mpi_3var_varid(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_3var_5varid_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
-
-static PyObject *__pyx_getprop_9adios_mpi_3var_type(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_3var_4type_1__get__(o);
-}
-
-static int __pyx_setprop_9adios_mpi_3var_type(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_3var_4type_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_9adios_mpi_3var_4type_5__del__(o);
-  }
-}
-
-static PyObject *__pyx_getprop_9adios_mpi_3var_ndim(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_3var_4ndim_1__get__(o);
-}
-
-static int __pyx_setprop_9adios_mpi_3var_ndim(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_3var_4ndim_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
-
-static PyObject *__pyx_getprop_9adios_mpi_3var_dims(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_3var_4dims_1__get__(o);
-}
-
-static int __pyx_setprop_9adios_mpi_3var_dims(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_3var_4dims_3__set__(o, v);
-  }
-  else {
-    return __pyx_pw_9adios_mpi_3var_4dims_5__del__(o);
-  }
-}
-
-static PyObject *__pyx_getprop_9adios_mpi_3var_nsteps(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_9adios_mpi_3var_6nsteps_1__get__(o);
-}
-
-static int __pyx_setprop_9adios_mpi_3var_nsteps(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
-  if (v) {
-    return __pyx_pw_9adios_mpi_3var_6nsteps_3__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
-
-static PyMethodDef __pyx_methods_9adios_mpi_var[] = {
-  {"__del__", (PyCFunction)__pyx_pw_9adios_mpi_3var_3__del__, METH_NOARGS, 0},
-  {"close", (PyCFunction)__pyx_pw_9adios_mpi_3var_5close, METH_NOARGS, 0},
-  {"read", (PyCFunction)__pyx_pw_9adios_mpi_3var_7read, METH_VARARGS|METH_KEYWORDS, 0},
-  {"printself", (PyCFunction)__pyx_pw_9adios_mpi_3var_9printself, METH_NOARGS, 0},
-  {0, 0, 0, 0}
-};
-
-static struct PyGetSetDef __pyx_getsets_9adios_mpi_var[] = {
-  {(char *)"name", __pyx_getprop_9adios_mpi_3var_name, __pyx_setprop_9adios_mpi_3var_name, 0, 0},
-  {(char *)"varid", __pyx_getprop_9adios_mpi_3var_varid, __pyx_setprop_9adios_mpi_3var_varid, 0, 0},
-  {(char *)"type", __pyx_getprop_9adios_mpi_3var_type, __pyx_setprop_9adios_mpi_3var_type, 0, 0},
-  {(char *)"ndim", __pyx_getprop_9adios_mpi_3var_ndim, __pyx_setprop_9adios_mpi_3var_ndim, 0, 0},
-  {(char *)"dims", __pyx_getprop_9adios_mpi_3var_dims, __pyx_setprop_9adios_mpi_3var_dims, 0, 0},
-  {(char *)"nsteps", __pyx_getprop_9adios_mpi_3var_nsteps, __pyx_setprop_9adios_mpi_3var_nsteps, 0, 0},
-  {0, 0, 0, 0, 0}
-};
-
-static PyTypeObject __pyx_type_9adios_mpi_var = {
+static PyTypeObject __pyx_type_9adios_mpi___pyx_scope_struct_2_genexpr = {
   PyVarObject_HEAD_INIT(0, 0)
-  "adios_mpi.var", /*tp_name*/
-  sizeof(struct __pyx_obj_9adios_mpi_var), /*tp_basicsize*/
+  "adios_mpi.__pyx_scope_struct_2_genexpr", /*tp_name*/
+  sizeof(struct __pyx_obj_9adios_mpi___pyx_scope_struct_2_genexpr), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_9adios_mpi_var, /*tp_dealloc*/
+  __pyx_tp_dealloc_9adios_mpi___pyx_scope_struct_2_genexpr, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -13771,25 +24643,25 @@ static PyTypeObject __pyx_type_9adios_mpi_var = {
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   0, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  " Private Memeber ", /*tp_doc*/
-  __pyx_tp_traverse_9adios_mpi_var, /*tp_traverse*/
-  __pyx_tp_clear_9adios_mpi_var, /*tp_clear*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_9adios_mpi___pyx_scope_struct_2_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_9adios_mpi___pyx_scope_struct_2_genexpr, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_9adios_mpi_var, /*tp_methods*/
+  0, /*tp_methods*/
   0, /*tp_members*/
-  __pyx_getsets_9adios_mpi_var, /*tp_getset*/
+  0, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pw_9adios_mpi_3var_1__init__, /*tp_init*/
+  0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_9adios_mpi_var, /*tp_new*/
+  __pyx_tp_new_9adios_mpi___pyx_scope_struct_2_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -13805,25 +24677,30 @@ static PyTypeObject __pyx_type_9adios_mpi_var = {
 };
 
 static PyMethodDef __pyx_methods[] = {
-  {"init", (PyCFunction)__pyx_pw_9adios_mpi_1init, METH_VARARGS|METH_KEYWORDS, 0},
-  {"open", (PyCFunction)__pyx_pw_9adios_mpi_3open, METH_VARARGS|METH_KEYWORDS, 0},
-  {"set_group_size", (PyCFunction)__pyx_pw_9adios_mpi_5set_group_size, METH_VARARGS|METH_KEYWORDS, 0},
-  {"write", (PyCFunction)__pyx_pw_9adios_mpi_7write, METH_VARARGS|METH_KEYWORDS, 0},
-  {"write_int", (PyCFunction)__pyx_pw_9adios_mpi_9write_int, METH_VARARGS|METH_KEYWORDS, 0},
-  {"write_long", (PyCFunction)__pyx_pw_9adios_mpi_11write_long, METH_VARARGS|METH_KEYWORDS, 0},
-  {"write_float", (PyCFunction)__pyx_pw_9adios_mpi_13write_float, METH_VARARGS|METH_KEYWORDS, 0},
-  {"read", (PyCFunction)__pyx_pw_9adios_mpi_15read, METH_VARARGS|METH_KEYWORDS, 0},
-  {"close", (PyCFunction)__pyx_pw_9adios_mpi_17close, METH_O, 0},
-  {"finalize", (PyCFunction)__pyx_pw_9adios_mpi_19finalize, METH_VARARGS|METH_KEYWORDS, 0},
-  {"init_noxml", (PyCFunction)__pyx_pw_9adios_mpi_21init_noxml, METH_VARARGS|METH_KEYWORDS, 0},
-  {"allocate_buffer", (PyCFunction)__pyx_pw_9adios_mpi_23allocate_buffer, METH_VARARGS|METH_KEYWORDS, 0},
-  {"declare_group", (PyCFunction)__pyx_pw_9adios_mpi_25declare_group, METH_VARARGS|METH_KEYWORDS, 0},
-  {"define_var", (PyCFunction)__pyx_pw_9adios_mpi_27define_var, METH_VARARGS|METH_KEYWORDS, 0},
-  {"define_attribute", (PyCFunction)__pyx_pw_9adios_mpi_29define_attribute, METH_VARARGS|METH_KEYWORDS, 0},
-  {"select_method", (PyCFunction)__pyx_pw_9adios_mpi_31select_method, METH_VARARGS|METH_KEYWORDS, 0},
-  {"np2adiostype", (PyCFunction)__pyx_pw_9adios_mpi_33np2adiostype, METH_O, __pyx_doc_9adios_mpi_32np2adiostype},
-  {"read_init", (PyCFunction)__pyx_pw_9adios_mpi_35read_init, METH_VARARGS|METH_KEYWORDS, 0},
-  {"read_finalize", (PyCFunction)__pyx_pw_9adios_mpi_37read_finalize, METH_VARARGS|METH_KEYWORDS, 0},
+  {"__parse_index", (PyCFunction)__pyx_pw_9adios_mpi_1__parse_index, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi___parse_index},
+  {"init", (PyCFunction)__pyx_pw_9adios_mpi_3init, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_2init},
+  {"open", (PyCFunction)__pyx_pw_9adios_mpi_5open, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_4open},
+  {"set_group_size", (PyCFunction)__pyx_pw_9adios_mpi_7set_group_size, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_6set_group_size},
+  {"write", (PyCFunction)__pyx_pw_9adios_mpi_9write, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_8write},
+  {"write_int", (PyCFunction)__pyx_pw_9adios_mpi_11write_int, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_10write_int},
+  {"write_long", (PyCFunction)__pyx_pw_9adios_mpi_13write_long, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_12write_long},
+  {"write_float", (PyCFunction)__pyx_pw_9adios_mpi_15write_float, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_14write_float},
+  {"write_double", (PyCFunction)__pyx_pw_9adios_mpi_17write_double, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_16write_double},
+  {"read", (PyCFunction)__pyx_pw_9adios_mpi_19read, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_18read},
+  {"close", (PyCFunction)__pyx_pw_9adios_mpi_21close, METH_O, __pyx_doc_9adios_mpi_20close},
+  {"finalize", (PyCFunction)__pyx_pw_9adios_mpi_23finalize, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_22finalize},
+  {"init_noxml", (PyCFunction)__pyx_pw_9adios_mpi_25init_noxml, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_24init_noxml},
+  {"allocate_buffer", (PyCFunction)__pyx_pw_9adios_mpi_27allocate_buffer, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_26allocate_buffer},
+  {"declare_group", (PyCFunction)__pyx_pw_9adios_mpi_29declare_group, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_28declare_group},
+  {"define_var", (PyCFunction)__pyx_pw_9adios_mpi_31define_var, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_30define_var},
+  {"define_attribute", (PyCFunction)__pyx_pw_9adios_mpi_33define_attribute, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_32define_attribute},
+  {"define_attribute_byvalue", (PyCFunction)__pyx_pw_9adios_mpi_35define_attribute_byvalue, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_34define_attribute_byvalue},
+  {"select_method", (PyCFunction)__pyx_pw_9adios_mpi_37select_method, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_36select_method},
+  {"adios2npdtype", (PyCFunction)__pyx_pw_9adios_mpi_39adios2npdtype, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_38adios2npdtype},
+  {"np2adiostype", (PyCFunction)__pyx_pw_9adios_mpi_41np2adiostype, METH_O, __pyx_doc_9adios_mpi_40np2adiostype},
+  {"adiostype2string", (PyCFunction)__pyx_pw_9adios_mpi_43adiostype2string, METH_O, __pyx_doc_9adios_mpi_42adiostype2string},
+  {"read_init", (PyCFunction)__pyx_pw_9adios_mpi_45read_init, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_44read_init},
+  {"read_finalize", (PyCFunction)__pyx_pw_9adios_mpi_47read_finalize, METH_VARARGS|METH_KEYWORDS, __pyx_doc_9adios_mpi_46read_finalize},
   {0, 0, 0, 0}
 };
 
@@ -13835,7 +24712,7 @@ static struct PyModuleDef __pyx_moduledef = {
     PyModuleDef_HEAD_INIT,
   #endif
     "adios_mpi",
-    __pyx_k_ADIOS_is_freely_available_under, /* m_doc */
+    __pyx_k_ADIOS_ADIOS_python_module_module, /* m_doc */
     -1, /* m_size */
     __pyx_methods /* m_methods */,
     NULL, /* m_reload */
@@ -13849,59 +24726,89 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_15s_d, __pyx_k_15s_d, sizeof(__pyx_k_15s_d), 0, 0, 1, 0},
   {&__pyx_kp_s_15s_lu, __pyx_k_15s_lu, sizeof(__pyx_k_15s_lu), 0, 0, 1, 0},
   {&__pyx_kp_s_15s_s, __pyx_k_15s_s, sizeof(__pyx_k_15s_s), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosAttr_name_r_dtype_r_value_r, __pyx_k_AdiosAttr_name_r_dtype_r_value_r, sizeof(__pyx_k_AdiosAttr_name_r_dtype_r_value_r), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosAttrinfo_name_r_is_static_r, __pyx_k_AdiosAttrinfo_name_r_is_static_r, sizeof(__pyx_k_AdiosAttrinfo_name_r_is_static_r), 0, 0, 1, 0},
   {&__pyx_kp_s_AdiosFile, __pyx_k_AdiosFile, sizeof(__pyx_k_AdiosFile), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosFile_path_r_nvars_r_var_r_n, __pyx_k_AdiosFile_path_r_nvars_r_var_r_n, sizeof(__pyx_k_AdiosFile_path_r_nvars_r_var_r_n), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosVar_varid_r_dtype_r_ndim_r, __pyx_k_AdiosVar_varid_r_dtype_r_ndim_r, sizeof(__pyx_k_AdiosVar_varid_r_dtype_r_ndim_r), 0, 0, 1, 0},
   {&__pyx_kp_s_AdiosVariable, __pyx_k_AdiosVariable, sizeof(__pyx_k_AdiosVariable), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosVarinfo_name_r_ldim_r_gdim, __pyx_k_AdiosVarinfo_name_r_ldim_r_gdim, sizeof(__pyx_k_AdiosVarinfo_name_r_ldim_r_gdim), 0, 0, 1, 0},
+  {&__pyx_kp_s_AdiosWriter_fname_r_gname_r_meth, __pyx_k_AdiosWriter_fname_r_gname_r_meth, sizeof(__pyx_k_AdiosWriter_fname_r_gname_r_meth), 0, 0, 1, 0},
   {&__pyx_n_s_BP, __pyx_k_BP, sizeof(__pyx_k_BP), 0, 0, 1, 1},
   {&__pyx_n_s_BP_AGGREGATE, __pyx_k_BP_AGGREGATE, sizeof(__pyx_k_BP_AGGREGATE), 0, 0, 1, 1},
   {&__pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_k_BUFFER_ALLOC_WHEN, sizeof(__pyx_k_BUFFER_ALLOC_WHEN), 0, 0, 1, 1},
   {&__pyx_n_s_COMM_SELF, __pyx_k_COMM_SELF, sizeof(__pyx_k_COMM_SELF), 0, 0, 1, 1},
   {&__pyx_n_s_COMM_WORLD, __pyx_k_COMM_WORLD, sizeof(__pyx_k_COMM_WORLD), 0, 0, 1, 1},
-  {&__pyx_kp_s_Count_dimension_mismatch, __pyx_k_Count_dimension_mismatch, sizeof(__pyx_k_Count_dimension_mismatch), 0, 0, 1, 0},
-  {&__pyx_kp_s_Count_is_larger_than_shape, __pyx_k_Count_is_larger_than_shape, sizeof(__pyx_k_Count_is_larger_than_shape), 0, 0, 1, 0},
+  {&__pyx_kp_s_Count_dimension_mismatch_count_d, __pyx_k_Count_dimension_mismatch_count_d, sizeof(__pyx_k_Count_dimension_mismatch_count_d), 0, 0, 1, 0},
   {&__pyx_n_s_DATASPACES, __pyx_k_DATASPACES, sizeof(__pyx_k_DATASPACES), 0, 0, 1, 1},
   {&__pyx_n_s_DATATYPE, __pyx_k_DATATYPE, sizeof(__pyx_k_DATATYPE), 0, 0, 1, 1},
   {&__pyx_n_s_DIMES, __pyx_k_DIMES, sizeof(__pyx_k_DIMES), 0, 0, 1, 1},
   {&__pyx_kp_s_Data_type_is_not_supported_yet, __pyx_k_Data_type_is_not_supported_yet, sizeof(__pyx_k_Data_type_is_not_supported_yet), 0, 0, 1, 0},
+  {&__pyx_kp_u_Define_a_group_associated_with, __pyx_k_Define_a_group_associated_with, sizeof(__pyx_k_Define_a_group_associated_with), 0, 1, 0, 0},
+  {&__pyx_kp_u_Define_a_variable_associated_wi, __pyx_k_Define_a_variable_associated_wi, sizeof(__pyx_k_Define_a_variable_associated_wi), 0, 1, 0, 0},
+  {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1},
   {&__pyx_n_s_FLAG, __pyx_k_FLAG, sizeof(__pyx_k_FLAG), 0, 0, 1, 1},
   {&__pyx_n_s_FLEXPATH, __pyx_k_FLEXPATH, sizeof(__pyx_k_FLEXPATH), 0, 0, 1, 1},
   {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0},
   {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0},
   {&__pyx_n_s_ICEE, __pyx_k_ICEE, sizeof(__pyx_k_ICEE), 0, 0, 1, 1},
+  {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1},
+  {&__pyx_n_s_KeyError, __pyx_k_KeyError, sizeof(__pyx_k_KeyError), 0, 0, 1, 1},
   {&__pyx_n_s_LATER, __pyx_k_LATER, sizeof(__pyx_k_LATER), 0, 0, 1, 1},
   {&__pyx_n_s_MPI, __pyx_k_MPI, sizeof(__pyx_k_MPI), 0, 0, 1, 1},
   {&__pyx_n_s_NO, __pyx_k_NO, sizeof(__pyx_k_NO), 0, 0, 1, 1},
   {&__pyx_n_s_NOW, __pyx_k_NOW, sizeof(__pyx_k_NOW), 0, 0, 1, 1},
+  {&__pyx_kp_s_Name_index_r_is_not_supported, __pyx_k_Name_index_r_is_not_supported, sizeof(__pyx_k_Name_index_r_is_not_supported), 0, 0, 1, 0},
   {&__pyx_kp_s_No_valid_variable, __pyx_k_No_valid_variable, sizeof(__pyx_k_No_valid_variable), 0, 0, 1, 0},
   {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0},
+  {&__pyx_n_s_NotImplementedError, __pyx_k_NotImplementedError, sizeof(__pyx_k_NotImplementedError), 0, 0, 1, 1},
   {&__pyx_kp_s_Not_a_valid_var, __pyx_k_Not_a_valid_var, sizeof(__pyx_k_Not_a_valid_var), 0, 0, 1, 0},
   {&__pyx_kp_s_Not_an_open_file, __pyx_k_Not_an_open_file, sizeof(__pyx_k_Not_an_open_file), 0, 0, 1, 0},
   {&__pyx_kp_s_Not_an_open_var, __pyx_k_Not_an_open_var, sizeof(__pyx_k_Not_an_open_var), 0, 0, 1, 0},
   {&__pyx_kp_s_Not_an_open_variable, __pyx_k_Not_an_open_variable, sizeof(__pyx_k_Not_an_open_variable), 0, 0, 1, 0},
-  {&__pyx_kp_s_Offset_dimension_mismatch, __pyx_k_Offset_dimension_mismatch, sizeof(__pyx_k_Offset_dimension_mismatch), 0, 0, 1, 0},
+  {&__pyx_kp_s_Offset_dimension_mismatch_offset, __pyx_k_Offset_dimension_mismatch_offset, sizeof(__pyx_k_Offset_dimension_mismatch_offset), 0, 0, 1, 0},
   {&__pyx_kp_s_Only_contiguous_arrays_are_suppo, __pyx_k_Only_contiguous_arrays_are_suppo, sizeof(__pyx_k_Only_contiguous_arrays_are_suppo), 0, 0, 1, 0},
+  {&__pyx_kp_u_Perform_read_Read_data_from_an, __pyx_k_Perform_read_Read_data_from_an, sizeof(__pyx_k_Perform_read_Read_data_from_an), 0, 1, 0, 0},
+  {&__pyx_n_s_READ_METHOD, __pyx_k_READ_METHOD, sizeof(__pyx_k_READ_METHOD), 0, 0, 1, 1},
   {&__pyx_kp_s_Reading, __pyx_k_Reading, sizeof(__pyx_k_Reading), 0, 0, 1, 0},
+  {&__pyx_kp_s_Requested_is_larger_than_the_sha, __pyx_k_Requested_is_larger_than_the_sha, sizeof(__pyx_k_Requested_is_larger_than_the_sha), 0, 0, 1, 0},
   {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1},
-  {&__pyx_kp_s_Step_index_is_out_of_range, __pyx_k_Step_index_is_out_of_range, sizeof(__pyx_k_Step_index_is_out_of_range), 0, 0, 1, 0},
+  {&__pyx_n_s_S, __pyx_k_S, sizeof(__pyx_k_S), 0, 0, 1, 1},
+  {&__pyx_kp_s_Step_index_is_out_of_range_from, __pyx_k_Step_index_is_out_of_range_from, sizeof(__pyx_k_Step_index_is_out_of_range_from), 0, 0, 1, 0},
+  {&__pyx_kp_s_Step_size_d_is_not_supported, __pyx_k_Step_size_d_is_not_supported, sizeof(__pyx_k_Step_size_d_is_not_supported), 0, 0, 1, 0},
+  {&__pyx_kp_s_Too_many_indices_for_data, __pyx_k_Too_many_indices_for_data, sizeof(__pyx_k_Too_many_indices_for_data), 0, 0, 1, 0},
+  {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1},
   {&__pyx_n_s_UNKNOWN, __pyx_k_UNKNOWN, sizeof(__pyx_k_UNKNOWN), 0, 0, 1, 1},
+  {&__pyx_kp_s_Unhashable_type, __pyx_k_Unhashable_type, sizeof(__pyx_k_Unhashable_type), 0, 0, 1, 0},
   {&__pyx_kp_s_Use_default_BP_method, __pyx_k_Use_default_BP_method, sizeof(__pyx_k_Use_default_BP_method), 0, 0, 1, 0},
   {&__pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_k_Users_jyc_project_adios_devel_w, sizeof(__pyx_k_Users_jyc_project_adios_devel_w), 0, 0, 1, 0},
   {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
+  {&__pyx_kp_s_Value_is_none, __pyx_k_Value_is_none, sizeof(__pyx_k_Value_is_none), 0, 0, 1, 0},
   {&__pyx_kp_s_WARN_Invalid_read_method_name, __pyx_k_WARN_Invalid_read_method_name, sizeof(__pyx_k_WARN_Invalid_read_method_name), 0, 0, 1, 0},
+  {&__pyx_kp_s_Warning_No_support_yet_s_type_d, __pyx_k_Warning_No_support_yet_s_type_d, sizeof(__pyx_k_Warning_No_support_yet_s_type_d), 0, 0, 1, 0},
   {&__pyx_n_s_YES, __pyx_k_YES, sizeof(__pyx_k_YES), 0, 0, 1, 1},
-  {&__pyx_n_s__17, __pyx_k__17, sizeof(__pyx_k__17), 0, 0, 1, 1},
-  {&__pyx_kp_s__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 0, 1, 0},
+  {&__pyx_kp_s__11, __pyx_k__11, sizeof(__pyx_k__11), 0, 0, 1, 0},
+  {&__pyx_kp_s__31, __pyx_k__31, sizeof(__pyx_k__31), 0, 0, 1, 0},
+  {&__pyx_kp_s__33, __pyx_k__33, sizeof(__pyx_k__33), 0, 0, 1, 0},
+  {&__pyx_n_s__45, __pyx_k__45, sizeof(__pyx_k__45), 0, 0, 1, 1},
+  {&__pyx_kp_s__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 0, 1, 0},
   {&__pyx_n_s_adios_mpi, __pyx_k_adios_mpi, sizeof(__pyx_k_adios_mpi), 0, 0, 1, 1},
   {&__pyx_n_s_advance, __pyx_k_advance, sizeof(__pyx_k_advance), 0, 0, 1, 1},
-  {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1},
+  {&__pyx_n_s_any, __pyx_k_any, sizeof(__pyx_k_any), 0, 0, 1, 1},
+  {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1},
   {&__pyx_n_s_array, __pyx_k_array, sizeof(__pyx_k_array), 0, 0, 1, 1},
   {&__pyx_n_s_attr_namelist, __pyx_k_attr_namelist, sizeof(__pyx_k_attr_namelist), 0, 0, 1, 1},
+  {&__pyx_n_s_attrname, __pyx_k_attrname, sizeof(__pyx_k_attrname), 0, 0, 1, 1},
   {&__pyx_n_s_attrs, __pyx_k_attrs, sizeof(__pyx_k_attrs), 0, 0, 1, 1},
+  {&__pyx_n_s_atype, __pyx_k_atype, sizeof(__pyx_k_atype), 0, 0, 1, 1},
   {&__pyx_n_s_base_path, __pyx_k_base_path, sizeof(__pyx_k_base_path), 0, 0, 1, 1},
   {&__pyx_n_s_bool, __pyx_k_bool, sizeof(__pyx_k_bool), 0, 0, 1, 1},
   {&__pyx_n_s_bpls, __pyx_k_bpls, sizeof(__pyx_k_bpls), 0, 0, 1, 1},
   {&__pyx_n_s_buffer_size, __pyx_k_buffer_size, sizeof(__pyx_k_buffer_size), 0, 0, 1, 1},
   {&__pyx_n_s_byte, __pyx_k_byte, sizeof(__pyx_k_byte), 0, 0, 1, 1},
   {&__pyx_kp_s_bytes, __pyx_k_bytes, sizeof(__pyx_k_bytes), 0, 0, 1, 0},
+  {&__pyx_n_s_bytes_2, __pyx_k_bytes_2, sizeof(__pyx_k_bytes_2), 0, 0, 1, 1},
+  {&__pyx_n_s_char, __pyx_k_char, sizeof(__pyx_k_char), 0, 0, 1, 1},
   {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1},
   {&__pyx_n_s_comm, __pyx_k_comm, sizeof(__pyx_k_comm), 0, 0, 1, 1},
   {&__pyx_n_s_complex, __pyx_k_complex, sizeof(__pyx_k_complex), 0, 0, 1, 1},
@@ -13914,6 +24821,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1},
   {&__pyx_n_s_current_step, __pyx_k_current_step, sizeof(__pyx_k_current_step), 0, 0, 1, 1},
   {&__pyx_n_s_data_size, __pyx_k_data_size, sizeof(__pyx_k_data_size), 0, 0, 1, 1},
+  {&__pyx_n_s_define, __pyx_k_define, sizeof(__pyx_k_define), 0, 0, 1, 1},
   {&__pyx_n_s_dimensions, __pyx_k_dimensions, sizeof(__pyx_k_dimensions), 0, 0, 1, 1},
   {&__pyx_n_s_dims, __pyx_k_dims, sizeof(__pyx_k_dims), 0, 0, 1, 1},
   {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1},
@@ -13923,6 +24831,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_end, __pyx_k_end, sizeof(__pyx_k_end), 0, 0, 1, 1},
   {&__pyx_n_s_endianness, __pyx_k_endianness, sizeof(__pyx_k_endianness), 0, 0, 1, 1},
   {&__pyx_n_s_f, __pyx_k_f, sizeof(__pyx_k_f), 0, 0, 1, 1},
+  {&__pyx_n_s_factory, __pyx_k_factory, sizeof(__pyx_k_factory), 0, 0, 1, 1},
   {&__pyx_n_s_fd_p, __pyx_k_fd_p, sizeof(__pyx_k_fd_p), 0, 0, 1, 1},
   {&__pyx_n_s_fh, __pyx_k_fh, sizeof(__pyx_k_fh), 0, 0, 1, 1},
   {&__pyx_n_s_file, __pyx_k_file, sizeof(__pyx_k_file), 0, 0, 1, 1},
@@ -13937,22 +24846,35 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_fname, __pyx_k_fname, sizeof(__pyx_k_fname), 0, 0, 1, 1},
   {&__pyx_n_s_fp, __pyx_k_fp, sizeof(__pyx_k_fp), 0, 0, 1, 1},
   {&__pyx_n_s_from_steps, __pyx_k_from_steps, sizeof(__pyx_k_from_steps), 0, 0, 1, 1},
+  {&__pyx_n_s_gdim, __pyx_k_gdim, sizeof(__pyx_k_gdim), 0, 0, 1, 1},
+  {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1},
+  {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1},
+  {&__pyx_n_s_getitem___locals_genexpr, __pyx_k_getitem___locals_genexpr, sizeof(__pyx_k_getitem___locals_genexpr), 0, 0, 1, 1},
   {&__pyx_n_s_global_dimensions, __pyx_k_global_dimensions, sizeof(__pyx_k_global_dimensions), 0, 0, 1, 1},
+  {&__pyx_n_s_gname, __pyx_k_gname, sizeof(__pyx_k_gname), 0, 0, 1, 1},
   {&__pyx_n_s_group, __pyx_k_group, sizeof(__pyx_k_group), 0, 0, 1, 1},
   {&__pyx_n_s_group_id, __pyx_k_group_id, sizeof(__pyx_k_group_id), 0, 0, 1, 1},
   {&__pyx_n_s_group_name, __pyx_k_group_name, sizeof(__pyx_k_group_name), 0, 0, 1, 1},
   {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
+  {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1},
+  {&__pyx_n_s_indices, __pyx_k_indices, sizeof(__pyx_k_indices), 0, 0, 1, 1},
+  {&__pyx_n_s_init, __pyx_k_init, sizeof(__pyx_k_init), 0, 0, 1, 1},
   {&__pyx_n_s_int16, __pyx_k_int16, sizeof(__pyx_k_int16), 0, 0, 1, 1},
   {&__pyx_n_s_int32, __pyx_k_int32, sizeof(__pyx_k_int32), 0, 0, 1, 1},
   {&__pyx_n_s_int64, __pyx_k_int64, sizeof(__pyx_k_int64), 0, 0, 1, 1},
   {&__pyx_n_s_int8, __pyx_k_int8, sizeof(__pyx_k_int8), 0, 0, 1, 1},
   {&__pyx_n_s_integer, __pyx_k_integer, sizeof(__pyx_k_integer), 0, 0, 1, 1},
+  {&__pyx_n_s_is_noxml, __pyx_k_is_noxml, sizeof(__pyx_k_is_noxml), 0, 0, 1, 1},
+  {&__pyx_n_s_is_static, __pyx_k_is_static, sizeof(__pyx_k_is_static), 0, 0, 1, 1},
   {&__pyx_n_s_is_stream, __pyx_k_is_stream, sizeof(__pyx_k_is_stream), 0, 0, 1, 1},
   {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1},
+  {&__pyx_n_s_iteritems, __pyx_k_iteritems, sizeof(__pyx_k_iteritems), 0, 0, 1, 1},
   {&__pyx_n_s_iterkeys, __pyx_k_iterkeys, sizeof(__pyx_k_iterkeys), 0, 0, 1, 1},
   {&__pyx_n_s_k, __pyx_k_k, sizeof(__pyx_k_k), 0, 0, 1, 1},
+  {&__pyx_n_s_keys, __pyx_k_keys, sizeof(__pyx_k_keys), 0, 0, 1, 1},
   {&__pyx_n_s_last, __pyx_k_last, sizeof(__pyx_k_last), 0, 0, 1, 1},
   {&__pyx_n_s_last_step, __pyx_k_last_step, sizeof(__pyx_k_last_step), 0, 0, 1, 1},
+  {&__pyx_n_s_ldim, __pyx_k_ldim, sizeof(__pyx_k_ldim), 0, 0, 1, 1},
   {&__pyx_n_s_local_offsets, __pyx_k_local_offsets, sizeof(__pyx_k_local_offsets), 0, 0, 1, 1},
   {&__pyx_n_s_lock_mode, __pyx_k_lock_mode, sizeof(__pyx_k_lock_mode), 0, 0, 1, 1},
   {&__pyx_n_s_long, __pyx_k_long, sizeof(__pyx_k_long), 0, 0, 1, 1},
@@ -13961,6 +24883,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_metaclass, __pyx_k_metaclass, sizeof(__pyx_k_metaclass), 0, 0, 1, 1},
   {&__pyx_n_s_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 0, 1, 1},
   {&__pyx_n_s_method_name, __pyx_k_method_name, sizeof(__pyx_k_method_name), 0, 0, 1, 1},
+  {&__pyx_n_s_method_params, __pyx_k_method_params, sizeof(__pyx_k_method_params), 0, 0, 1, 1},
   {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1},
   {&__pyx_n_s_module, __pyx_k_module, sizeof(__pyx_k_module), 0, 0, 1, 1},
   {&__pyx_n_s_mpi4py_MPI, __pyx_k_mpi4py_MPI, sizeof(__pyx_k_mpi4py_MPI), 0, 0, 1, 1},
@@ -13986,13 +24909,25 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_read, __pyx_k_read, sizeof(__pyx_k_read), 0, 0, 1, 1},
   {&__pyx_n_s_readvar, __pyx_k_readvar, sizeof(__pyx_k_readvar), 0, 0, 1, 1},
   {&__pyx_n_s_real, __pyx_k_real, sizeof(__pyx_k_real), 0, 0, 1, 1},
+  {&__pyx_n_s_replace, __pyx_k_replace, sizeof(__pyx_k_replace), 0, 0, 1, 1},
+  {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1},
+  {&__pyx_n_s_setitem, __pyx_k_setitem, sizeof(__pyx_k_setitem), 0, 0, 1, 1},
+  {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1},
   {&__pyx_n_s_short, __pyx_k_short, sizeof(__pyx_k_short), 0, 0, 1, 1},
   {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1},
   {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1},
+  {&__pyx_n_s_squeeze, __pyx_k_squeeze, sizeof(__pyx_k_squeeze), 0, 0, 1, 1},
   {&__pyx_n_s_stats, __pyx_k_stats, sizeof(__pyx_k_stats), 0, 0, 1, 1},
+  {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1},
   {&__pyx_n_s_str, __pyx_k_str, sizeof(__pyx_k_str), 0, 0, 1, 1},
   {&__pyx_n_s_string, __pyx_k_string, sizeof(__pyx_k_string), 0, 0, 1, 1},
+  {&__pyx_n_s_string_array, __pyx_k_string_array, sizeof(__pyx_k_string_array), 0, 0, 1, 1},
+  {&__pyx_n_s_strip, __pyx_k_strip, sizeof(__pyx_k_strip), 0, 0, 1, 1},
+  {&__pyx_n_s_strlen, __pyx_k_strlen, sizeof(__pyx_k_strlen), 0, 0, 1, 1},
+  {&__pyx_n_s_subtract, __pyx_k_subtract, sizeof(__pyx_k_subtract), 0, 0, 1, 1},
+  {&__pyx_n_s_t, __pyx_k_t, sizeof(__pyx_k_t), 0, 0, 1, 1},
   {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
+  {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1},
   {&__pyx_n_s_time_index, __pyx_k_time_index, sizeof(__pyx_k_time_index), 0, 0, 1, 1},
   {&__pyx_n_s_time_steps, __pyx_k_time_steps, sizeof(__pyx_k_time_steps), 0, 0, 1, 1},
   {&__pyx_n_s_timeout_sec, __pyx_k_timeout_sec, sizeof(__pyx_k_timeout_sec), 0, 0, 1, 1},
@@ -14010,21 +24945,39 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_v, __pyx_k_v, sizeof(__pyx_k_v), 0, 0, 1, 1},
   {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1},
   {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1},
+  {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1},
   {&__pyx_n_s_var, __pyx_k_var, sizeof(__pyx_k_var), 0, 0, 1, 1},
   {&__pyx_n_s_var_namelist, __pyx_k_var_namelist, sizeof(__pyx_k_var_namelist), 0, 0, 1, 1},
+  {&__pyx_kp_u_var_read_line_887, __pyx_k_var_read_line_887, sizeof(__pyx_k_var_read_line_887), 0, 1, 0, 0},
   {&__pyx_n_s_varid, __pyx_k_varid, sizeof(__pyx_k_varid), 0, 0, 1, 1},
   {&__pyx_n_s_varname, __pyx_k_varname, sizeof(__pyx_k_varname), 0, 0, 1, 1},
   {&__pyx_n_s_vars, __pyx_k_vars, sizeof(__pyx_k_vars), 0, 0, 1, 1},
   {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1},
   {&__pyx_n_s_vp, __pyx_k_vp, sizeof(__pyx_k_vp), 0, 0, 1, 1},
   {&__pyx_n_s_when, __pyx_k_when, sizeof(__pyx_k_when), 0, 0, 1, 1},
+  {&__pyx_n_s_write, __pyx_k_write, sizeof(__pyx_k_write), 0, 0, 1, 1},
+  {&__pyx_kp_u_writer_declare_group_line_1221, __pyx_k_writer_declare_group_line_1221, sizeof(__pyx_k_writer_declare_group_line_1221), 0, 1, 0, 0},
+  {&__pyx_kp_u_writer_define_var_line_1243, __pyx_k_writer_define_var_line_1243, sizeof(__pyx_k_writer_define_var_line_1243), 0, 1, 0, 0},
+  {&__pyx_n_s_xrange, __pyx_k_xrange, sizeof(__pyx_k_xrange), 0, 0, 1, 1},
   {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1},
+  {&__pyx_n_s_zip, __pyx_k_zip, sizeof(__pyx_k_zip), 0, 0, 1, 1},
   {0, 0, 0, 0, 0, 0, 0}
 };
 static int __Pyx_InitCachedBuiltins(void) {
-  __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #if PY_MAJOR_VERSION >= 3
+  __pyx_builtin_xrange = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #else
+  __pyx_builtin_xrange = __Pyx_GetBuiltinName(__pyx_n_s_xrange); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
+  __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_KeyError = __Pyx_GetBuiltinName(__pyx_n_s_KeyError); if (!__pyx_builtin_KeyError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_zip = __Pyx_GetBuiltinName(__pyx_n_s_zip); if (!__pyx_builtin_zip) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_NotImplementedError = __Pyx_GetBuiltinName(__pyx_n_s_NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -14034,117 +24987,289 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "adios_mpi.pyx":539
+  /* "adios_mpi.pyx":287
+ *     for slice_ in index:
+ *         if slice_ is Ellipsis:
+ *             fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))             # <<<<<<<<<<<<<<
+ *         elif isinstance(slice_, (int, long)):
+ *             fixed.append(slice(slice_, slice_+1, None))
+ */
+  __pyx_slice_ = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice_);
+  __Pyx_GIVEREF(__pyx_slice_);
+
+  /* "adios_mpi.pyx":296
+ *     index = tuple(fixed)
+ *     if len(index) < ndim:
+ *         index += (slice(None),) * (ndim-len(index))             # <<<<<<<<<<<<<<
+ * 
+ *     return index
+ */
+  __pyx_slice__2 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__2);
+  __Pyx_GIVEREF(__pyx_slice__2);
+  __pyx_tuple__3 = PyTuple_New(1); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__3);
+  __Pyx_INCREF(__pyx_slice__2);
+  PyTuple_SET_ITEM(__pyx_tuple__3, 0, __pyx_slice__2);
+  __Pyx_GIVEREF(__pyx_slice__2);
+  __Pyx_GIVEREF(__pyx_tuple__3);
+
+  /* "adios_mpi.pyx":703
  *         assert self.fp != NULL, 'Not an open file'
  * 
  *         self.name = fname.split('/')[-1]  ## basename             # <<<<<<<<<<<<<<
  *         self.nvars = self.fp.nvars
  *         self.nattrs = self.fp.nattrs
  */
-  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s__8); if (unlikely(!__pyx_tuple__9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__9);
-  __Pyx_GIVEREF(__pyx_tuple__9);
+  __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s__11); if (unlikely(!__pyx_tuple__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 703; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__12);
+  __Pyx_GIVEREF(__pyx_tuple__12);
+
+  /* "adios_mpi.pyx":775
+ *         for key_ in varname:
+ *             if not isinstance(key_, str):
+ *                 raise TypeError("Unhashable type")             # <<<<<<<<<<<<<<
+ * 
+ *             if key_ in self.var.keys():
+ */
+  __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_Unhashable_type); if (unlikely(!__pyx_tuple__13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__13);
+  __Pyx_GIVEREF(__pyx_tuple__13);
 
-  /* "adios_mpi.pyx":621
+  /* "adios_mpi.pyx":950
  *         if len(offset) == 0:
  *             npoffset = npshape.copy()
  *             npoffset.fill(0)             # <<<<<<<<<<<<<<
  *         else:
  *             npoffset = np.array(offset, dtype=np.int64)
  */
-  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 621; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__10);
-  __Pyx_GIVEREF(__pyx_tuple__10);
+  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__14);
+  __Pyx_GIVEREF(__pyx_tuple__14);
+
+  /* "adios_mpi.pyx":967
+ * 
+ *         if (npshape < npcount + npoffset).any():
+ *             raise IndexError('Requested is larger than the shape.')             # <<<<<<<<<<<<<<
+ * 
+ *         shape = list(npcount)
+ */
+  __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_Requested_is_larger_than_the_sha); if (unlikely(!__pyx_tuple__15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__15);
+  __Pyx_GIVEREF(__pyx_tuple__15);
+
+  /* "adios_mpi.pyx":975
+ * 
+ *         if len(shape) > 0:
+ *             var[:] = fill             # <<<<<<<<<<<<<<
+ * 
+ *         cdef ADIOS_SELECTION * sel
+ */
+  __pyx_slice__16 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__16);
+  __Pyx_GIVEREF(__pyx_slice__16);
+
+  /* "adios_mpi.pyx":1016
+ * 
+ *         if (ndim_ > 0) and (len(index_) > ndim_):
+ *             raise IndexError("Too many indices for data")             # <<<<<<<<<<<<<<
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):
+ */
+  __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_Too_many_indices_for_data); if (unlikely(!__pyx_tuple__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__17);
+  __Pyx_GIVEREF(__pyx_tuple__17);
+
+  /* "adios_mpi.pyx":1019
+ * 
+ *         if (ndim_ == 0) and (len(index_) > 1):
+ *             raise IndexError("Too many indices for data")             # <<<<<<<<<<<<<<
+ * 
+ *         for slice_ in index_:
+ */
+  __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_Too_many_indices_for_data); if (unlikely(!__pyx_tuple__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__18);
+  __Pyx_GIVEREF(__pyx_tuple__18);
+
+  /* "adios_mpi.pyx":1035
+ *             from_steps_ = z[0][0]
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]             # <<<<<<<<<<<<<<
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+ *         else:
+ */
+  __pyx_slice__19 = PySlice_New(__pyx_int_1, Py_None, Py_None); if (unlikely(!__pyx_slice__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__19);
+  __Pyx_GIVEREF(__pyx_slice__19);
+
+  /* "adios_mpi.pyx":1036
+ *             nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+ *             offset_ = z[0][1:]
+ *             count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)             # <<<<<<<<<<<<<<
+ *         else:
+ *             indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))
+ */
+  __pyx_slice__20 = PySlice_New(__pyx_int_1, Py_None, Py_None); if (unlikely(!__pyx_slice__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__20);
+  __Pyx_GIVEREF(__pyx_slice__20);
+  __pyx_slice__21 = PySlice_New(__pyx_int_1, Py_None, Py_None); if (unlikely(!__pyx_slice__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_slice__21);
+  __Pyx_GIVEREF(__pyx_slice__21);
+
+  /* "adios_mpi.pyx":1383
+ *         if self.is_static:
+ *             if self.value is None:
+ *                 raise TypeError("Value is none")             # <<<<<<<<<<<<<<
+ * 
+ *             define_attribute_byvalue(gid, self.name, "", self.value)
+ */
+  __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_Value_is_none); if (unlikely(!__pyx_tuple__26)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__26);
+  __Pyx_GIVEREF(__pyx_tuple__26);
+
+  /* "adios_mpi.pyx":1417
+ *     def define(self, int64_t gid):
+ *         if self.value is None:
+ *             raise TypeError("Value is none")             # <<<<<<<<<<<<<<
+ * 
+ *         ldim_ = self.ldim
+ */
+  __pyx_tuple__30 = PyTuple_Pack(1, __pyx_kp_s_Value_is_none); if (unlikely(!__pyx_tuple__30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__30);
+  __Pyx_GIVEREF(__pyx_tuple__30);
+
+  /* "adios_mpi.pyx":1438
+ *         ## No space allowed
+ *         define_var(gid, self.name, "", atype,
+ *                    str(ldim_).replace(' ', '').strip('(,)'),             # <<<<<<<<<<<<<<
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ */
+  __pyx_tuple__32 = PyTuple_Pack(2, __pyx_kp_s__31, __pyx_kp_s__7); if (unlikely(!__pyx_tuple__32)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__32);
+  __Pyx_GIVEREF(__pyx_tuple__32);
+  __pyx_tuple__34 = PyTuple_Pack(1, __pyx_kp_s__33); if (unlikely(!__pyx_tuple__34)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__34);
+  __Pyx_GIVEREF(__pyx_tuple__34);
+
+  /* "adios_mpi.pyx":1439
+ *         define_var(gid, self.name, "", atype,
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),             # <<<<<<<<<<<<<<
+ *                    str(offset_).replace(' ', '').strip('(,)'))
+ * 
+ */
+  __pyx_tuple__35 = PyTuple_Pack(2, __pyx_kp_s__31, __pyx_kp_s__7); if (unlikely(!__pyx_tuple__35)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__35);
+  __Pyx_GIVEREF(__pyx_tuple__35);
+  __pyx_tuple__36 = PyTuple_Pack(1, __pyx_kp_s__33); if (unlikely(!__pyx_tuple__36)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__36);
+  __Pyx_GIVEREF(__pyx_tuple__36);
+
+  /* "adios_mpi.pyx":1440
+ *                    str(ldim_).replace(' ', '').strip('(,)'),
+ *                    str(gdim_).replace(' ', '').strip('(,)'),
+ *                    str(offset_).replace(' ', '').strip('(,)'))             # <<<<<<<<<<<<<<
+ * 
+ *     def bytes(self):
+ */
+  __pyx_tuple__37 = PyTuple_Pack(2, __pyx_kp_s__31, __pyx_kp_s__7); if (unlikely(!__pyx_tuple__37)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__37);
+  __Pyx_GIVEREF(__pyx_tuple__37);
+  __pyx_tuple__38 = PyTuple_Pack(1, __pyx_kp_s__33); if (unlikely(!__pyx_tuple__38)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__38);
+  __Pyx_GIVEREF(__pyx_tuple__38);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":215
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
  *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  */
-  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__11)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__11);
-  __Pyx_GIVEREF(__pyx_tuple__11);
+  __pyx_tuple__39 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__39)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__39);
+  __Pyx_GIVEREF(__pyx_tuple__39);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":219
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
  *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
  * 
  *             info.buf = PyArray_DATA(self)
  */
-  __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__12)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__12);
-  __Pyx_GIVEREF(__pyx_tuple__12);
+  __pyx_tuple__40 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__40)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__40);
+  __Pyx_GIVEREF(__pyx_tuple__40);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260
  *                 if ((descr.byteorder == c'>' and little_endian) or
  *                     (descr.byteorder == c'<' and not little_endian)):
  *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"
  */
-  __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__13)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__13);
-  __Pyx_GIVEREF(__pyx_tuple__13);
+  __pyx_tuple__41 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__41)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__41);
+  __Pyx_GIVEREF(__pyx_tuple__41);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802
  * 
  *         if (end - f) - <int>(new_offset - offset[0]) < 15:
  *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
  * 
  *         if ((child.byteorder == c'>' and little_endian) or
  */
-  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__14);
-  __Pyx_GIVEREF(__pyx_tuple__14);
+  __pyx_tuple__42 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__42)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__42);
+  __Pyx_GIVEREF(__pyx_tuple__42);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":803
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":806
  *         if ((child.byteorder == c'>' and little_endian) or
  *             (child.byteorder == c'<' and not little_endian)):
  *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *             # One could encode it in the format string and have Cython
  *             # complain instead, BUT: < and > in format strings also imply
  */
-  __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__15)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__15);
-  __Pyx_GIVEREF(__pyx_tuple__15);
+  __pyx_tuple__43 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__43)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__43);
+  __Pyx_GIVEREF(__pyx_tuple__43);
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826
  *             t = child.type_num
  *             if end - f < 5:
  *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
  * 
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  */
-  __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__16)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__16);
-  __Pyx_GIVEREF(__pyx_tuple__16);
+  __pyx_tuple__44 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__44)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__44);
+  __Pyx_GIVEREF(__pyx_tuple__44);
 
-  /* "adios_mpi.pyx":660
+  /* "adios_mpi.pyx":1464
  * ## ====================
  * 
  * def readvar(fname, varname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     if not f.var.has_key(varname):
+ *     """ Retrieve a variable value from an Adios file.
+ * 
  */
-  __pyx_tuple__18 = PyTuple_Pack(4, __pyx_n_s_fname, __pyx_n_s_varname, __pyx_n_s_f, __pyx_n_s_v); if (unlikely(!__pyx_tuple__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__18);
-  __Pyx_GIVEREF(__pyx_tuple__18);
-  __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_n_s_readvar, 660, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_tuple__46 = PyTuple_Pack(4, __pyx_n_s_fname, __pyx_n_s_varname, __pyx_n_s_f, __pyx_n_s_v); if (unlikely(!__pyx_tuple__46)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__46);
+  __Pyx_GIVEREF(__pyx_tuple__46);
+  __pyx_codeobj__47 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__46, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_n_s_readvar, 1464, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__47)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":669
+  /* "adios_mpi.pyx":1482
  *     return v.read(from_steps=0, nsteps=v.nsteps)
  * 
  * def bpls(fname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     return {'nvars': f.nvars,
+ *     """ Return meta data of an Adios file as a Python dictionary object.
+ * 
  */
-  __pyx_tuple__20 = PyTuple_Pack(3, __pyx_n_s_fname, __pyx_n_s_f, __pyx_n_s_k); if (unlikely(!__pyx_tuple__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 669; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_tuple__20);
-  __Pyx_GIVEREF(__pyx_tuple__20);
-  __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_n_s_bpls, 669, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 669; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_tuple__48 = PyTuple_Pack(3, __pyx_n_s_fname, __pyx_n_s_f, __pyx_n_s_k); if (unlikely(!__pyx_tuple__48)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__48);
+  __Pyx_GIVEREF(__pyx_tuple__48);
+  __pyx_codeobj__49 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__48, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jyc_project_adios_devel_w, __pyx_n_s_bpls, 1482, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__49)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -14157,6 +25282,7 @@ static int __Pyx_InitGlobals(void) {
   __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_6 = PyInt_FromLong(6); if (unlikely(!__pyx_int_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -14164,6 +25290,7 @@ static int __Pyx_InitGlobals(void) {
   __pyx_int_9 = PyInt_FromLong(9); if (unlikely(!__pyx_int_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_10 = PyInt_FromLong(10); if (unlikely(!__pyx_int_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_11 = PyInt_FromLong(11); if (unlikely(!__pyx_int_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_int_12 = PyInt_FromLong(12); if (unlikely(!__pyx_int_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_50 = PyInt_FromLong(50); if (unlikely(!__pyx_int_50)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_51 = PyInt_FromLong(51); if (unlikely(!__pyx_int_51)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_int_52 = PyInt_FromLong(52); if (unlikely(!__pyx_int_52)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -14219,7 +25346,7 @@ PyMODINIT_FUNC PyInit_adios_mpi(void)
   #endif
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_m = Py_InitModule4("adios_mpi", __pyx_methods, __pyx_k_ADIOS_is_freely_available_under, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
+  __pyx_m = Py_InitModule4("adios_mpi", __pyx_methods, __pyx_k_ADIOS_ADIOS_python_module_module, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
   #else
   __pyx_m = PyModule_Create(&__pyx_moduledef);
   #endif
@@ -14259,20 +25386,71 @@ PyMODINIT_FUNC PyInit_adios_mpi(void)
   __pyx_vtable_9adios_mpi_file.close = (PyObject *(*)(struct __pyx_obj_9adios_mpi_file *, int __pyx_skip_dispatch))__pyx_f_9adios_mpi_4file_close;
   __pyx_vtable_9adios_mpi_file.printself = (PyObject *(*)(struct __pyx_obj_9adios_mpi_file *, int __pyx_skip_dispatch))__pyx_f_9adios_mpi_4file_printself;
   __pyx_vtable_9adios_mpi_file.advance = (PyObject *(*)(struct __pyx_obj_9adios_mpi_file *, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_4file_advance *__pyx_optional_args))__pyx_f_9adios_mpi_4file_advance;
-  if (PyType_Ready(&__pyx_type_9adios_mpi_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_9adios_mpi_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_type_9adios_mpi_file.tp_print = 0;
-  if (__Pyx_SetVtable(__pyx_type_9adios_mpi_file.tp_dict, __pyx_vtabptr_9adios_mpi_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (PyObject_SetAttrString(__pyx_m, "file", (PyObject *)&__pyx_type_9adios_mpi_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #if CYTHON_COMPILING_IN_CPYTHON
+  {
+    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_9adios_mpi_file, "__getitem__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
+      __pyx_wrapperbase_9adios_mpi_4file_10__getitem__ = *((PyWrapperDescrObject *)wrapper)->d_base;
+      __pyx_wrapperbase_9adios_mpi_4file_10__getitem__.doc = __pyx_doc_9adios_mpi_4file_10__getitem__;
+      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_9adios_mpi_4file_10__getitem__;
+    }
+  }
+  #endif
+  #if CYTHON_COMPILING_IN_CPYTHON
+  {
+    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_9adios_mpi_file, "__repr__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
+      __pyx_wrapperbase_9adios_mpi_4file_12__repr__ = *((PyWrapperDescrObject *)wrapper)->d_base;
+      __pyx_wrapperbase_9adios_mpi_4file_12__repr__.doc = __pyx_doc_9adios_mpi_4file_12__repr__;
+      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_9adios_mpi_4file_12__repr__;
+    }
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_type_9adios_mpi_file.tp_dict, __pyx_vtabptr_9adios_mpi_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttrString(__pyx_m, "file", (PyObject *)&__pyx_type_9adios_mpi_file) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_9adios_mpi_file = &__pyx_type_9adios_mpi_file;
   __pyx_vtabptr_9adios_mpi_var = &__pyx_vtable_9adios_mpi_var;
   __pyx_vtable_9adios_mpi_var.close = (PyObject *(*)(struct __pyx_obj_9adios_mpi_var *, int __pyx_skip_dispatch))__pyx_f_9adios_mpi_3var_close;
+  __pyx_vtable_9adios_mpi_var.advance = (PyObject *(*)(struct __pyx_obj_9adios_mpi_var *, int __pyx_skip_dispatch))__pyx_f_9adios_mpi_3var_advance;
   __pyx_vtable_9adios_mpi_var.read = (PyObject *(*)(struct __pyx_obj_9adios_mpi_var *, int __pyx_skip_dispatch, struct __pyx_opt_args_9adios_mpi_3var_read *__pyx_optional_args))__pyx_f_9adios_mpi_3var_read;
   __pyx_vtable_9adios_mpi_var.printself = (PyObject *(*)(struct __pyx_obj_9adios_mpi_var *, int __pyx_skip_dispatch))__pyx_f_9adios_mpi_3var_printself;
-  if (PyType_Ready(&__pyx_type_9adios_mpi_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_9adios_mpi_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_type_9adios_mpi_var.tp_print = 0;
-  if (__Pyx_SetVtable(__pyx_type_9adios_mpi_var.tp_dict, __pyx_vtabptr_9adios_mpi_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (PyObject_SetAttrString(__pyx_m, "var", (PyObject *)&__pyx_type_9adios_mpi_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_9adios_mpi_var.tp_dict, __pyx_vtabptr_9adios_mpi_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttrString(__pyx_m, "var", (PyObject *)&__pyx_type_9adios_mpi_var) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 797; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_9adios_mpi_var = &__pyx_type_9adios_mpi_var;
+  if (PyType_Ready(&__pyx_type_9adios_mpi_attr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1062; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_9adios_mpi_attr.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "attr", (PyObject *)&__pyx_type_9adios_mpi_attr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1062; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_9adios_mpi_attr = &__pyx_type_9adios_mpi_attr;
+  __pyx_type_9adios_mpi_smartdict.tp_base = (&PyDict_Type);
+  if (PyType_Ready(&__pyx_type_9adios_mpi_smartdict) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_9adios_mpi_smartdict.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "smartdict", (PyObject *)&__pyx_type_9adios_mpi_smartdict) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_9adios_mpi_smartdict = &__pyx_type_9adios_mpi_smartdict;
+  if (PyType_Ready(&__pyx_type_9adios_mpi_writer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_9adios_mpi_writer.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "writer", (PyObject *)&__pyx_type_9adios_mpi_writer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_9adios_mpi_writer = &__pyx_type_9adios_mpi_writer;
+  if (PyType_Ready(&__pyx_type_9adios_mpi_attrinfo) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_9adios_mpi_attrinfo.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "attrinfo", (PyObject *)&__pyx_type_9adios_mpi_attrinfo) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_9adios_mpi_attrinfo = &__pyx_type_9adios_mpi_attrinfo;
+  if (PyType_Ready(&__pyx_type_9adios_mpi_varinfo) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_9adios_mpi_varinfo.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "varinfo", (PyObject *)&__pyx_type_9adios_mpi_varinfo) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_9adios_mpi_varinfo = &__pyx_type_9adios_mpi_varinfo;
+  if (PyType_Ready(&__pyx_type_9adios_mpi___pyx_scope_struct____getitem__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_9adios_mpi___pyx_scope_struct____getitem__.tp_print = 0;
+  __pyx_ptype_9adios_mpi___pyx_scope_struct____getitem__ = &__pyx_type_9adios_mpi___pyx_scope_struct____getitem__;
+  if (PyType_Ready(&__pyx_type_9adios_mpi___pyx_scope_struct_1_genexpr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_9adios_mpi___pyx_scope_struct_1_genexpr.tp_print = 0;
+  __pyx_ptype_9adios_mpi___pyx_scope_struct_1_genexpr = &__pyx_type_9adios_mpi___pyx_scope_struct_1_genexpr;
+  if (PyType_Ready(&__pyx_type_9adios_mpi___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_9adios_mpi___pyx_scope_struct_2_genexpr.tp_print = 0;
+  __pyx_ptype_9adios_mpi___pyx_scope_struct_2_genexpr = &__pyx_type_9adios_mpi___pyx_scope_struct_2_genexpr;
   /*--- Type import code ---*/
   __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", 
   #if CYTHON_COMPILING_IN_PYPY
@@ -14282,10 +25460,10 @@ PyMODINIT_FUNC PyInit_adios_mpi(void)
   #endif
   0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_6mpi4py_3MPI_Status = __Pyx_ImportType("mpi4py.MPI", "Status", sizeof(struct PyMPIStatusObject), 1); if (unlikely(!__pyx_ptype_6mpi4py_3MPI_Status)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_6mpi4py_3MPI_Datatype = __Pyx_ImportType("mpi4py.MPI", "Datatype", sizeof(struct PyMPIDatatypeObject), 1); if (unlikely(!__pyx_ptype_6mpi4py_3MPI_Datatype)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_6mpi4py_3MPI_Request = __Pyx_ImportType("mpi4py.MPI", "Request", sizeof(struct PyMPIRequestObject), 1); if (unlikely(!__pyx_ptype_6mpi4py_3MPI_Request)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -14307,491 +25485,675 @@ PyMODINIT_FUNC PyInit_adios_mpi(void)
   /*--- Function import code ---*/
   /*--- Execution code ---*/
 
-  /* "adios_mpi.pyx":12
+  /* "adios_mpi.pyx":7
  * """
  * 
  * import numpy as np             # <<<<<<<<<<<<<<
  * cimport numpy as np
  * 
  */
-  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":15
+  /* "adios_mpi.pyx":10
  * cimport numpy as np
  * 
  * import mpi4py.MPI as MPI             # <<<<<<<<<<<<<<
  * cimport mpi4py.MPI as MPI
  * 
  */
-  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(__pyx_n_s__17);
-  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s__17);
-  __Pyx_GIVEREF(__pyx_n_s__17);
-  __pyx_t_2 = __Pyx_Import(__pyx_n_s_mpi4py_MPI, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_INCREF(__pyx_n_s__45);
+  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s__45);
+  __Pyx_GIVEREF(__pyx_n_s__45);
+  __pyx_t_2 = __Pyx_Import(__pyx_n_s_mpi4py_MPI, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_MPI, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_MPI, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":227
+  /* "adios_mpi.pyx":240
  * ## ====================
  * 
  * class DATATYPE:             # <<<<<<<<<<<<<<
  *     unknown = -1
  *     byte = 0
  */
-  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_DATATYPE, __pyx_n_s_DATATYPE, (PyObject *) NULL, __pyx_n_s_adios_mpi, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_DATATYPE, __pyx_n_s_DATATYPE, (PyObject *) NULL, __pyx_n_s_adios_mpi, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
 
-  /* "adios_mpi.pyx":228
+  /* "adios_mpi.pyx":241
  * 
  * class DATATYPE:
  *     unknown = -1             # <<<<<<<<<<<<<<
  *     byte = 0
  *     short = 1
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unknown, __pyx_int_neg_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unknown, __pyx_int_neg_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":229
+  /* "adios_mpi.pyx":242
  * class DATATYPE:
  *     unknown = -1
  *     byte = 0             # <<<<<<<<<<<<<<
  *     short = 1
  *     integer = 2
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_byte, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 229; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_byte, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":230
+  /* "adios_mpi.pyx":243
  *     unknown = -1
  *     byte = 0
  *     short = 1             # <<<<<<<<<<<<<<
  *     integer = 2
  *     long = 4
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_short, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_short, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":231
+  /* "adios_mpi.pyx":244
  *     byte = 0
  *     short = 1
  *     integer = 2             # <<<<<<<<<<<<<<
  *     long = 4
  *     unsigned_byte = 50
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_integer, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_integer, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":232
+  /* "adios_mpi.pyx":245
  *     short = 1
  *     integer = 2
  *     long = 4             # <<<<<<<<<<<<<<
  *     unsigned_byte = 50
  *     unsigned_short = 51
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_long, __pyx_int_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_long, __pyx_int_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":233
+  /* "adios_mpi.pyx":246
  *     integer = 2
  *     long = 4
  *     unsigned_byte = 50             # <<<<<<<<<<<<<<
  *     unsigned_short = 51
  *     unsigned_integer = 52
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unsigned_byte, __pyx_int_50) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unsigned_byte, __pyx_int_50) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":234
+  /* "adios_mpi.pyx":247
  *     long = 4
  *     unsigned_byte = 50
  *     unsigned_short = 51             # <<<<<<<<<<<<<<
  *     unsigned_integer = 52
  *     unsigned_long = 54
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unsigned_short, __pyx_int_51) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unsigned_short, __pyx_int_51) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":235
+  /* "adios_mpi.pyx":248
  *     unsigned_byte = 50
  *     unsigned_short = 51
  *     unsigned_integer = 52             # <<<<<<<<<<<<<<
  *     unsigned_long = 54
  *     real = 5
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unsigned_integer, __pyx_int_52) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unsigned_integer, __pyx_int_52) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":236
+  /* "adios_mpi.pyx":249
  *     unsigned_short = 51
  *     unsigned_integer = 52
  *     unsigned_long = 54             # <<<<<<<<<<<<<<
  *     real = 5
  *     double = 6
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unsigned_long, __pyx_int_54) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_unsigned_long, __pyx_int_54) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":237
+  /* "adios_mpi.pyx":250
  *     unsigned_integer = 52
  *     unsigned_long = 54
  *     real = 5             # <<<<<<<<<<<<<<
  *     double = 6
  *     long_double = 7
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_real, __pyx_int_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_real, __pyx_int_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":238
+  /* "adios_mpi.pyx":251
  *     unsigned_long = 54
  *     real = 5
  *     double = 6             # <<<<<<<<<<<<<<
  *     long_double = 7
  *     string = 9
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_double, __pyx_int_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_double, __pyx_int_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":239
+  /* "adios_mpi.pyx":252
  *     real = 5
  *     double = 6
  *     long_double = 7             # <<<<<<<<<<<<<<
  *     string = 9
  *     complex = 10
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_long_double, __pyx_int_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_long_double, __pyx_int_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":240
+  /* "adios_mpi.pyx":253
  *     double = 6
  *     long_double = 7
  *     string = 9             # <<<<<<<<<<<<<<
  *     complex = 10
  *     double_complex = 11
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_string, __pyx_int_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_string, __pyx_int_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":241
+  /* "adios_mpi.pyx":254
  *     long_double = 7
  *     string = 9
  *     complex = 10             # <<<<<<<<<<<<<<
  *     double_complex = 11
- * 
+ *     string_array = 12
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_complex_2, __pyx_int_10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_complex_2, __pyx_int_10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":242
+  /* "adios_mpi.pyx":255
  *     string = 9
  *     complex = 10
  *     double_complex = 11             # <<<<<<<<<<<<<<
+ *     string_array = 12
+ * 
+ */
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_double_complex, __pyx_int_11) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":256
+ *     complex = 10
+ *     double_complex = 11
+ *     string_array = 12             # <<<<<<<<<<<<<<
  * 
  * class FLAG:
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_double_complex, __pyx_int_11) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_string_array, __pyx_int_12) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":227
+  /* "adios_mpi.pyx":240
  * ## ====================
  * 
  * class DATATYPE:             # <<<<<<<<<<<<<<
  *     unknown = -1
  *     byte = 0
  */
-  __pyx_t_1 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_DATATYPE, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_DATATYPE, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_DATATYPE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_DATATYPE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":244
- *     double_complex = 11
+  /* "adios_mpi.pyx":258
+ *     string_array = 12
  * 
  * class FLAG:             # <<<<<<<<<<<<<<
  *     UNKNOWN = 0
  *     YES = 1
  */
-  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_FLAG, __pyx_n_s_FLAG, (PyObject *) NULL, __pyx_n_s_adios_mpi, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_FLAG, __pyx_n_s_FLAG, (PyObject *) NULL, __pyx_n_s_adios_mpi, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
 
-  /* "adios_mpi.pyx":245
+  /* "adios_mpi.pyx":259
  * 
  * class FLAG:
  *     UNKNOWN = 0             # <<<<<<<<<<<<<<
  *     YES = 1
  *     NO = 2
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_UNKNOWN, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_UNKNOWN, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":246
+  /* "adios_mpi.pyx":260
  * class FLAG:
  *     UNKNOWN = 0
  *     YES = 1             # <<<<<<<<<<<<<<
  *     NO = 2
  * 
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_YES, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_YES, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":247
+  /* "adios_mpi.pyx":261
  *     UNKNOWN = 0
  *     YES = 1
  *     NO = 2             # <<<<<<<<<<<<<<
  * 
  * class BUFFER_ALLOC_WHEN:
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_NO, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_NO, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":244
- *     double_complex = 11
+  /* "adios_mpi.pyx":258
+ *     string_array = 12
  * 
  * class FLAG:             # <<<<<<<<<<<<<<
  *     UNKNOWN = 0
  *     YES = 1
  */
-  __pyx_t_1 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_FLAG, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_FLAG, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_FLAG, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_FLAG, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":249
+  /* "adios_mpi.pyx":263
  *     NO = 2
  * 
  * class BUFFER_ALLOC_WHEN:             # <<<<<<<<<<<<<<
  *     UNKNOWN = 0
  *     NOW = 1
  */
-  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_n_s_BUFFER_ALLOC_WHEN, (PyObject *) NULL, __pyx_n_s_adios_mpi, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_n_s_BUFFER_ALLOC_WHEN, (PyObject *) NULL, __pyx_n_s_adios_mpi, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
 
-  /* "adios_mpi.pyx":250
+  /* "adios_mpi.pyx":264
  * 
  * class BUFFER_ALLOC_WHEN:
  *     UNKNOWN = 0             # <<<<<<<<<<<<<<
  *     NOW = 1
  *     LATER = 2
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_UNKNOWN, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_UNKNOWN, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":251
+  /* "adios_mpi.pyx":265
  * class BUFFER_ALLOC_WHEN:
  *     UNKNOWN = 0
  *     NOW = 1             # <<<<<<<<<<<<<<
  *     LATER = 2
  * 
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_NOW, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_NOW, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":252
+  /* "adios_mpi.pyx":266
  *     UNKNOWN = 0
  *     NOW = 1
  *     LATER = 2             # <<<<<<<<<<<<<<
  * 
- * ## ====================
+ * class READ_METHOD:
  */
-  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_LATER, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_LATER, __pyx_int_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "adios_mpi.pyx":249
+  /* "adios_mpi.pyx":263
  *     NO = 2
  * 
  * class BUFFER_ALLOC_WHEN:             # <<<<<<<<<<<<<<
  *     UNKNOWN = 0
  *     NOW = 1
  */
-  __pyx_t_1 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BUFFER_ALLOC_WHEN, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":258
+  /* "adios_mpi.pyx":268
+ *     LATER = 2
+ * 
+ * class READ_METHOD:             # <<<<<<<<<<<<<<
+ *     BP            = 0
+ *     BP_AGGREGATE  = 1
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_READ_METHOD, __pyx_n_s_READ_METHOD, (PyObject *) NULL, __pyx_n_s_adios_mpi, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "adios_mpi.pyx":269
+ * 
+ * class READ_METHOD:
+ *     BP            = 0             # <<<<<<<<<<<<<<
+ *     BP_AGGREGATE  = 1
+ *     DATASPACES    = 3
+ */
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_BP, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":270
+ * class READ_METHOD:
+ *     BP            = 0
+ *     BP_AGGREGATE  = 1             # <<<<<<<<<<<<<<
+ *     DATASPACES    = 3
+ *     DIMES         = 4
+ */
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_BP_AGGREGATE, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":271
+ *     BP            = 0
+ *     BP_AGGREGATE  = 1
+ *     DATASPACES    = 3             # <<<<<<<<<<<<<<
+ *     DIMES         = 4
+ *     FLEXPATH      = 5
+ */
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_DATASPACES, __pyx_int_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":272
+ *     BP_AGGREGATE  = 1
+ *     DATASPACES    = 3
+ *     DIMES         = 4             # <<<<<<<<<<<<<<
+ *     FLEXPATH      = 5
+ *     ICEE          = 6
+ */
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_DIMES, __pyx_int_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":273
+ *     DATASPACES    = 3
+ *     DIMES         = 4
+ *     FLEXPATH      = 5             # <<<<<<<<<<<<<<
+ *     ICEE          = 6
+ * 
+ */
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_FLEXPATH, __pyx_int_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":274
+ *     DIMES         = 4
+ *     FLEXPATH      = 5
+ *     ICEE          = 6             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  if (PyObject_SetItem(__pyx_t_2, __pyx_n_s_ICEE, __pyx_int_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "adios_mpi.pyx":268
+ *     LATER = 2
+ * 
+ * class READ_METHOD:             # <<<<<<<<<<<<<<
+ *     BP            = 0
+ *     BP_AGGREGATE  = 1
+ */
+  __pyx_t_1 = __Pyx_Py3ClassCreate(((PyObject*)&__Pyx_DefaultClassType), __pyx_n_s_READ_METHOD, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_READ_METHOD, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":304
  * ## ====================
  * 
  * cpdef init(char * config, MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
  *     return adios_init(config, comm.ob_mpi)
  * 
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_k_ = ((struct PyMPICommObject *)__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__4 = ((struct PyMPICommObject *)__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_k_ = ((struct PyMPICommObject *)__pyx_t_2);
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__4 = ((struct PyMPICommObject *)__pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":264
+  /* "adios_mpi.pyx":310
  *                    char * name,
  *                    char * mode,
  *                    MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
  *     cdef int64_t fd
  *     cdef int result
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_k__2 = ((struct PyMPICommObject *)__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__5 = ((struct PyMPICommObject *)__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":261
+  /* "adios_mpi.pyx":307
  *     return adios_init(config, comm.ob_mpi)
  * 
  * cpdef int64_t open(char * group_name,             # <<<<<<<<<<<<<<
  *                    char * name,
  *                    char * mode,
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "adios_mpi.pyx":264
+  /* "adios_mpi.pyx":310
  *                    char * name,
  *                    char * mode,
  *                    MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
  *     cdef int64_t fd
  *     cdef int result
  */
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_k__2 = ((struct PyMPICommObject *)__pyx_t_2);
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__5 = ((struct PyMPICommObject *)__pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":308
+  /* "adios_mpi.pyx":361
  * ## ADIOS No-XML API
  * ## ====================
  * cpdef int init_noxml(MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
  *     return adios_init_noxml(comm.ob_mpi)
  * 
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_k__3 = ((struct PyMPICommObject *)__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__6 = ((struct PyMPICommObject *)__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_k__3 = ((struct PyMPICommObject *)__pyx_t_2);
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__6 = ((struct PyMPICommObject *)__pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":487
+  /* "adios_mpi.pyx":592
  * """ Call adios_read_init_method """
  * cpdef int read_init(char * method_name = "BP",
  *                     MPI.Comm comm = MPI.COMM_WORLD,             # <<<<<<<<<<<<<<
  *                     char * parameters = ""):
  *     cdef method = str2adiosreadmethod(method_name)
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_k__5 = ((struct PyMPICommObject *)__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__8 = ((struct PyMPICommObject *)__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":486
+  /* "adios_mpi.pyx":591
  * 
  * """ Call adios_read_init_method """
  * cpdef int read_init(char * method_name = "BP",             # <<<<<<<<<<<<<<
  *                     MPI.Comm comm = MPI.COMM_WORLD,
  *                     char * parameters = ""):
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "adios_mpi.pyx":487
+  /* "adios_mpi.pyx":592
  * """ Call adios_read_init_method """
  * cpdef int read_init(char * method_name = "BP",
  *                     MPI.Comm comm = MPI.COMM_WORLD,             # <<<<<<<<<<<<<<
  *                     char * parameters = ""):
  *     cdef method = str2adiosreadmethod(method_name)
  */
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_k__5 = ((struct PyMPICommObject *)__pyx_t_2);
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__8 = ((struct PyMPICommObject *)__pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":521
+  /* "adios_mpi.pyx":685
  *     def __init__(self, char * fname,
- *                  char * method_name = "BP",
+ *                  char * method_name = 'BP',
  *                  MPI.Comm comm = MPI.COMM_WORLD,             # <<<<<<<<<<<<<<
  *                  is_stream = False,
  *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
  */
-  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_k__6 = ((struct PyMPICommObject *)__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__9 = ((struct PyMPICommObject *)__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "adios_mpi.pyx":523
+  /* "adios_mpi.pyx":687
  *                  MPI.Comm comm = MPI.COMM_WORLD,
  *                  is_stream = False,
  *                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,             # <<<<<<<<<<<<<<
  *                  float timeout_sec = 0.0):
  *         self.fp = NULL
  */
-  __pyx_k__7 = ADIOS_LOCKMODE_ALL;
+  __pyx_k__10 = ADIOS_LOCKMODE_ALL;
 
-  /* "adios_mpi.pyx":660
+  /* "adios_mpi.pyx":1206
+ *     def __init__(self,char * fname,
+ *                  bint is_noxml = True,
+ *                  MPI.Comm comm = MPI.COMM_WORLD):             # <<<<<<<<<<<<<<
+ *         self.fname = fname
+ *         self.method = <bytes>""
+ */
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MPI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COMM_WORLD); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_6mpi4py_3MPI_Comm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k__22 = ((struct PyMPICommObject *)__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1244
+ * 
+ *     def define_var(self, char * varname,
+ *                    ldim = tuple(),             # <<<<<<<<<<<<<<
+ *                    gdim = tuple(),
+ *                    offset = tuple()):
+ */
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_k__23 = __pyx_t_2;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1245
+ *     def define_var(self, char * varname,
+ *                    ldim = tuple(),
+ *                    gdim = tuple(),             # <<<<<<<<<<<<<<
+ *                    offset = tuple()):
+ *         """
+ */
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_k__24 = __pyx_t_2;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1246
+ *                    ldim = tuple(),
+ *                    gdim = tuple(),
+ *                    offset = tuple()):             # <<<<<<<<<<<<<<
+ *         """
+ *         Define a variable associated with the file.
+ */
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_k__25 = __pyx_t_2;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1407
+ * 
+ *     def __init__(self, char * name,
+ *                  ldim = tuple(),             # <<<<<<<<<<<<<<
+ *                  gdim = tuple(),
+ *                  offset = tuple()):
+ */
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_k__27 = __pyx_t_2;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1408
+ *     def __init__(self, char * name,
+ *                  ldim = tuple(),
+ *                  gdim = tuple(),             # <<<<<<<<<<<<<<
+ *                  offset = tuple()):
+ *         self.name = name
+ */
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_k__28 = __pyx_t_2;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1409
+ *                  ldim = tuple(),
+ *                  gdim = tuple(),
+ *                  offset = tuple()):             # <<<<<<<<<<<<<<
+ *         self.name = name
+ *         self.ldim = ldim
+ */
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_k__29 = __pyx_t_2;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "adios_mpi.pyx":1464
  * ## ====================
  * 
  * def readvar(fname, varname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     if not f.var.has_key(varname):
+ *     """ Retrieve a variable value from an Adios file.
+ * 
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_9adios_mpi_39readvar, NULL, __pyx_n_s_adios_mpi); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_readvar, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_9adios_mpi_49readvar, NULL, __pyx_n_s_adios_mpi); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_readvar, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "adios_mpi.pyx":669
+  /* "adios_mpi.pyx":1482
  *     return v.read(from_steps=0, nsteps=v.nsteps)
  * 
  * def bpls(fname):             # <<<<<<<<<<<<<<
- *     f = file(fname, comm=MPI.COMM_SELF)
- *     return {'nvars': f.nvars,
+ *     """ Return meta data of an Adios file as a Python dictionary object.
+ * 
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_9adios_mpi_41bpls, NULL, __pyx_n_s_adios_mpi); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 669; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_bpls, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 669; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_9adios_mpi_51bpls, NULL, __pyx_n_s_adios_mpi); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_bpls, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
   /* "adios_mpi.pyx":1
- * """             # <<<<<<<<<<<<<<
- *  ADIOS is freely available under the terms of the BSD license described
- *  in the COPYING file in the top level directory of this source distribution.
+ * # -*- coding: utf-8 -*-             # <<<<<<<<<<<<<<
+ * """ADIOS: ADIOS python module
+ * 
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_kp_u_var_read_line_887, __pyx_kp_u_Perform_read_Read_data_from_an) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, __pyx_kp_u_writer_declare_group_line_1221, __pyx_kp_u_Define_a_group_associated_with) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, __pyx_kp_u_writer_define_var_line_1243, __pyx_kp_u_Define_a_variable_associated_wi) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976
+  /* "../../../../../../opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":979
  *      arr.base = baseptr
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -14822,34 +26184,195 @@ PyMODINIT_FUNC PyInit_adios_mpi(void)
   #endif
 }
 
-/* Runtime support code */
-#if CYTHON_REFNANNY
-static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
-    PyObject *m = NULL, *p = NULL;
-    void *r = NULL;
-    m = PyImport_ImportModule((char *)modname);
-    if (!m) goto end;
-    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
-    if (!p) goto end;
-    r = PyLong_AsVoidPtr(p);
-end:
-    Py_XDECREF(p);
-    Py_XDECREF(m);
-    return (__Pyx_RefNannyAPIStruct *)r;
+/* --- Runtime support code --- */
+#if CYTHON_REFNANNY
+static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
+    PyObject *m = NULL, *p = NULL;
+    void *r = NULL;
+    m = PyImport_ImportModule((char *)modname);
+    if (!m) goto end;
+    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
+    if (!p) goto end;
+    r = PyLong_AsVoidPtr(p);
+end:
+    Py_XDECREF(p);
+    Py_XDECREF(m);
+    return (__Pyx_RefNannyAPIStruct *)r;
+}
+#endif
+
+static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
+    PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
+    if (unlikely(!result)) {
+        PyErr_Format(PyExc_NameError,
+#if PY_MAJOR_VERSION >= 3
+            "name '%U' is not defined", name);
+#else
+            "name '%.200s' is not defined", PyString_AS_STRING(name));
+#endif
+    }
+    return result;
+}
+
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
+    PyObject *r;
+    if (!j) return NULL;
+    r = PyObject_GetItem(o, j);
+    Py_DECREF(j);
+    return r;
+}
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
+                                                              int wraparound, int boundscheck) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o);
+    if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        PyObject *r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
+}
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
+                                                              int wraparound, int boundscheck) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o);
+    if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        PyObject *r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
+}
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
+                                                     int is_list, int wraparound, int boundscheck) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (is_list || PyList_CheckExact(o)) {
+        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+        if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) {
+            PyObject *r = PyList_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
+    }
+    else if (PyTuple_CheckExact(o)) {
+        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
+        if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
+    } else {
+        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
+        if (likely(m && m->sq_item)) {
+            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
+                Py_ssize_t l = m->sq_length(o);
+                if (likely(l >= 0)) {
+                    i += l;
+                } else {
+                    if (PyErr_ExceptionMatches(PyExc_OverflowError))
+                        PyErr_Clear();
+                    else
+                        return NULL;
+                }
+            }
+            return m->sq_item(o, i);
+        }
+    }
+#else
+    if (is_list || PySequence_Check(o)) {
+        return PySequence_GetItem(o, i);
+    }
+#endif
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+}
+
+static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    PyThreadState *tstate = PyThreadState_GET();
+    tmp_type = tstate->curexc_type;
+    tmp_value = tstate->curexc_value;
+    tmp_tb = tstate->curexc_traceback;
+    tstate->curexc_type = type;
+    tstate->curexc_value = value;
+    tstate->curexc_traceback = tb;
+    Py_XDECREF(tmp_type);
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(tmp_tb);
+#else
+    PyErr_Restore(type, value, tb);
+#endif
+}
+static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyThreadState *tstate = PyThreadState_GET();
+    *type = tstate->curexc_type;
+    *value = tstate->curexc_value;
+    *tb = tstate->curexc_traceback;
+    tstate->curexc_type = 0;
+    tstate->curexc_value = 0;
+    tstate->curexc_traceback = 0;
+#else
+    PyErr_Fetch(type, value, tb);
+#endif
+}
+
+static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
+                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
+                                  int full_traceback) {
+    PyObject *old_exc, *old_val, *old_tb;
+    PyObject *ctx;
+    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
+    if (full_traceback) {
+        Py_XINCREF(old_exc);
+        Py_XINCREF(old_val);
+        Py_XINCREF(old_tb);
+        __Pyx_ErrRestore(old_exc, old_val, old_tb);
+        PyErr_PrintEx(1);
+    }
+    #if PY_MAJOR_VERSION < 3
+    ctx = PyString_FromString(name);
+    #else
+    ctx = PyUnicode_FromString(name);
+    #endif
+    __Pyx_ErrRestore(old_exc, old_val, old_tb);
+    if (!ctx) {
+        PyErr_WriteUnraisable(Py_None);
+    } else {
+        PyErr_WriteUnraisable(ctx);
+        Py_DECREF(ctx);
+    }
 }
-#endif
 
-static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
-    PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
-    if (unlikely(!result)) {
-        PyErr_Format(PyExc_NameError,
-#if PY_MAJOR_VERSION >= 3
-            "name '%U' is not defined", name);
-#else
-            "name '%.200s' is not defined", PyString_AS_STRING(name));
-#endif
+static void __Pyx_RaiseArgtupleInvalid(
+    const char* func_name,
+    int exact,
+    Py_ssize_t num_min,
+    Py_ssize_t num_max,
+    Py_ssize_t num_found)
+{
+    Py_ssize_t num_expected;
+    const char *more_or_less;
+    if (num_found < num_min) {
+        num_expected = num_min;
+        more_or_less = "at least";
+    } else {
+        num_expected = num_max;
+        more_or_less = "at most";
     }
-    return result;
+    if (exact) {
+        more_or_less = "exactly";
+    }
+    PyErr_Format(PyExc_TypeError,
+                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                 func_name, more_or_less, num_expected,
+                 (num_expected == 1) ? "" : "s", num_found);
 }
 
 static void __Pyx_RaiseDoubleKeywordsError(
@@ -14966,31 +26489,6 @@ bad:
     return -1;
 }
 
-static void __Pyx_RaiseArgtupleInvalid(
-    const char* func_name,
-    int exact,
-    Py_ssize_t num_min,
-    Py_ssize_t num_max,
-    Py_ssize_t num_found)
-{
-    Py_ssize_t num_expected;
-    const char *more_or_less;
-    if (num_found < num_min) {
-        num_expected = num_min;
-        more_or_less = "at least";
-    } else {
-        num_expected = num_max;
-        more_or_less = "at most";
-    }
-    if (exact) {
-        more_or_less = "exactly";
-    }
-    PyErr_Format(PyExc_TypeError,
-                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
-                 func_name, more_or_less, num_expected,
-                 (num_expected == 1) ? "" : "s", num_found);
-}
-
 static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) {
     PyErr_Format(PyExc_TypeError,
         "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)",
@@ -15017,6 +26515,18 @@ static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, in
     return 0;
 }
 
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
+    if (unlikely(!type)) {
+        PyErr_SetString(PyExc_SystemError, "Missing type object");
+        return 0;
+    }
+    if (likely(PyObject_TypeCheck(obj, type)))
+        return 1;
+    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
+                 Py_TYPE(obj)->tp_name, type->tp_name);
+    return 0;
+}
+
 static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
     PyObject *result;
 #if CYTHON_COMPILING_IN_CPYTHON
@@ -15053,75 +26563,54 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg
 }
 #endif
 
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
-    if (unlikely(!type)) {
-        PyErr_SetString(PyExc_SystemError, "Missing type object");
-        return 0;
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
+    PyObject *self, *result;
+    PyCFunction cfunc;
+    cfunc = PyCFunction_GET_FUNCTION(func);
+    self = PyCFunction_GET_SELF(func);
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+        return NULL;
+    result = cfunc(self, arg);
+    Py_LeaveRecursiveCall();
+    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+        PyErr_SetString(
+            PyExc_SystemError,
+            "NULL result without error in PyObject_Call");
     }
-    if (likely(PyObject_TypeCheck(obj, type)))
-        return 1;
-    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
-                 Py_TYPE(obj)->tp_name, type->tp_name);
-    return 0;
+    return result;
 }
+#endif
 
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
 #if CYTHON_COMPILING_IN_CPYTHON
-    PyObject *tmp_type, *tmp_value, *tmp_tb;
-    PyThreadState *tstate = PyThreadState_GET();
-    tmp_type = tstate->curexc_type;
-    tmp_value = tstate->curexc_value;
-    tmp_tb = tstate->curexc_traceback;
-    tstate->curexc_type = type;
-    tstate->curexc_value = value;
-    tstate->curexc_traceback = tb;
-    Py_XDECREF(tmp_type);
-    Py_XDECREF(tmp_value);
-    Py_XDECREF(tmp_tb);
-#else
-    PyErr_Restore(type, value, tb);
-#endif
+static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+    PyObject *result;
+    PyObject *args = PyTuple_New(1);
+    if (unlikely(!args)) return NULL;
+    Py_INCREF(arg);
+    PyTuple_SET_ITEM(args, 0, arg);
+    result = __Pyx_PyObject_Call(func, args, NULL);
+    Py_DECREF(args);
+    return result;
 }
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    PyThreadState *tstate = PyThreadState_GET();
-    *type = tstate->curexc_type;
-    *value = tstate->curexc_value;
-    *tb = tstate->curexc_traceback;
-    tstate->curexc_type = 0;
-    tstate->curexc_value = 0;
-    tstate->curexc_traceback = 0;
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+#ifdef __Pyx_CyFunction_USED
+    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
 #else
-    PyErr_Fetch(type, value, tb);
+    if (likely(PyCFunction_Check(func))) {
 #endif
-}
-
-static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
-                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
-                                  int full_traceback) {
-    PyObject *old_exc, *old_val, *old_tb;
-    PyObject *ctx;
-    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
-    if (full_traceback) {
-        Py_XINCREF(old_exc);
-        Py_XINCREF(old_val);
-        Py_XINCREF(old_tb);
-        __Pyx_ErrRestore(old_exc, old_val, old_tb);
-        PyErr_PrintEx(1);
-    }
-    #if PY_MAJOR_VERSION < 3
-    ctx = PyString_FromString(name);
-    #else
-    ctx = PyUnicode_FromString(name);
-    #endif
-    __Pyx_ErrRestore(old_exc, old_val, old_tb);
-    if (!ctx) {
-        PyErr_WriteUnraisable(Py_None);
-    } else {
-        PyErr_WriteUnraisable(ctx);
-        Py_DECREF(ctx);
+        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
+            return __Pyx_PyObject_CallMethO(func, arg);
+        }
     }
+    return __Pyx__PyObject_CallOneArg(func, arg);
+}
+#else
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+    PyObject* args = PyTuple_Pack(1, arg);
+    return (likely(args)) ? __Pyx_PyObject_Call(func, args, NULL) : NULL;
 }
+#endif
 
 static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
 #if CYTHON_COMPILING_IN_PYPY
@@ -15160,148 +26649,597 @@ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int eq
 #endif
 }
 
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
-    PyObject *r;
-    if (!j) return NULL;
-    r = PyObject_GetItem(o, j);
-    Py_DECREF(j);
-    return r;
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
+#if CYTHON_COMPILING_IN_PYPY
+    return PyObject_RichCompareBool(s1, s2, equals);
+#else
+#if PY_MAJOR_VERSION < 3
+    PyObject* owned_ref = NULL;
+#endif
+    int s1_is_unicode, s2_is_unicode;
+    if (s1 == s2) {
+        goto return_eq;
+    }
+    s1_is_unicode = PyUnicode_CheckExact(s1);
+    s2_is_unicode = PyUnicode_CheckExact(s2);
+#if PY_MAJOR_VERSION < 3
+    if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) {
+        owned_ref = PyUnicode_FromObject(s2);
+        if (unlikely(!owned_ref))
+            return -1;
+        s2 = owned_ref;
+        s2_is_unicode = 1;
+    } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) {
+        owned_ref = PyUnicode_FromObject(s1);
+        if (unlikely(!owned_ref))
+            return -1;
+        s1 = owned_ref;
+        s1_is_unicode = 1;
+    } else if (((!s2_is_unicode) & (!s1_is_unicode))) {
+        return __Pyx_PyBytes_Equals(s1, s2, equals);
+    }
+#endif
+    if (s1_is_unicode & s2_is_unicode) {
+        Py_ssize_t length;
+        int kind;
+        void *data1, *data2;
+        if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0))
+            return -1;
+        length = __Pyx_PyUnicode_GET_LENGTH(s1);
+        if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) {
+            goto return_ne;
+        }
+        kind = __Pyx_PyUnicode_KIND(s1);
+        if (kind != __Pyx_PyUnicode_KIND(s2)) {
+            goto return_ne;
+        }
+        data1 = __Pyx_PyUnicode_DATA(s1);
+        data2 = __Pyx_PyUnicode_DATA(s2);
+        if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) {
+            goto return_ne;
+        } else if (length == 1) {
+            goto return_eq;
+        } else {
+            int result = memcmp(data1, data2, (size_t)(length * kind));
+            #if PY_MAJOR_VERSION < 3
+            Py_XDECREF(owned_ref);
+            #endif
+            return (equals == Py_EQ) ? (result == 0) : (result != 0);
+        }
+    } else if ((s1 == Py_None) & s2_is_unicode) {
+        goto return_ne;
+    } else if ((s2 == Py_None) & s1_is_unicode) {
+        goto return_ne;
+    } else {
+        int result;
+        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
+        if (!py_result)
+            return -1;
+        result = __Pyx_PyObject_IsTrue(py_result);
+        Py_DECREF(py_result);
+        return result;
+    }
+return_eq:
+    #if PY_MAJOR_VERSION < 3
+    Py_XDECREF(owned_ref);
+    #endif
+    return (equals == Py_EQ);
+return_ne:
+    #if PY_MAJOR_VERSION < 3
+    Py_XDECREF(owned_ref);
+    #endif
+    return (equals == Py_NE);
+#endif
 }
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck) {
+
 #if CYTHON_COMPILING_IN_CPYTHON
-    if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o);
-    if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        PyObject *r = PyList_GET_ITEM(o, i);
-        Py_INCREF(r);
-        return r;
-    }
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
+#ifdef __Pyx_CyFunction_USED
+    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
 #else
-    return PySequence_GetItem(o, i);
+    if (likely(PyCFunction_Check(func))) {
 #endif
+        if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
+            return __Pyx_PyObject_CallMethO(func, NULL);
+        }
+    }
+    return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
 }
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
-                                                              int wraparound, int boundscheck) {
+#endif
+
+static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) {
+    PyObject *method, *result = NULL;
+    method = __Pyx_PyObject_GetAttrStr(obj, method_name);
+    if (unlikely(!method)) goto bad;
 #if CYTHON_COMPILING_IN_CPYTHON
-    if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o);
-    if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-        PyObject *r = PyTuple_GET_ITEM(o, i);
-        Py_INCREF(r);
-        return r;
+    if (likely(PyMethod_Check(method))) {
+        PyObject *self = PyMethod_GET_SELF(method);
+        if (likely(self)) {
+            PyObject *args;
+            PyObject *function = PyMethod_GET_FUNCTION(method);
+            args = PyTuple_New(2);
+            if (unlikely(!args)) goto bad;
+            Py_INCREF(self);
+            PyTuple_SET_ITEM(args, 0, self);
+            Py_INCREF(arg);
+            PyTuple_SET_ITEM(args, 1, arg);
+            Py_INCREF(function);
+            Py_DECREF(method); method = NULL;
+            result = __Pyx_PyObject_Call(function, args, NULL);
+            Py_DECREF(args);
+            Py_DECREF(function);
+            return result;
+        }
     }
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-#else
-    return PySequence_GetItem(o, i);
 #endif
+    result = __Pyx_PyObject_CallOneArg(method, arg);
+bad:
+    Py_XDECREF(method);
+    return result;
 }
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
-                                                     int is_list, int wraparound, int boundscheck) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (is_list || PyList_CheckExact(o)) {
-        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
-        if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) {
-            PyObject *r = PyList_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
+
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d) {
+    if (PY_MAJOR_VERSION >= 3)
+        return __Pyx_PyObject_CallMethod1((PyObject*)&PyDict_Type, __pyx_n_s_values, d);
+    else
+        return PyDict_Values(d);
+}
+
+#if PY_MAJOR_VERSION < 3
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
+                        CYTHON_UNUSED PyObject *cause) {
+    Py_XINCREF(type);
+    if (!value || value == Py_None)
+        value = NULL;
+    else
+        Py_INCREF(value);
+    if (!tb || tb == Py_None)
+        tb = NULL;
+    else {
+        Py_INCREF(tb);
+        if (!PyTraceBack_Check(tb)) {
+            PyErr_SetString(PyExc_TypeError,
+                "raise: arg 3 must be a traceback or None");
+            goto raise_error;
         }
     }
-    else if (PyTuple_CheckExact(o)) {
-        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
-        if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
+    if (PyType_Check(type)) {
+#if CYTHON_COMPILING_IN_PYPY
+        if (!value) {
+            Py_INCREF(Py_None);
+            value = Py_None;
         }
+#endif
+        PyErr_NormalizeException(&type, &value, &tb);
     } else {
-        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
-        if (likely(m && m->sq_item)) {
-            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
-                Py_ssize_t l = m->sq_length(o);
-                if (likely(l >= 0)) {
-                    i += l;
+        if (value) {
+            PyErr_SetString(PyExc_TypeError,
+                "instance exception may not have a separate value");
+            goto raise_error;
+        }
+        value = type;
+        type = (PyObject*) Py_TYPE(type);
+        Py_INCREF(type);
+        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
+            PyErr_SetString(PyExc_TypeError,
+                "raise: exception class must be a subclass of BaseException");
+            goto raise_error;
+        }
+    }
+    __Pyx_ErrRestore(type, value, tb);
+    return;
+raise_error:
+    Py_XDECREF(value);
+    Py_XDECREF(type);
+    Py_XDECREF(tb);
+    return;
+}
+#else
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
+    PyObject* owned_instance = NULL;
+    if (tb == Py_None) {
+        tb = 0;
+    } else if (tb && !PyTraceBack_Check(tb)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: arg 3 must be a traceback or None");
+        goto bad;
+    }
+    if (value == Py_None)
+        value = 0;
+    if (PyExceptionInstance_Check(type)) {
+        if (value) {
+            PyErr_SetString(PyExc_TypeError,
+                "instance exception may not have a separate value");
+            goto bad;
+        }
+        value = type;
+        type = (PyObject*) Py_TYPE(value);
+    } else if (PyExceptionClass_Check(type)) {
+        PyObject *instance_class = NULL;
+        if (value && PyExceptionInstance_Check(value)) {
+            instance_class = (PyObject*) Py_TYPE(value);
+            if (instance_class != type) {
+                if (PyObject_IsSubclass(instance_class, type)) {
+                    type = instance_class;
                 } else {
-                    if (PyErr_ExceptionMatches(PyExc_OverflowError))
-                        PyErr_Clear();
-                    else
-                        return NULL;
+                    instance_class = NULL;
                 }
             }
-            return m->sq_item(o, i);
         }
+        if (!instance_class) {
+            PyObject *args;
+            if (!value)
+                args = PyTuple_New(0);
+            else if (PyTuple_Check(value)) {
+                Py_INCREF(value);
+                args = value;
+            } else
+                args = PyTuple_Pack(1, value);
+            if (!args)
+                goto bad;
+            owned_instance = PyObject_Call(type, args, NULL);
+            Py_DECREF(args);
+            if (!owned_instance)
+                goto bad;
+            value = owned_instance;
+            if (!PyExceptionInstance_Check(value)) {
+                PyErr_Format(PyExc_TypeError,
+                             "calling %R should have returned an instance of "
+                             "BaseException, not %R",
+                             type, Py_TYPE(value));
+                goto bad;
+            }
+        }
+    } else {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: exception class must be a subclass of BaseException");
+        goto bad;
     }
+#if PY_VERSION_HEX >= 0x03030000
+    if (cause) {
 #else
-    if (is_list || PySequence_Check(o)) {
-        return PySequence_GetItem(o, i);
+    if (cause && cause != Py_None) {
+#endif
+        PyObject *fixed_cause;
+        if (cause == Py_None) {
+            fixed_cause = NULL;
+        } else if (PyExceptionClass_Check(cause)) {
+            fixed_cause = PyObject_CallObject(cause, NULL);
+            if (fixed_cause == NULL)
+                goto bad;
+        } else if (PyExceptionInstance_Check(cause)) {
+            fixed_cause = cause;
+            Py_INCREF(fixed_cause);
+        } else {
+            PyErr_SetString(PyExc_TypeError,
+                            "exception causes must derive from "
+                            "BaseException");
+            goto bad;
+        }
+        PyException_SetCause(value, fixed_cause);
+    }
+    PyErr_SetObject(type, value);
+    if (tb) {
+#if CYTHON_COMPILING_IN_PYPY
+        PyObject *tmp_type, *tmp_value, *tmp_tb;
+        PyErr_Fetch(tmp_type, tmp_value, tmp_tb);
+        Py_INCREF(tb);
+        PyErr_Restore(tmp_type, tmp_value, tb);
+        Py_XDECREF(tmp_tb);
+#else
+        PyThreadState *tstate = PyThreadState_GET();
+        PyObject* tmp_tb = tstate->curexc_traceback;
+        if (tb != tmp_tb) {
+            Py_INCREF(tb);
+            tstate->curexc_traceback = tb;
+            Py_XDECREF(tmp_tb);
+        }
+#endif
     }
+bad:
+    Py_XDECREF(owned_instance);
+    return;
+}
 #endif
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Keys(PyObject* d) {
+    if (PY_MAJOR_VERSION >= 3)
+        return __Pyx_PyObject_CallMethod1((PyObject*)&PyDict_Type, __pyx_n_s_keys, d);
+    else
+        return PyDict_Keys(d);
+}
+
+static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) {
+    PyObject* value;
+#if PY_MAJOR_VERSION >= 3
+    value = PyDict_GetItemWithError(d, key);
+    if (unlikely(!value)) {
+        if (unlikely(PyErr_Occurred()))
+            return NULL;
+        value = default_value;
+    }
+    Py_INCREF(value);
+#else
+    if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) {
+        value = PyDict_GetItem(d, key);
+        if (unlikely(!value)) {
+            value = default_value;
+        }
+        Py_INCREF(value);
+    } else {
+        if (default_value == Py_None)
+            default_value = NULL;
+        value = PyObject_CallMethodObjArgs(
+            d, __pyx_n_s_get, key, default_value, NULL);
+    }
+#endif
+    return value;
 }
 
+static CYTHON_INLINE int __Pyx_PyObject_SetSlice(
+        PyObject* obj, PyObject* value, Py_ssize_t cstart, Py_ssize_t cstop,
+        PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice,
+        int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) {
 #if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
-    PyObject *self, *result;
-    PyCFunction cfunc;
-    cfunc = PyCFunction_GET_FUNCTION(func);
-    self = PyCFunction_GET_SELF(func);
-    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
-        return NULL;
-    result = cfunc(self, arg);
-    Py_LeaveRecursiveCall();
-    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
-        PyErr_SetString(
-            PyExc_SystemError,
-            "NULL result without error in PyObject_Call");
+    PyMappingMethods* mp;
+#if PY_MAJOR_VERSION < 3
+    PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence;
+    if (likely(ms && ms->sq_ass_slice)) {
+        if (!has_cstart) {
+            if (_py_start && (*_py_start != Py_None)) {
+                cstart = __Pyx_PyIndex_AsSsize_t(*_py_start);
+                if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+            } else
+                cstart = 0;
+        }
+        if (!has_cstop) {
+            if (_py_stop && (*_py_stop != Py_None)) {
+                cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop);
+                if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+            } else
+                cstop = PY_SSIZE_T_MAX;
+        }
+        if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) {
+            Py_ssize_t l = ms->sq_length(obj);
+            if (likely(l >= 0)) {
+                if (cstop < 0) {
+                    cstop += l;
+                    if (cstop < 0) cstop = 0;
+                }
+                if (cstart < 0) {
+                    cstart += l;
+                    if (cstart < 0) cstart = 0;
+                }
+            } else {
+                if (PyErr_ExceptionMatches(PyExc_OverflowError))
+                    PyErr_Clear();
+                else
+                    goto bad;
+            }
+        }
+        return ms->sq_ass_slice(obj, cstart, cstop, value);
     }
-    return result;
-}
 #endif
-
+    mp = Py_TYPE(obj)->tp_as_mapping;
+    if (likely(mp && mp->mp_ass_subscript))
+#endif
+    {
+        int result;
+        PyObject *py_slice, *py_start, *py_stop;
+        if (_py_slice) {
+            py_slice = *_py_slice;
+        } else {
+            PyObject* owned_start = NULL;
+            PyObject* owned_stop = NULL;
+            if (_py_start) {
+                py_start = *_py_start;
+            } else {
+                if (has_cstart) {
+                    owned_start = py_start = PyInt_FromSsize_t(cstart);
+                    if (unlikely(!py_start)) goto bad;
+                } else
+                    py_start = Py_None;
+            }
+            if (_py_stop) {
+                py_stop = *_py_stop;
+            } else {
+                if (has_cstop) {
+                    owned_stop = py_stop = PyInt_FromSsize_t(cstop);
+                    if (unlikely(!py_stop)) {
+                        Py_XDECREF(owned_start);
+                        goto bad;
+                    }
+                } else
+                    py_stop = Py_None;
+            }
+            py_slice = PySlice_New(py_start, py_stop, Py_None);
+            Py_XDECREF(owned_start);
+            Py_XDECREF(owned_stop);
+            if (unlikely(!py_slice)) goto bad;
+        }
 #if CYTHON_COMPILING_IN_CPYTHON
-static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-    PyObject *result;
-    PyObject *args = PyTuple_New(1);
-    if (unlikely(!args)) return NULL;
-    Py_INCREF(arg);
-    PyTuple_SET_ITEM(args, 0, arg);
-    result = __Pyx_PyObject_Call(func, args, NULL);
-    Py_DECREF(args);
-    return result;
-}
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-#ifdef __Pyx_CyFunction_USED
-    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
+        result = mp->mp_ass_subscript(obj, py_slice, value);
 #else
-    if (likely(PyCFunction_Check(func))) {
+        result = value ? PyObject_SetItem(obj, py_slice, value) : PyObject_DelItem(obj, py_slice);
 #endif
-        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
-            return __Pyx_PyObject_CallMethO(func, arg);
+        if (!_py_slice) {
+            Py_DECREF(py_slice);
         }
+        return result;
     }
-    return __Pyx__PyObject_CallOneArg(func, arg);
+    PyErr_Format(PyExc_TypeError,
+        "'%.200s' object does not support slice %.10s",
+        Py_TYPE(obj)->tp_name, value ? "assignment" : "deletion");
+bad:
+    return -1;
 }
-#else
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-    PyObject* args = PyTuple_Pack(1, arg);
-    return (likely(args)) ? __Pyx_PyObject_Call(func, args, NULL) : NULL;
+
+static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
+    PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
 }
-#endif
 
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
+        PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
+        PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice,
+        int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) {
 #if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
-#ifdef __Pyx_CyFunction_USED
-    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
+    PyMappingMethods* mp;
+#if PY_MAJOR_VERSION < 3
+    PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence;
+    if (likely(ms && ms->sq_slice)) {
+        if (!has_cstart) {
+            if (_py_start && (*_py_start != Py_None)) {
+                cstart = __Pyx_PyIndex_AsSsize_t(*_py_start);
+                if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+            } else
+                cstart = 0;
+        }
+        if (!has_cstop) {
+            if (_py_stop && (*_py_stop != Py_None)) {
+                cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop);
+                if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+            } else
+                cstop = PY_SSIZE_T_MAX;
+        }
+        if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) {
+            Py_ssize_t l = ms->sq_length(obj);
+            if (likely(l >= 0)) {
+                if (cstop < 0) {
+                    cstop += l;
+                    if (cstop < 0) cstop = 0;
+                }
+                if (cstart < 0) {
+                    cstart += l;
+                    if (cstart < 0) cstart = 0;
+                }
+            } else {
+                if (PyErr_ExceptionMatches(PyExc_OverflowError))
+                    PyErr_Clear();
+                else
+                    goto bad;
+            }
+        }
+        return ms->sq_slice(obj, cstart, cstop);
+    }
+#endif
+    mp = Py_TYPE(obj)->tp_as_mapping;
+    if (likely(mp && mp->mp_subscript))
+#endif
+    {
+        PyObject* result;
+        PyObject *py_slice, *py_start, *py_stop;
+        if (_py_slice) {
+            py_slice = *_py_slice;
+        } else {
+            PyObject* owned_start = NULL;
+            PyObject* owned_stop = NULL;
+            if (_py_start) {
+                py_start = *_py_start;
+            } else {
+                if (has_cstart) {
+                    owned_start = py_start = PyInt_FromSsize_t(cstart);
+                    if (unlikely(!py_start)) goto bad;
+                } else
+                    py_start = Py_None;
+            }
+            if (_py_stop) {
+                py_stop = *_py_stop;
+            } else {
+                if (has_cstop) {
+                    owned_stop = py_stop = PyInt_FromSsize_t(cstop);
+                    if (unlikely(!py_stop)) {
+                        Py_XDECREF(owned_start);
+                        goto bad;
+                    }
+                } else
+                    py_stop = Py_None;
+            }
+            py_slice = PySlice_New(py_start, py_stop, Py_None);
+            Py_XDECREF(owned_start);
+            Py_XDECREF(owned_stop);
+            if (unlikely(!py_slice)) goto bad;
+        }
+#if CYTHON_COMPILING_IN_CPYTHON
+        result = mp->mp_subscript(obj, py_slice);
 #else
-    if (likely(PyCFunction_Check(func))) {
+        result = PyObject_GetItem(obj, py_slice);
 #endif
-        if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
-            return __Pyx_PyObject_CallMethO(func, NULL);
+        if (!_py_slice) {
+            Py_DECREF(py_slice);
         }
+        return result;
     }
-    return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
+    PyErr_Format(PyExc_TypeError,
+        "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name);
+bad:
+    return NULL;
+}
+
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE void __Pyx_crop_slice(Py_ssize_t* _start, Py_ssize_t* _stop, Py_ssize_t* _length) {
+    Py_ssize_t start = *_start, stop = *_stop, length = *_length;
+    if (start < 0) {
+        start += length;
+        if (start < 0)
+            start = 0;
+    }
+    if (stop < 0)
+        stop += length;
+    else if (stop > length)
+        stop = length;
+    *_length = stop - start;
+    *_start = start;
+    *_stop = stop;
+}
+static CYTHON_INLINE void __Pyx_copy_object_array(PyObject** CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) {
+    PyObject *v;
+    Py_ssize_t i;
+    for (i = 0; i < length; i++) {
+        v = dest[i] = src[i];
+        Py_INCREF(v);
+    }
+}
+static CYTHON_INLINE PyObject* __Pyx_PyList_GetSlice(
+            PyObject* src, Py_ssize_t start, Py_ssize_t stop) {
+    PyObject* dest;
+    Py_ssize_t length = PyList_GET_SIZE(src);
+    __Pyx_crop_slice(&start, &stop, &length);
+    if (unlikely(length <= 0))
+        return PyList_New(0);
+    dest = PyList_New(length);
+    if (unlikely(!dest))
+        return NULL;
+    __Pyx_copy_object_array(
+        ((PyListObject*)src)->ob_item + start,
+        ((PyListObject*)dest)->ob_item,
+        length);
+    return dest;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyTuple_GetSlice(
+            PyObject* src, Py_ssize_t start, Py_ssize_t stop) {
+    PyObject* dest;
+    Py_ssize_t length = PyTuple_GET_SIZE(src);
+    __Pyx_crop_slice(&start, &stop, &length);
+    if (unlikely(length <= 0))
+        return PyTuple_New(0);
+    dest = PyTuple_New(length);
+    if (unlikely(!dest))
+        return NULL;
+    __Pyx_copy_object_array(
+        ((PyTupleObject*)src)->ob_item + start,
+        ((PyTupleObject*)dest)->ob_item,
+        length);
+    return dest;
 }
 #endif
 
+static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
+    int q = a / b;
+    int r = a - q*b;
+    q -= ((r != 0) & ((r ^ b) < 0));
+    return q;
+}
+
 static CYTHON_INLINE int __Pyx_IterFinish(void) {
 #if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
@@ -15520,175 +27458,18 @@ static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t ori
             return __Pyx_IterFinish();
         }
     }
-    if (pitem) {
-        *pitem = next_item;
-    } else if (pkey && pvalue) {
-        if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1))
-            return -1;
-    } else if (pkey) {
-        *pkey = next_item;
-    } else {
-        *pvalue = next_item;
-    }
-    return 1;
-}
-
-#if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
-                        CYTHON_UNUSED PyObject *cause) {
-    Py_XINCREF(type);
-    if (!value || value == Py_None)
-        value = NULL;
-    else
-        Py_INCREF(value);
-    if (!tb || tb == Py_None)
-        tb = NULL;
-    else {
-        Py_INCREF(tb);
-        if (!PyTraceBack_Check(tb)) {
-            PyErr_SetString(PyExc_TypeError,
-                "raise: arg 3 must be a traceback or None");
-            goto raise_error;
-        }
-    }
-    if (PyType_Check(type)) {
-#if CYTHON_COMPILING_IN_PYPY
-        if (!value) {
-            Py_INCREF(Py_None);
-            value = Py_None;
-        }
-#endif
-        PyErr_NormalizeException(&type, &value, &tb);
-    } else {
-        if (value) {
-            PyErr_SetString(PyExc_TypeError,
-                "instance exception may not have a separate value");
-            goto raise_error;
-        }
-        value = type;
-        type = (PyObject*) Py_TYPE(type);
-        Py_INCREF(type);
-        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
-            PyErr_SetString(PyExc_TypeError,
-                "raise: exception class must be a subclass of BaseException");
-            goto raise_error;
-        }
-    }
-    __Pyx_ErrRestore(type, value, tb);
-    return;
-raise_error:
-    Py_XDECREF(value);
-    Py_XDECREF(type);
-    Py_XDECREF(tb);
-    return;
-}
-#else
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
-    PyObject* owned_instance = NULL;
-    if (tb == Py_None) {
-        tb = 0;
-    } else if (tb && !PyTraceBack_Check(tb)) {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: arg 3 must be a traceback or None");
-        goto bad;
-    }
-    if (value == Py_None)
-        value = 0;
-    if (PyExceptionInstance_Check(type)) {
-        if (value) {
-            PyErr_SetString(PyExc_TypeError,
-                "instance exception may not have a separate value");
-            goto bad;
-        }
-        value = type;
-        type = (PyObject*) Py_TYPE(value);
-    } else if (PyExceptionClass_Check(type)) {
-        PyObject *instance_class = NULL;
-        if (value && PyExceptionInstance_Check(value)) {
-            instance_class = (PyObject*) Py_TYPE(value);
-            if (instance_class != type) {
-                if (PyObject_IsSubclass(instance_class, type)) {
-                    type = instance_class;
-                } else {
-                    instance_class = NULL;
-                }
-            }
-        }
-        if (!instance_class) {
-            PyObject *args;
-            if (!value)
-                args = PyTuple_New(0);
-            else if (PyTuple_Check(value)) {
-                Py_INCREF(value);
-                args = value;
-            } else
-                args = PyTuple_Pack(1, value);
-            if (!args)
-                goto bad;
-            owned_instance = PyObject_Call(type, args, NULL);
-            Py_DECREF(args);
-            if (!owned_instance)
-                goto bad;
-            value = owned_instance;
-            if (!PyExceptionInstance_Check(value)) {
-                PyErr_Format(PyExc_TypeError,
-                             "calling %R should have returned an instance of "
-                             "BaseException, not %R",
-                             type, Py_TYPE(value));
-                goto bad;
-            }
-        }
-    } else {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: exception class must be a subclass of BaseException");
-        goto bad;
-    }
-#if PY_VERSION_HEX >= 0x03030000
-    if (cause) {
-#else
-    if (cause && cause != Py_None) {
-#endif
-        PyObject *fixed_cause;
-        if (cause == Py_None) {
-            fixed_cause = NULL;
-        } else if (PyExceptionClass_Check(cause)) {
-            fixed_cause = PyObject_CallObject(cause, NULL);
-            if (fixed_cause == NULL)
-                goto bad;
-        } else if (PyExceptionInstance_Check(cause)) {
-            fixed_cause = cause;
-            Py_INCREF(fixed_cause);
-        } else {
-            PyErr_SetString(PyExc_TypeError,
-                            "exception causes must derive from "
-                            "BaseException");
-            goto bad;
-        }
-        PyException_SetCause(value, fixed_cause);
-    }
-    PyErr_SetObject(type, value);
-    if (tb) {
-#if CYTHON_COMPILING_IN_PYPY
-        PyObject *tmp_type, *tmp_value, *tmp_tb;
-        PyErr_Fetch(tmp_type, tmp_value, tmp_tb);
-        Py_INCREF(tb);
-        PyErr_Restore(tmp_type, tmp_value, tb);
-        Py_XDECREF(tmp_tb);
-#else
-        PyThreadState *tstate = PyThreadState_GET();
-        PyObject* tmp_tb = tstate->curexc_traceback;
-        if (tb != tmp_tb) {
-            Py_INCREF(tb);
-            tstate->curexc_traceback = tb;
-            Py_XDECREF(tmp_tb);
-        }
-#endif
-    }
-bad:
-    Py_XDECREF(owned_instance);
-    return;
+    if (pitem) {
+        *pitem = next_item;
+    } else if (pkey && pvalue) {
+        if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1))
+            return -1;
+    } else if (pkey) {
+        *pkey = next_item;
+    } else {
+        *pvalue = next_item;
+    }
+    return 1;
 }
-#endif
 
 static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
 #if PY_VERSION_HEX >= 0x02070000
@@ -15970,30 +27751,77 @@ bad:
     Py_XDECREF(py_frame);
 }
 
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
-    const int neg_one = (int) -1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (is_unsigned) {
-        if (sizeof(int) < sizeof(long)) {
-            return PyInt_FromLong((long) value);
-        } else if (sizeof(int) <= sizeof(unsigned long)) {
-            return PyLong_FromUnsignedLong((unsigned long) value);
-        } else if (sizeof(int) <= sizeof(unsigned long long)) {
-            return PyLong_FromUnsignedLongLong((unsigned long long) value);
-        }
-    } else {
-        if (sizeof(int) <= sizeof(long)) {
-            return PyInt_FromLong((long) value);
-        } else if (sizeof(int) <= sizeof(long long)) {
-            return PyLong_FromLongLong((long long) value);
-        }
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
+    PyObject *empty_list = 0;
+    PyObject *module = 0;
+    PyObject *global_dict = 0;
+    PyObject *empty_dict = 0;
+    PyObject *list;
+    #if PY_VERSION_HEX < 0x03030000
+    PyObject *py_import;
+    py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
+    if (!py_import)
+        goto bad;
+    #endif
+    if (from_list)
+        list = from_list;
+    else {
+        empty_list = PyList_New(0);
+        if (!empty_list)
+            goto bad;
+        list = empty_list;
     }
+    global_dict = PyModule_GetDict(__pyx_m);
+    if (!global_dict)
+        goto bad;
+    empty_dict = PyDict_New();
+    if (!empty_dict)
+        goto bad;
     {
-        int one = 1; int little = (int)*(unsigned char *)&one;
-        unsigned char *bytes = (unsigned char *)&value;
-        return _PyLong_FromByteArray(bytes, sizeof(int),
-                                     little, !is_unsigned);
+        #if PY_MAJOR_VERSION >= 3
+        if (level == -1) {
+            if (strchr(__Pyx_MODULE_NAME, '.')) {
+                #if PY_VERSION_HEX < 0x03030000
+                PyObject *py_level = PyInt_FromLong(1);
+                if (!py_level)
+                    goto bad;
+                module = PyObject_CallFunctionObjArgs(py_import,
+                    name, global_dict, empty_dict, list, py_level, NULL);
+                Py_DECREF(py_level);
+                #else
+                module = PyImport_ImportModuleLevelObject(
+                    name, global_dict, empty_dict, list, 1);
+                #endif
+                if (!module) {
+                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
+                        goto bad;
+                    PyErr_Clear();
+                }
+            }
+            level = 0;
+        }
+        #endif
+        if (!module) {
+            #if PY_VERSION_HEX < 0x03030000
+            PyObject *py_level = PyInt_FromLong(level);
+            if (!py_level)
+                goto bad;
+            module = PyObject_CallFunctionObjArgs(py_import,
+                name, global_dict, empty_dict, list, py_level, NULL);
+            Py_DECREF(py_level);
+            #else
+            module = PyImport_ImportModuleLevelObject(
+                name, global_dict, empty_dict, list, level);
+            #endif
+        }
     }
+bad:
+    #if PY_VERSION_HEX < 0x03030000
+    Py_XDECREF(py_import);
+    #endif
+    Py_XDECREF(empty_list);
+    Py_XDECREF(empty_dict);
+    return module;
 }
 
 #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)       \
@@ -16017,19 +27845,19 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
  #endif
 #endif
 
-static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
-    const int neg_one = (int) -1, const_zero = 0;
+static CYTHON_INLINE int64_t __Pyx_PyInt_As_int64_t(PyObject *x) {
+    const int64_t neg_one = (int64_t) -1, const_zero = 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        if (sizeof(int) < sizeof(long)) {
-            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
+        if (sizeof(int64_t) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(int64_t, long, PyInt_AS_LONG(x))
         } else {
             long val = PyInt_AS_LONG(x);
             if (is_unsigned && unlikely(val < 0)) {
                 goto raise_neg_overflow;
             }
-            return (int) val;
+            return (int64_t) val;
         }
     } else
 #endif
@@ -16039,32 +27867,32 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
  #if CYTHON_USE_PYLONG_INTERNALS
             switch (Py_SIZE(x)) {
                 case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(int, digit, ((PyLongObject*)x)->ob_digit[0]);
+                case  1: __PYX_VERIFY_RETURN_INT(int64_t, digit, ((PyLongObject*)x)->ob_digit[0]);
             }
  #endif
 #endif
             if (unlikely(Py_SIZE(x) < 0)) {
                 goto raise_neg_overflow;
             }
-            if (sizeof(int) <= sizeof(unsigned long)) {
-                __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong(x))
-            } else if (sizeof(int) <= sizeof(unsigned long long)) {
-                __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong(x))
+            if (sizeof(int64_t) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT(int64_t, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(int64_t) <= sizeof(unsigned long long)) {
+                __PYX_VERIFY_RETURN_INT(int64_t, unsigned long long, PyLong_AsUnsignedLongLong(x))
             }
         } else {
 #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
  #if CYTHON_USE_PYLONG_INTERNALS
             switch (Py_SIZE(x)) {
                 case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +(((PyLongObject*)x)->ob_digit[0]));
-                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
+                case  1: __PYX_VERIFY_RETURN_INT(int64_t,  digit, +(((PyLongObject*)x)->ob_digit[0]));
+                case -1: __PYX_VERIFY_RETURN_INT(int64_t, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
             }
  #endif
 #endif
-            if (sizeof(int) <= sizeof(long)) {
-                __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong(x))
-            } else if (sizeof(int) <= sizeof(long long)) {
-                __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong(x))
+            if (sizeof(int64_t) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT(int64_t, long, PyLong_AsLong(x))
+            } else if (sizeof(int64_t) <= sizeof(long long)) {
+                __PYX_VERIFY_RETURN_INT(int64_t, long long, PyLong_AsLongLong(x))
             }
         }
         {
@@ -16072,7 +27900,7 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
             PyErr_SetString(PyExc_RuntimeError,
                             "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
 #else
-            int val;
+            int64_t val;
             PyObject *v = __Pyx_PyNumber_Int(x);
  #if PY_MAJOR_VERSION < 3
             if (likely(v) && !PyLong_Check(v)) {
@@ -16092,112 +27920,39 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
                     return val;
             }
 #endif
-            return (int) -1;
+            return (int64_t) -1;
         }
     } else {
-        int val;
+        int64_t val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (int) -1;
-        val = __Pyx_PyInt_As_int(tmp);
+        if (!tmp) return (int64_t) -1;
+        val = __Pyx_PyInt_As_int64_t(tmp);
         Py_DECREF(tmp);
         return val;
     }
 raise_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "value too large to convert to int");
-    return (int) -1;
+        "value too large to convert to int64_t");
+    return (int64_t) -1;
 raise_neg_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "can't convert negative value to int");
-    return (int) -1;
-}
-
-static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
-    PyObject *empty_list = 0;
-    PyObject *module = 0;
-    PyObject *global_dict = 0;
-    PyObject *empty_dict = 0;
-    PyObject *list;
-    #if PY_VERSION_HEX < 0x03030000
-    PyObject *py_import;
-    py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
-    if (!py_import)
-        goto bad;
-    #endif
-    if (from_list)
-        list = from_list;
-    else {
-        empty_list = PyList_New(0);
-        if (!empty_list)
-            goto bad;
-        list = empty_list;
-    }
-    global_dict = PyModule_GetDict(__pyx_m);
-    if (!global_dict)
-        goto bad;
-    empty_dict = PyDict_New();
-    if (!empty_dict)
-        goto bad;
-    {
-        #if PY_MAJOR_VERSION >= 3
-        if (level == -1) {
-            if (strchr(__Pyx_MODULE_NAME, '.')) {
-                #if PY_VERSION_HEX < 0x03030000
-                PyObject *py_level = PyInt_FromLong(1);
-                if (!py_level)
-                    goto bad;
-                module = PyObject_CallFunctionObjArgs(py_import,
-                    name, global_dict, empty_dict, list, py_level, NULL);
-                Py_DECREF(py_level);
-                #else
-                module = PyImport_ImportModuleLevelObject(
-                    name, global_dict, empty_dict, list, 1);
-                #endif
-                if (!module) {
-                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
-                        goto bad;
-                    PyErr_Clear();
-                }
-            }
-            level = 0;
-        }
-        #endif
-        if (!module) {
-            #if PY_VERSION_HEX < 0x03030000
-            PyObject *py_level = PyInt_FromLong(level);
-            if (!py_level)
-                goto bad;
-            module = PyObject_CallFunctionObjArgs(py_import,
-                name, global_dict, empty_dict, list, py_level, NULL);
-            Py_DECREF(py_level);
-            #else
-            module = PyImport_ImportModuleLevelObject(
-                name, global_dict, empty_dict, list, level);
-            #endif
-        }
-    }
-bad:
-    #if PY_VERSION_HEX < 0x03030000
-    Py_XDECREF(py_import);
-    #endif
-    Py_XDECREF(empty_list);
-    Py_XDECREF(empty_dict);
-    return module;
+        "can't convert negative value to int64_t");
+    return (int64_t) -1;
 }
 
-static CYTHON_INLINE int64_t __Pyx_PyInt_As_int64_t(PyObject *x) {
-    const int64_t neg_one = (int64_t) -1, const_zero = 0;
+static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
+    const uint64_t neg_one = (uint64_t) -1, const_zero = 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        if (sizeof(int64_t) < sizeof(long)) {
-            __PYX_VERIFY_RETURN_INT(int64_t, long, PyInt_AS_LONG(x))
+        if (sizeof(uint64_t) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(uint64_t, long, PyInt_AS_LONG(x))
         } else {
             long val = PyInt_AS_LONG(x);
             if (is_unsigned && unlikely(val < 0)) {
                 goto raise_neg_overflow;
             }
-            return (int64_t) val;
+            return (uint64_t) val;
         }
     } else
 #endif
@@ -16207,32 +27962,32 @@ static CYTHON_INLINE int64_t __Pyx_PyInt_As_int64_t(PyObject *x) {
  #if CYTHON_USE_PYLONG_INTERNALS
             switch (Py_SIZE(x)) {
                 case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(int64_t, digit, ((PyLongObject*)x)->ob_digit[0]);
+                case  1: __PYX_VERIFY_RETURN_INT(uint64_t, digit, ((PyLongObject*)x)->ob_digit[0]);
             }
  #endif
 #endif
             if (unlikely(Py_SIZE(x) < 0)) {
                 goto raise_neg_overflow;
             }
-            if (sizeof(int64_t) <= sizeof(unsigned long)) {
-                __PYX_VERIFY_RETURN_INT(int64_t, unsigned long, PyLong_AsUnsignedLong(x))
-            } else if (sizeof(int64_t) <= sizeof(unsigned long long)) {
-                __PYX_VERIFY_RETURN_INT(int64_t, unsigned long long, PyLong_AsUnsignedLongLong(x))
+            if (sizeof(uint64_t) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(uint64_t) <= sizeof(unsigned long long)) {
+                __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long long, PyLong_AsUnsignedLongLong(x))
             }
         } else {
 #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
  #if CYTHON_USE_PYLONG_INTERNALS
             switch (Py_SIZE(x)) {
                 case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(int64_t,  digit, +(((PyLongObject*)x)->ob_digit[0]));
-                case -1: __PYX_VERIFY_RETURN_INT(int64_t, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
+                case  1: __PYX_VERIFY_RETURN_INT(uint64_t,  digit, +(((PyLongObject*)x)->ob_digit[0]));
+                case -1: __PYX_VERIFY_RETURN_INT(uint64_t, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
             }
  #endif
 #endif
-            if (sizeof(int64_t) <= sizeof(long)) {
-                __PYX_VERIFY_RETURN_INT(int64_t, long, PyLong_AsLong(x))
-            } else if (sizeof(int64_t) <= sizeof(long long)) {
-                __PYX_VERIFY_RETURN_INT(int64_t, long long, PyLong_AsLongLong(x))
+            if (sizeof(uint64_t) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT(uint64_t, long, PyLong_AsLong(x))
+            } else if (sizeof(uint64_t) <= sizeof(long long)) {
+                __PYX_VERIFY_RETURN_INT(uint64_t, long long, PyLong_AsLongLong(x))
             }
         }
         {
@@ -16240,7 +27995,7 @@ static CYTHON_INLINE int64_t __Pyx_PyInt_As_int64_t(PyObject *x) {
             PyErr_SetString(PyExc_RuntimeError,
                             "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
 #else
-            int64_t val;
+            uint64_t val;
             PyObject *v = __Pyx_PyNumber_Int(x);
  #if PY_MAJOR_VERSION < 3
             if (likely(v) && !PyLong_Check(v)) {
@@ -16260,39 +28015,39 @@ static CYTHON_INLINE int64_t __Pyx_PyInt_As_int64_t(PyObject *x) {
                     return val;
             }
 #endif
-            return (int64_t) -1;
+            return (uint64_t) -1;
         }
     } else {
-        int64_t val;
+        uint64_t val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (int64_t) -1;
-        val = __Pyx_PyInt_As_int64_t(tmp);
+        if (!tmp) return (uint64_t) -1;
+        val = __Pyx_PyInt_As_uint64_t(tmp);
         Py_DECREF(tmp);
         return val;
     }
 raise_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "value too large to convert to int64_t");
-    return (int64_t) -1;
+        "value too large to convert to uint64_t");
+    return (uint64_t) -1;
 raise_neg_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "can't convert negative value to int64_t");
-    return (int64_t) -1;
+        "can't convert negative value to uint64_t");
+    return (uint64_t) -1;
 }
 
-static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
-    const uint64_t neg_one = (uint64_t) -1, const_zero = 0;
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
+    const int neg_one = (int) -1, const_zero = 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        if (sizeof(uint64_t) < sizeof(long)) {
-            __PYX_VERIFY_RETURN_INT(uint64_t, long, PyInt_AS_LONG(x))
+        if (sizeof(int) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
         } else {
             long val = PyInt_AS_LONG(x);
             if (is_unsigned && unlikely(val < 0)) {
                 goto raise_neg_overflow;
             }
-            return (uint64_t) val;
+            return (int) val;
         }
     } else
 #endif
@@ -16302,32 +28057,32 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
  #if CYTHON_USE_PYLONG_INTERNALS
             switch (Py_SIZE(x)) {
                 case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(uint64_t, digit, ((PyLongObject*)x)->ob_digit[0]);
+                case  1: __PYX_VERIFY_RETURN_INT(int, digit, ((PyLongObject*)x)->ob_digit[0]);
             }
  #endif
 #endif
             if (unlikely(Py_SIZE(x) < 0)) {
                 goto raise_neg_overflow;
             }
-            if (sizeof(uint64_t) <= sizeof(unsigned long)) {
-                __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, PyLong_AsUnsignedLong(x))
-            } else if (sizeof(uint64_t) <= sizeof(unsigned long long)) {
-                __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long long, PyLong_AsUnsignedLongLong(x))
+            if (sizeof(int) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(int) <= sizeof(unsigned long long)) {
+                __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong(x))
             }
         } else {
 #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
  #if CYTHON_USE_PYLONG_INTERNALS
             switch (Py_SIZE(x)) {
                 case  0: return 0;
-                case  1: __PYX_VERIFY_RETURN_INT(uint64_t,  digit, +(((PyLongObject*)x)->ob_digit[0]));
-                case -1: __PYX_VERIFY_RETURN_INT(uint64_t, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
+                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +(((PyLongObject*)x)->ob_digit[0]));
+                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
             }
  #endif
 #endif
-            if (sizeof(uint64_t) <= sizeof(long)) {
-                __PYX_VERIFY_RETURN_INT(uint64_t, long, PyLong_AsLong(x))
-            } else if (sizeof(uint64_t) <= sizeof(long long)) {
-                __PYX_VERIFY_RETURN_INT(uint64_t, long long, PyLong_AsLongLong(x))
+            if (sizeof(int) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong(x))
+            } else if (sizeof(int) <= sizeof(long long)) {
+                __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong(x))
             }
         }
         {
@@ -16335,7 +28090,7 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
             PyErr_SetString(PyExc_RuntimeError,
                             "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
 #else
-            uint64_t val;
+            int val;
             PyObject *v = __Pyx_PyNumber_Int(x);
  #if PY_MAJOR_VERSION < 3
             if (likely(v) && !PyLong_Check(v)) {
@@ -16355,24 +28110,24 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
                     return val;
             }
 #endif
-            return (uint64_t) -1;
+            return (int) -1;
         }
     } else {
-        uint64_t val;
+        int val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (uint64_t) -1;
-        val = __Pyx_PyInt_As_uint64_t(tmp);
+        if (!tmp) return (int) -1;
+        val = __Pyx_PyInt_As_int(tmp);
         Py_DECREF(tmp);
         return val;
     }
 raise_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "value too large to convert to uint64_t");
-    return (uint64_t) -1;
+        "value too large to convert to int");
+    return (int) -1;
 raise_neg_overflow:
     PyErr_SetString(PyExc_OverflowError,
-        "can't convert negative value to uint64_t");
-    return (uint64_t) -1;
+        "can't convert negative value to int");
+    return (int) -1;
 }
 
 static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
@@ -16470,6 +28225,32 @@ raise_neg_overflow:
     return (long) -1;
 }
 
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
+    const int neg_one = (int) -1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(int) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(int) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(int) <= sizeof(unsigned long long)) {
+            return PyLong_FromUnsignedLongLong((unsigned long long) value);
+        }
+    } else {
+        if (sizeof(int) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(int) <= sizeof(long long)) {
+            return PyLong_FromLongLong((long long) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(int),
+                                     little, !is_unsigned);
+    }
+}
+
 static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int64_t(int64_t value) {
     const int64_t neg_one = (int64_t) -1, const_zero = 0;
     const int is_unsigned = neg_one > const_zero;
@@ -16955,6 +28736,608 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_long(unsigned long valu
     #endif
 #endif
 
+static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
+    PyObject* fake_module;
+    PyTypeObject* cached_type = NULL;
+    fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI);
+    if (!fake_module) return NULL;
+    Py_INCREF(fake_module);
+    cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name);
+    if (cached_type) {
+        if (!PyType_Check((PyObject*)cached_type)) {
+            PyErr_Format(PyExc_TypeError,
+                "Shared Cython type %.200s is not a type object",
+                type->tp_name);
+            goto bad;
+        }
+        if (cached_type->tp_basicsize != type->tp_basicsize) {
+            PyErr_Format(PyExc_TypeError,
+                "Shared Cython type %.200s has the wrong size, try recompiling",
+                type->tp_name);
+            goto bad;
+        }
+    } else {
+        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
+        PyErr_Clear();
+        if (PyType_Ready(type) < 0) goto bad;
+        if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0)
+            goto bad;
+        Py_INCREF(type);
+        cached_type = type;
+    }
+done:
+    Py_DECREF(fake_module);
+    return cached_type;
+bad:
+    Py_XDECREF(cached_type);
+    cached_type = NULL;
+    goto done;
+}
+
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyThreadState *tstate = PyThreadState_GET();
+    tmp_type = tstate->exc_type;
+    tmp_value = tstate->exc_value;
+    tmp_tb = tstate->exc_traceback;
+    tstate->exc_type = *type;
+    tstate->exc_value = *value;
+    tstate->exc_traceback = *tb;
+#else
+    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
+    PyErr_SetExcInfo(*type, *value, *tb);
+#endif
+    *type = tmp_type;
+    *value = tmp_value;
+    *tb = tmp_tb;
+}
+
+static PyObject *__Pyx_Generator_Next(PyObject *self);
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
+static PyObject *__Pyx_Generator_Close(PyObject *self);
+static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args);
+static PyTypeObject *__pyx_GeneratorType = 0;
+#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
+#define __Pyx_Generator_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
+    PyObject *et, *ev, *tb;
+    PyObject *value = NULL;
+    __Pyx_ErrFetch(&et, &ev, &tb);
+    if (!et) {
+        Py_XDECREF(tb);
+        Py_XDECREF(ev);
+        Py_INCREF(Py_None);
+        *pvalue = Py_None;
+        return 0;
+    }
+    if (unlikely(et != PyExc_StopIteration) &&
+            unlikely(!PyErr_GivenExceptionMatches(et, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    if (likely(et == PyExc_StopIteration)) {
+        if (likely(!ev) || !PyObject_IsInstance(ev, PyExc_StopIteration)) {
+            if (!ev) {
+                Py_INCREF(Py_None);
+                ev = Py_None;
+            }
+            Py_XDECREF(tb);
+            Py_DECREF(et);
+            *pvalue = ev;
+            return 0;
+        }
+    }
+    PyErr_NormalizeException(&et, &ev, &tb);
+    if (unlikely(!PyObject_IsInstance(ev, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    Py_XDECREF(tb);
+    Py_DECREF(et);
+#if PY_VERSION_HEX >= 0x030300A0
+    value = ((PyStopIterationObject *)ev)->value;
+    Py_INCREF(value);
+    Py_DECREF(ev);
+#else
+    {
+        PyObject* args = PyObject_GetAttr(ev, __pyx_n_s_args);
+        Py_DECREF(ev);
+        if (likely(args)) {
+            value = PyObject_GetItem(args, 0);
+            Py_DECREF(args);
+        }
+        if (unlikely(!value)) {
+            __Pyx_ErrRestore(NULL, NULL, NULL);
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+    }
+#endif
+    *pvalue = value;
+    return 0;
+}
+#endif
+static CYTHON_INLINE
+void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
+    PyObject *exc_type = self->exc_type;
+    PyObject *exc_value = self->exc_value;
+    PyObject *exc_traceback = self->exc_traceback;
+    self->exc_type = NULL;
+    self->exc_value = NULL;
+    self->exc_traceback = NULL;
+    Py_XDECREF(exc_type);
+    Py_XDECREF(exc_value);
+    Py_XDECREF(exc_traceback);
+}
+static CYTHON_INLINE
+int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
+    if (unlikely(gen->is_running)) {
+        PyErr_SetString(PyExc_ValueError,
+                        "generator already executing");
+        return 1;
+    }
+    return 0;
+}
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
+    PyObject *retval;
+    assert(!self->is_running);
+    if (unlikely(self->resume_label == 0)) {
+        if (unlikely(value && value != Py_None)) {
+            PyErr_SetString(PyExc_TypeError,
+                            "can't send non-None value to a "
+                            "just-started generator");
+            return NULL;
+        }
+    }
+    if (unlikely(self->resume_label == -1)) {
+        PyErr_SetNone(PyExc_StopIteration);
+        return NULL;
+    }
+    if (value) {
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        if (self->exc_traceback) {
+            PyThreadState *tstate = PyThreadState_GET();
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_XINCREF(tstate->frame);
+            assert(f->f_back == NULL);
+            f->f_back = tstate->frame;
+        }
+#endif
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+    } else {
+        __Pyx_Generator_ExceptionClear(self);
+    }
+    self->is_running = 1;
+    retval = self->body((PyObject *) self, value);
+    self->is_running = 0;
+    if (retval) {
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        if (self->exc_traceback) {
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_CLEAR(f->f_back);
+        }
+#endif
+    } else {
+        __Pyx_Generator_ExceptionClear(self);
+    }
+    return retval;
+}
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_FinishDelegation(__pyx_GeneratorObject *gen) {
+    PyObject *ret;
+    PyObject *val = NULL;
+    __Pyx_Generator_Undelegate(gen);
+    __Pyx_PyGen_FetchStopIterationValue(&val);
+    ret = __Pyx_Generator_SendEx(gen, val);
+    Py_XDECREF(val);
+    return ret;
+}
+static PyObject *__Pyx_Generator_Next(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        ret = Py_TYPE(yf)->tp_iternext(yf);
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, Py_None);
+}
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Send(yf, value);
+        } else {
+            if (value == Py_None)
+                ret = PyIter_Next(yf);
+            else
+                ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value);
+        }
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, value);
+}
+static int __Pyx_Generator_CloseIter(__pyx_GeneratorObject *gen, PyObject *yf) {
+    PyObject *retval = NULL;
+    int err = 0;
+    if (__Pyx_Generator_CheckExact(yf)) {
+        retval = __Pyx_Generator_Close(yf);
+        if (!retval)
+            return -1;
+    } else {
+        PyObject *meth;
+        gen->is_running = 1;
+        meth = PyObject_GetAttr(yf, __pyx_n_s_close);
+        if (unlikely(!meth)) {
+            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                PyErr_WriteUnraisable(yf);
+            }
+            PyErr_Clear();
+        } else {
+            retval = PyObject_CallFunction(meth, NULL);
+            Py_DECREF(meth);
+            if (!retval)
+                err = -1;
+        }
+        gen->is_running = 0;
+    }
+    Py_XDECREF(retval);
+    return err;
+}
+static PyObject *__Pyx_Generator_Close(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject *retval, *raised_exception;
+    PyObject *yf = gen->yieldfrom;
+    int err = 0;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        Py_INCREF(yf);
+        err = __Pyx_Generator_CloseIter(gen, yf);
+        __Pyx_Generator_Undelegate(gen);
+        Py_DECREF(yf);
+    }
+    if (err == 0)
+        PyErr_SetNone(PyExc_GeneratorExit);
+    retval = __Pyx_Generator_SendEx(gen, NULL);
+    if (retval) {
+        Py_DECREF(retval);
+        PyErr_SetString(PyExc_RuntimeError,
+                        "generator ignored GeneratorExit");
+        return NULL;
+    }
+    raised_exception = PyErr_Occurred();
+    if (!raised_exception
+        || raised_exception == PyExc_StopIteration
+        || raised_exception == PyExc_GeneratorExit
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
+    {
+        if (raised_exception) PyErr_Clear();
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+    return NULL;
+}
+static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject *typ;
+    PyObject *tb = NULL;
+    PyObject *val = NULL;
+    PyObject *yf = gen->yieldfrom;
+    if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
+        return NULL;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        Py_INCREF(yf);
+        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
+            int err = __Pyx_Generator_CloseIter(gen, yf);
+            Py_DECREF(yf);
+            __Pyx_Generator_Undelegate(gen);
+            if (err < 0)
+                return __Pyx_Generator_SendEx(gen, NULL);
+            goto throw_here;
+        }
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Throw(yf, args);
+        } else {
+            PyObject *meth = PyObject_GetAttr(yf, __pyx_n_s_throw);
+            if (unlikely(!meth)) {
+                Py_DECREF(yf);
+                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                    gen->is_running = 0;
+                    return NULL;
+                }
+                PyErr_Clear();
+                __Pyx_Generator_Undelegate(gen);
+                gen->is_running = 0;
+                goto throw_here;
+            }
+            ret = PyObject_CallObject(meth, args);
+            Py_DECREF(meth);
+        }
+        gen->is_running = 0;
+        Py_DECREF(yf);
+        if (!ret) {
+            ret = __Pyx_Generator_FinishDelegation(gen);
+        }
+        return ret;
+    }
+throw_here:
+    __Pyx_Raise(typ, val, tb, NULL);
+    return __Pyx_Generator_SendEx(gen, NULL);
+}
+static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_VISIT(gen->closure);
+    Py_VISIT(gen->classobj);
+    Py_VISIT(gen->yieldfrom);
+    Py_VISIT(gen->exc_type);
+    Py_VISIT(gen->exc_value);
+    Py_VISIT(gen->exc_traceback);
+    return 0;
+}
+static int __Pyx_Generator_clear(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_CLEAR(gen->closure);
+    Py_CLEAR(gen->classobj);
+    Py_CLEAR(gen->yieldfrom);
+    Py_CLEAR(gen->exc_type);
+    Py_CLEAR(gen->exc_value);
+    Py_CLEAR(gen->exc_traceback);
+    Py_CLEAR(gen->gi_name);
+    Py_CLEAR(gen->gi_qualname);
+    return 0;
+}
+static void __Pyx_Generator_dealloc(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject_GC_UnTrack(gen);
+    if (gen->gi_weakreflist != NULL)
+        PyObject_ClearWeakRefs(self);
+    if (gen->resume_label > 0) {
+        PyObject_GC_Track(self);
+#if PY_VERSION_HEX >= 0x030400a1
+        if (PyObject_CallFinalizerFromDealloc(self))
+#else
+        Py_TYPE(gen)->tp_del(self);
+        if (self->ob_refcnt > 0)
+#endif
+        {
+            return;
+        }
+        PyObject_GC_UnTrack(self);
+    }
+    __Pyx_Generator_clear(self);
+    PyObject_GC_Del(gen);
+}
+static void __Pyx_Generator_del(PyObject *self) {
+    PyObject *res;
+    PyObject *error_type, *error_value, *error_traceback;
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    if (gen->resume_label <= 0)
+        return ;
+#if PY_VERSION_HEX < 0x030400a1
+    assert(self->ob_refcnt == 0);
+    self->ob_refcnt = 1;
+#endif
+    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
+    res = __Pyx_Generator_Close(self);
+    if (res == NULL)
+        PyErr_WriteUnraisable(self);
+    else
+        Py_DECREF(res);
+    __Pyx_ErrRestore(error_type, error_value, error_traceback);
+#if PY_VERSION_HEX < 0x030400a1
+    assert(self->ob_refcnt > 0);
+    if (--self->ob_refcnt == 0) {
+        return;
+    }
+    {
+        Py_ssize_t refcnt = self->ob_refcnt;
+        _Py_NewReference(self);
+        self->ob_refcnt = refcnt;
+    }
+#if CYTHON_COMPILING_IN_CPYTHON
+    assert(PyType_IS_GC(self->ob_type) &&
+           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
+    _Py_DEC_REFTOTAL;
+#endif
+#ifdef COUNT_ALLOCS
+    --Py_TYPE(self)->tp_frees;
+    --Py_TYPE(self)->tp_allocs;
+#endif
+#endif
+}
+static PyObject *
+__Pyx_Generator_get_name(__pyx_GeneratorObject *self)
+{
+    Py_INCREF(self->gi_name);
+    return self->gi_name;
+}
+static int
+__Pyx_Generator_set_name(__pyx_GeneratorObject *self, PyObject *value)
+{
+    PyObject *tmp;
+#if PY_MAJOR_VERSION >= 3
+    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
+#else
+    if (unlikely(value == NULL || !PyString_Check(value))) {
+#endif
+        PyErr_SetString(PyExc_TypeError,
+                        "__name__ must be set to a string object");
+        return -1;
+    }
+    tmp = self->gi_name;
+    Py_INCREF(value);
+    self->gi_name = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_Generator_get_qualname(__pyx_GeneratorObject *self)
+{
+    Py_INCREF(self->gi_qualname);
+    return self->gi_qualname;
+}
+static int
+__Pyx_Generator_set_qualname(__pyx_GeneratorObject *self, PyObject *value)
+{
+    PyObject *tmp;
+#if PY_MAJOR_VERSION >= 3
+    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
+#else
+    if (unlikely(value == NULL || !PyString_Check(value))) {
+#endif
+        PyErr_SetString(PyExc_TypeError,
+                        "__qualname__ must be set to a string object");
+        return -1;
+    }
+    tmp = self->gi_qualname;
+    Py_INCREF(value);
+    self->gi_qualname = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyGetSetDef __pyx_Generator_getsets[] = {
+    {(char *) "__name__", (getter)__Pyx_Generator_get_name, (setter)__Pyx_Generator_set_name,
+     (char*) PyDoc_STR("name of the generator"), 0},
+    {(char *) "__qualname__", (getter)__Pyx_Generator_get_qualname, (setter)__Pyx_Generator_set_qualname,
+     (char*) PyDoc_STR("qualified name of the generator"), 0},
+    {0, 0, 0, 0, 0}
+};
+static PyMemberDef __pyx_Generator_memberlist[] = {
+    {(char *) "gi_running", T_BOOL, offsetof(__pyx_GeneratorObject, is_running), READONLY, NULL},
+    {0, 0, 0, 0, 0}
+};
+static PyMethodDef __pyx_Generator_methods[] = {
+    {"send", (PyCFunction) __Pyx_Generator_Send, METH_O, 0},
+    {"throw", (PyCFunction) __Pyx_Generator_Throw, METH_VARARGS, 0},
+    {"close", (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
+    {0, 0, 0, 0}
+};
+static PyTypeObject __pyx_GeneratorType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    "generator",
+    sizeof(__pyx_GeneratorObject),
+    0,
+    (destructor) __Pyx_Generator_dealloc,
+    0,
+    0,
+    0,
+#if PY_MAJOR_VERSION < 3
+    0,
+#else
+    0,
+#endif
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
+    0,
+    (traverseproc) __Pyx_Generator_traverse,
+    0,
+    0,
+    offsetof(__pyx_GeneratorObject, gi_weakreflist),
+    0,
+    (iternextfunc) __Pyx_Generator_Next,
+    __pyx_Generator_methods,
+    __pyx_Generator_memberlist,
+    __pyx_Generator_getsets,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030400a1
+    0,
+#else
+    __Pyx_Generator_del,
+#endif
+    0,
+#if PY_VERSION_HEX >= 0x030400a1
+    __Pyx_Generator_del,
+#endif
+};
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure, PyObject *name, PyObject *qualname) {
+    __pyx_GeneratorObject *gen =
+        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
+    if (gen == NULL)
+        return NULL;
+    gen->body = body;
+    gen->closure = closure;
+    Py_XINCREF(closure);
+    gen->is_running = 0;
+    gen->resume_label = 0;
+    gen->classobj = NULL;
+    gen->yieldfrom = NULL;
+    gen->exc_type = NULL;
+    gen->exc_value = NULL;
+    gen->exc_traceback = NULL;
+    gen->gi_weakreflist = NULL;
+    Py_XINCREF(qualname);
+    gen->gi_qualname = qualname;
+    Py_XINCREF(name);
+    gen->gi_name = name;
+    PyObject_GC_Track(gen);
+    return gen;
+}
+static int __pyx_Generator_init(void) {
+    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
+    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
+    __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
+    if (__pyx_GeneratorType == NULL) {
+        return -1;
+    }
+    return 0;
+}
+
 static int __Pyx_check_binary_version(void) {
     char ctversion[4], rtversion[4];
     PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
diff --git a/wrappers/numpy/adios_mpi.pyx b/wrappers/numpy/adios_mpi.pyx
index cc84963..519283c 100644
--- a/wrappers/numpy/adios_mpi.pyx
+++ b/wrappers/numpy/adios_mpi.pyx
@@ -1,12 +1,7 @@
-"""
- ADIOS is freely available under the terms of the BSD license described
- in the COPYING file in the top level directory of this source distribution.
+# -*- coding: utf-8 -*-
+"""ADIOS: ADIOS python module
 
- Copyright (c) 2008 - 2009.  UT-BATTELLE, LLC. All rights reserved.
-"""
-"""
- This is a cython file. To generate a CPP file, use the following command:
- $ cython --cplus adios.pyx
+.. moduleauthor:: Jong Choi <choij at ornl.gov>
 """
 
 import numpy as np
@@ -18,6 +13,15 @@ cimport mpi4py.MPI as MPI
 import cython
 cimport cython
 
+from libc.stdlib cimport malloc, free
+from cpython.string cimport PyString_AsString
+
+cdef char ** to_cstring_array(list_str):
+    cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
+    for i in xrange(len(list_str)):
+        ret[i] = PyString_AsString(list_str[i])
+    return ret
+
 ## ====================
 ## ADIOS Exported Functions
 ## ====================
@@ -42,6 +46,7 @@ cdef extern from "adios_types.h":
         adios_string
         adios_complex
         adios_double_complex
+        adios_string_array
 
     ctypedef enum ADIOS_BUFFER_ALLOC_WHEN:
         ADIOS_BUFFER_ALLOC_UNKNOWN
@@ -106,6 +111,13 @@ cdef extern from "adios.h":
                                      ADIOS_DATATYPES type,
                                      char * value,
                                      char * var)
+
+    cdef int adios_define_attribute_byvalue (int64_t group,
+                                             char * name,
+                                             char * path,
+                                             ADIOS_DATATYPES type,
+                                             int nelems,
+                                             void * values)
     
     cdef int adios_select_method (int64_t group,
                                   char * method,
@@ -149,12 +161,6 @@ cdef extern from "adios_selection.h":
 
 cdef extern from "adios_read.h":
     ctypedef enum ADIOS_READ_METHOD:
-        ADIOS_READ_METHOD_BP
-        ADIOS_READ_METHOD_BP_AGGREGATE
-        ADIOS_READ_METHOD_DATASPACES
-        ADIOS_READ_METHOD_DIMES
-        ADIOS_READ_METHOD_FLEXPATH
-        ADIOS_READ_METHOD_ICEE
         pass
 
     ctypedef enum ADIOS_LOCKMODE:
@@ -219,6 +225,13 @@ cdef extern from "adios_read.h":
                                        void * data)
     cdef int adios_perform_reads (const ADIOS_FILE *fp, int blocking)
 
+    cdef int adios_get_attr (ADIOS_FILE *fp,
+                             const char * attrname,
+                             ADIOS_DATATYPES  * type,
+                             int * size,
+                             void ** data)
+    
+    cdef char * adios_type_to_string (ADIOS_DATATYPES type)
 
 ## ====================
 ## ADIOS Enum (public)
@@ -240,6 +253,7 @@ class DATATYPE:
     string = 9
     complex = 10
     double_complex = 11
+    string_array = 12
 
 class FLAG:
     UNKNOWN = 0
@@ -250,7 +264,39 @@ class BUFFER_ALLOC_WHEN:
     UNKNOWN = 0
     NOW = 1
     LATER = 2
+
+class READ_METHOD:
+    BP            = 0 
+    BP_AGGREGATE  = 1
+    DATASPACES    = 3
+    DIMES         = 4
+    FLEXPATH      = 5
+    ICEE          = 6
+
+
+cpdef __parse_index(index, ndim):
+    # Fix index, handling ellipsis and incomplete slices.
+    if not isinstance(index, tuple):
+        index = (index,)
+
+    fixed = []
+    length = len(index)
     
+    for slice_ in index:
+        if slice_ is Ellipsis:
+            fixed.extend([slice(None)] * (ndim-length-len(fixed)+1))
+        elif isinstance(slice_, (int, long)):
+            fixed.append(slice(slice_, slice_+1, None))
+        else:
+            fixed.append(slice_)
+        length -= 1
+
+    index = tuple(fixed)
+    if len(index) < ndim:
+        index += (slice(None),) * (ndim-len(index))
+
+    return index
+
 ## ====================
 ## ADIOS Write API
 ## ====================
@@ -273,12 +319,15 @@ cpdef int64_t set_group_size(int64_t fd_p, uint64_t data_size):
     result = adios_group_size(fd_p, data_size, &total_size)
     return total_size
 
-cpdef int write (int64_t fd_p, char * name, np.ndarray val):
+cpdef int write (int64_t fd_p, char * name, val, dtype=None):
     cdef np.ndarray val_
-    if val.flags.contiguous:
-        val_ = val
+    if isinstance(val, (np.ndarray)):
+        if val.flags.contiguous:
+            val_ = val
+        else:
+            val_ = np.array(val, copy=True)
     else:
-        val_ = np.array(val, copy=True)
+        val_ = np.array(val, dtype=dtype)
 
     return adios_write (fd_p, name, <void *> val_.data)
 
@@ -291,6 +340,10 @@ cpdef int write_long (int64_t fd_p, char * name, long val):
 cpdef int write_float (int64_t fd_p, char * name, float val):
     return adios_write (fd_p, name, &val)
 
+cpdef int write_double (int64_t fd_p, char * name, double val):
+    return adios_write (fd_p, name, &val)
+
+
 cpdef int read(int64_t fd_p, char * name, np.ndarray val):
     assert val.flags.contiguous, 'Only contiguous arrays are supported.'
     print "Reading ... ", val.itemsize * val.size, "(bytes)"
@@ -326,13 +379,13 @@ cpdef int64_t declare_group(char * name,
 cpdef int define_var(int64_t group_id,
                      char * name,
                      char * path,
-                     int type,
+                     int atype,
                      char * dimensions = "",
                      char * global_dimensions = "",
                      char * local_offsets = ""):
     return adios_define_var(group_id,
                             name, path,
-                            <ADIOS_DATATYPES> type,
+                            <ADIOS_DATATYPES> atype,
                             dimensions,
                             global_dimensions,
                             local_offsets)
@@ -340,16 +393,59 @@ cpdef int define_var(int64_t group_id,
 cpdef int define_attribute (int64_t group,
                             char * name,
                             char * path,
-                            int type,
+                            int atype,
                             char * value,
                             char * var):
     return adios_define_attribute (group,
                                    name,
                                    path,
-                                   <ADIOS_DATATYPES> type,
+                                   <ADIOS_DATATYPES> atype,
                                    value,
                                    var)
 
+cpdef int define_attribute_byvalue (int64_t group,
+                                    char * name,
+                                    char * path,
+                                    val):
+    cdef np.ndarray val_
+    if isinstance(val, (np.ndarray)):
+        if val.flags.contiguous:
+            val_ = val
+        else:
+            val_ = np.array(val, copy=True)
+    else:
+        val_ = np.array(val)
+
+    atype = np2adiostype(val_.dtype)
+
+    cdef char * pt1
+    cdef char ** pt2
+    if (val_.dtype.char == 'S'):
+        if (val_.size == 1):
+            pt1 = PyString_AsString(val)
+            adios_define_attribute_byvalue (group,
+                                            name,
+                                            path,
+                                            DATATYPE.string,
+                                            1,
+                                            <void *> pt1)
+        else:
+            pt2 = to_cstring_array(val)
+            adios_define_attribute_byvalue (group,
+                                            name,
+                                            path,
+                                            DATATYPE.string_array,
+                                            len(val),
+                                            <void *> pt2)
+            free(pt2)
+    else:
+        adios_define_attribute_byvalue (group,
+                                        name,
+                                        path,
+                                        <ADIOS_DATATYPES> atype,
+                                        val_.size,
+                                        <void *> val_.data)
+
 cpdef int select_method (int64_t group,
                          char * method,
                          char * parameters = "",
@@ -364,34 +460,37 @@ cpdef int select_method (int64_t group,
 ## ADIOS Read API (V2)
 ## ====================
 
-cdef type adios2nptype(ADIOS_DATATYPES t):
-    cdef type ntype = None
+cpdef np.dtype adios2npdtype(ADIOS_DATATYPES t, int strlen = 1):
+    """ strlen apply only to string type """
+    cdef np.dtype ntype = None
     if t == adios_byte:
-        ntype = np.int8
+        ntype = np.dtype(np.int8)
     elif t == adios_short:
-        ntype = np.int16
+        ntype = np.dtype(np.int16)
     elif t == adios_integer:
-        ntype = np.int32
+        ntype = np.dtype(np.int32)
     elif t == adios_long:
-        ntype = np.int64
+        ntype = np.dtype(np.int64)
     elif t == adios_unsigned_byte:
-        ntype = np.uint8
+        ntype = np.dtype(np.uint8)
     elif t == adios_unsigned_short:
-        ntype = np.uint16
+        ntype = np.dtype(np.uint16)
     elif t == adios_unsigned_integer:
-        ntype = np.uint32
+        ntype = np.dtype(np.uint32)
     elif t == adios_unsigned_long:
-        ntype = np.uint64
+        ntype = np.dtype(np.uint64)
     elif t == adios_real:
-        ntype = np.float32
+        ntype = np.dtype(np.float32)
     elif t == adios_double:
-        ntype = np.float64
+        ntype = np.dtype(np.float64)
     elif t == adios_long_double:
-        ntype = np.float128
+        ntype = np.dtype(np.float128)
     elif t == adios_complex:
-        ntype = np.complex64
+        ntype = np.dtype(np.complex64)
     elif t == adios_double_complex:
-        ntype = np.complex128
+        ntype = np.dtype(np.complex128)
+    elif t == adios_string:
+        ntype = np.dtype((np.str_, strlen))
     else:
         ntype = None
 
@@ -412,32 +511,33 @@ cdef printfile(ADIOS_FILE * f):
 
 cdef printvar(ADIOS_VARINFO * v):
     print '%15s : %d' % ('varid', v.varid)
-    print '%15s : %s' % ('type', adios2nptype(v.type))
+    print '%15s : %s' % ('type', adios2npdtype(v.type))
     print '%15s : %d' % ('ndim', v.ndim)
     print '%15s : %s' % ('dims', [v.dims[i] for i in range(v.ndim)])
     print '%15s : %d' % ('nsteps', v.nsteps)
 
 cdef ADIOS_READ_METHOD str2adiosreadmethod(bytes name):
     if (name == "BP"):
-        method = ADIOS_READ_METHOD_BP
+        method = READ_METHOD.BP
     elif (name == "BP_AGGREGATE"):
-        method = ADIOS_READ_METHOD_BP_AGGREGATE
+        method = READ_METHOD.BP_AGGREGATE
     elif (name == "DATASPACES"):
-        method = ADIOS_READ_METHOD_DATASPACES
+        method = READ_METHOD.DATASPACES
     elif (name == "DIMES"):
-        method = ADIOS_READ_METHOD_DIMES
+        method = READ_METHOD.DIMES
     elif (name == "FLEXPATH"):
-        method = ADIOS_READ_METHOD_FLEXPATH
+        method = READ_METHOD.FLEXPATH
     elif (name == "ICEE"):
-        method = ADIOS_READ_METHOD_ICEE
+        method = READ_METHOD.ICEE
     else:
         print '[WARN] Invalid read method name:', name, '. Use default BP method'
-        method = ADIOS_READ_METHOD_BP
+        method = READ_METHOD.BP
         
     return method
 
-cpdef np2adiostype(type nptype):
-    """ Ignored: int_, intc, intp """
+cpdef np2adiostype(np.dtype nptype):
+    """ Convert Numpy.dtype to Adios Datatype
+    """
 
     cdef atype = DATATYPE.unknown
 
@@ -473,11 +573,16 @@ cpdef np2adiostype(type nptype):
         atype = DATATYPE.complex
     elif (nptype == np.complex128):
         atype = DATATYPE.double_complex
-    elif (nptype == np.str_):
-        atype = DATATYPE.byte
+    elif (nptype.char == 'S'):
+        atype = DATATYPE.string
+    else:
+        atype = DATATYPE.unknown
 
     return atype
 
+cpdef str adiostype2string (ADIOS_DATATYPES type):
+    return str(adios_type_to_string(<ADIOS_DATATYPES> type))
+
 ## ====================
 ## ADIOS Class Definitions for Read
 ## ====================
@@ -495,29 +600,88 @@ cpdef int read_finalize(char * method_name = "BP"):
     cdef method = str2adiosreadmethod(method_name)
     return adios_read_finalize_method (method)
 
-""" Python class for ADIOS_FILE structure """
+## Python class for ADIOS_FILE structure
 cdef class file:
-    """ Private Memeber """
+    """
+    file class for Adios file read and write.
+
+    Args:
+        fname (str): filename.
+        method_name (str, optional): Adios read method (default: 'BP').
+        comm (MPI.Comm, optional): MPI comm for parallel read/write (default: MPI.COMM_WORLD).
+        is_stream (bool, optional): Set True if use stream reader (default: False).
+        lock_mode (int, optional): ADIOS_LOCKMODE for stream reader (default: ADIOS_LOCKMODE_ALL).
+        timeout_sec (float, optional): Timeout seconds for stream reader (default: 0.0).
+
+    Example:
+    
+    >>> import adios as ad
+    >>> f = ad.file('adiosfile.bp')
+    
+    """
+    
     cpdef ADIOS_FILE * fp
-
-    """ Public Memeber """
-    cpdef public bytes name
-    cpdef public int nvars
-    cpdef public int nattrs
-    cpdef public int current_step
-    cpdef public int last_step
-    cpdef public int endianness
-    cpdef public int version
-    cpdef public int file_size
+    cpdef bytes name
+    cpdef int nvars
+    cpdef int nattrs
+    cpdef int current_step
+    cpdef int last_step
+    cpdef int endianness
+    cpdef int version
+    cpdef int file_size
+    cpdef bint is_stream
     
+    ## Public Memeber
     cpdef public dict var
     cpdef public dict attr
 
-    cpdef public bint is_stream
+    property name:
+        """ The filename (or stream name) associated with. """
+        def __get__(self):
+            return self.name
+
+    property nvars:
+        """ The number of variables. """
+        def __get__(self):
+            return self.nvars
+
+    property nattrs:
+        """ The number of attributes. """
+        def __get__(self):
+            return self.nattrs
+
+    property current_step:
+        """ The current timestep index. """
+        def __get__(self):
+            return self.current_step
+
+    property last_step:
+        """ The last timestep index. """
+        def __get__(self):
+            return self.last_step
+
+    property endianness:
+        """ The endianness of the stored data. """
+        def __get__(self):
+            return self.endianness
+
+    property version:
+        """ The version of Adios. """
+        def __get__(self):
+            return self.version
+        
+    property file_sizec:
+        """ The size of Adios file. """
+        def __get__(self):
+            return self.file_size
+
+    property is_stream:
+        """ Indicating reader type; file reader or stream reader """
+        def __get__(self):
+            return self.is_stream
 
-    """ Initialization. Call adios_read_open and populate public members """
     def __init__(self, char * fname,
-                 char * method_name = "BP",
+                 char * method_name = 'BP',
                  MPI.Comm comm = MPI.COMM_WORLD,
                  is_stream = False,
                  ADIOS_LOCKMODE lock_mode = ADIOS_LOCKMODE_ALL,
@@ -545,43 +709,147 @@ cdef class file:
         self.version = self.fp.version
         self.file_size = self.fp.file_size
     
-        for varname in [self.fp.var_namelist[i] for i in range(self.nvars)]:
-            self.var[varname] = var(self, varname)
+        for name in [self.fp.var_namelist[i] for i in range(self.nvars)]:
+            self.var[name] = var(self, name)
+
+        for name in [self.fp.attr_namelist[i] for i in range(self.nattrs)]:
+            self.attr[name] = attr(self, name)
 
     def __del__(self):
-            self.close()
+        """ Close file on destruction. """
+        self.close()
             
-    """ Call adios_read_close """
     cpdef close(self):
+        """ Close the open file. """
         assert self.fp != NULL, 'Not an open file'
         adios_read_close(self.fp)
         self.fp = NULL
         
-    """ Print self """
     cpdef printself(self):
+        """ Print native ADIOS_FILE structure. """
         assert self.fp != NULL, 'Not an open file'
         print '=== AdiosFile ==='
         print '%15s : %lu' % ('fp', <unsigned long> self.fp)
         printfile(self.fp)
 
     cpdef advance(self, int last = 0, float timeout_sec = 0.0):
-        return adios_advance_step(self.fp, last, timeout_sec)
+        """
+        Advance a timestep for stream reader.
+
+        Args:
+            last (int, optional): last timestep index (default: 0).
+            timeout_sec (float, optional): timeout seconds (default: 0.0).
+
+        Returns:
+            int: 0 if successful, non-zero otherwise.
+        """
+        val = adios_advance_step(self.fp, last, timeout_sec)
+        if (val >= 0):
+            self.current_step = self.fp.current_step
+            self.last_step = self.fp.last_step
+
+            for v in self.var.values():
+                v.advance()
+                
+        return val
+        
+    def __getitem__(self, varname):
+        """
+        Return Adios variable.
+
+        Args:
+            varname (str): variable name.
+
+        Raises:
+            KeyError: If no varname exists.
+
+        """
+        if not isinstance(varname, tuple):
+            varname = (varname,)
+
+        if len(varname) > 1:
+            raise KeyError(varname)
+        
+        for key_ in varname:
+            if not isinstance(key_, str):
+                raise TypeError("Unhashable type")
+
+            if key_ in self.var.keys():
+                return self.var.get(key_)
+            elif key_ in self.attr.keys():
+                return self.attr.get(key_)
+            else:
+                raise KeyError(key_)
+        
+    def __repr__(self):
+        """ Return string representation. """
+        return ("AdiosFile (path=%r, nvars=%r, var=%r, nattrs=%r, attr=%r, "
+                "current_step=%r, last_step=%r, file_size=%r)") % \
+                (self.fp.path,
+                 self.nvars,
+                 self.var.keys(),
+                 self.nattrs,
+                 self.attr.keys(),
+                 self.current_step,
+                 self.last_step,
+                 self.file_size)
 
-""" Python class for ADIOS_VARINFO structure """
 cdef class var:
-    """ Private Memeber """
+    """
+    Adios variable class.
+
+    Unlike attributes whose values are populated on initialization,
+    variable's values will be returned by explicitly calling read() or
+    array access interface ([]).  
+
+    Args:
+        file (file): Associated file class
+        name (str): variable name
+
+    Note:
+        Users do not need to create this class manually.
+    """
+    
     cdef file file
     cdef ADIOS_VARINFO * vp
 
-    """ Public Memeber """
-    cpdef public bytes name
-    cpdef public int varid
-    cpdef public type type
-    cpdef public int ndim
-    cpdef public tuple dims
-    cpdef public int nsteps
+    cpdef bytes name
+    cpdef int varid
+    cpdef np.dtype dtype
+    cpdef int ndim
+    cpdef tuple dims
+    cpdef int nsteps
+
+    property name:
+        """ The variable name. """
+        def __get__(self):
+            return self.name
+    
+    property varid:
+        """ Internal variable id. """
+        def __get__(self):
+            return self.varid
+    
+    property dtype:
+        """ Variable type as in numpy.dtype. """
+        def __get__(self):
+            return self.dtype
+
+    property ndim:
+        """ The number of dimensions of the variable. """
+        def __get__(self):
+            return self.ndim
+
+    property dims:
+        """ The shape of the variable. """
+        def __get__(self):
+            return self.dims
+
+    property nsteps:
+        """ The number of time steps of the variable. """
+        def __get__(self):
+            return self.nsteps
 
-    """ Initialization. Call adios_inq_var and populate public members """
     def __init__(self, file file, char * name):
         self.file = file
         self.vp = NULL
@@ -591,26 +859,87 @@ cdef class var:
         assert self.vp != NULL, 'Not a valid var'
 
         self.name = name
-        self.varid = self.vp.varid                
-        self.type = adios2nptype(self.vp.type)
+        self.varid = self.vp.varid
         self.ndim = self.vp.ndim                 
         self.dims = tuple([self.vp.dims[i] for i in range(self.vp.ndim)])
         self.nsteps = self.vp.nsteps
-        
+
+        if self.vp.type == DATATYPE.string:
+            self.dtype = adios2npdtype(self.vp.type, len(<char*> self.vp.value))
+        else:
+            self.dtype = adios2npdtype(self.vp.type)
+
     def __del__(self):
         self.close()
 
-    """ Call adios_free_varinfo """
     cpdef close(self):
+        """ Close and free variable information """
         assert self.vp != NULL, 'Not an open var'
         adios_free_varinfo(self.vp)
         self.vp = NULL
 
-    """ Call adios_schedule_read and adios_perform_reads """
-    cpdef read(self, tuple offset = (), tuple count = (), from_steps = 0, nsteps = 1):
-        assert self.type is not None, 'Data type is not supported yet'
-        if (self.nsteps > 0):
-            assert from_steps + nsteps <= self.nsteps, 'Step index is out of range'
+    cpdef advance(self):
+        """ Update variable information after the stream advanced """
+        self.vp = adios_inq_var(self.file.fp, self.name)
+        assert self.vp != NULL, 'Not a valid var'
+        self.nsteps = self.vp.nsteps
+
+    cpdef read(self, tuple offset = (), tuple count = (), from_steps = None, nsteps = None, fill = 0):
+        """ Perform read.
+
+        Read data from an ADIOS BP file. Subset reading is
+        supported. Without any options, this will read out a whole
+        data.
+
+        Args:
+            offset (tuple of int, optional): offset (default: ())
+            count (tuple of int, optional): count (default: ())
+            from_steps (int, optional): starting step index (default: None)
+            nsteps (int, optional): number of time dimensions (default: None)
+            fill (value, optional): default fill value (default: 0)
+
+        Returns:
+            NumPy ndarray
+            
+        Raises:
+            IndexError: If dimension is mismatched or out of the boundary.
+
+
+        Example:
+
+        The following command will read the full data:
+        
+        >>> var.read()
+
+        which is equvalent to
+
+        >>> var[]
+
+
+        The following command is for subset reading:
+        
+        >>> var.read(offset=(1,2), count=(3,4))
+
+        which will return an 3x4 array offset by (1,2) in the original
+        data. With Numpy's array notation, the following command does the same job:
+
+        >>> var[1:4, 2:6]
+
+        Similarly, the following two commands are same:
+
+        >>> var.read(count=(5,6))
+        >>> var[:5, :6]
+        
+        """
+        if from_steps is None:
+            from_steps = 0 ##self.file.current_step
+
+        if nsteps is None:
+            nsteps = self.file.last_step - from_steps + 1
+
+        assert self.dtype is not None, 'Data type is not supported yet'
+        if (self.nsteps > 0) and (from_steps + nsteps > self.nsteps):
+            raise IndexError('Step index is out of range: from_steps=%r, nsteps=%r' % (from_steps, nsteps))
         
         cdef list lshape = [self.vp.dims[i] for i in range(self.vp.ndim)]
         cdef np.ndarray npshape = np.array(lshape, dtype=np.int64)
@@ -628,36 +957,520 @@ cdef class var:
         else:
             npcount = np.array(count, dtype=np.int64)
 
-        assert npshape.ndim == npoffset.ndim, 'Offset dimension mismatch'
-        assert npshape.ndim == npcount.ndim, 'Count dimension mismatch.'
-        assert (npshape - npoffset >= npcount).all(), 'Count is larger than shape.'
+        if npshape.ndim != npoffset.ndim:
+            raise IndexError('Offset dimension mismatch (offset dim: %r)' % (npoffset.ndim))
+
+        if npshape.ndim != npcount.ndim:
+            raise IndexError('Count dimension mismatch (count dim: %r)' % (npcount.ndim))
+
+        if (npshape < npcount + npoffset).any():
+            raise IndexError('Requested is larger than the shape.')
 
         shape = list(npcount)
         if (nsteps > 1):
             shape.insert(0, nsteps)
-        cdef np.ndarray var = np.zeros(shape, dtype=self.type)
+        cdef np.ndarray var = np.zeros(shape, dtype=self.dtype)
+        
+        if len(shape) > 0:
+            var[:] = fill
 
         cdef ADIOS_SELECTION * sel
         sel = adios_selection_boundingbox (self.vp.ndim, <uint64_t *> npoffset.data, <uint64_t *> npcount.data)
-        
+
+        ##print 'npoffset', npoffset
+        ##print 'npcount', npcount
+
         adios_schedule_read_byid (self.file.fp, sel, self.vp.varid, from_steps, nsteps, <void *> var.data)
         adios_perform_reads(self.file.fp, 1)
 
-        return var
+        ## Try not to return as scalar to be consistent
+        ##if (var.ndim == 0):
+        ##    return np.asscalar(var)
+        ##else:
+        ##    return var
+        return np.squeeze(var)
 
-    """ Print self """
     cpdef printself(self):
+        """ Print native ADIOS_VARINFO structure. """
         assert self.vp != NULL, 'Not an open variable'
         print '=== AdiosVariable ==='
         print '%15s : %lu' % ('vp', <unsigned long> self.vp)
         print '%15s : %lu' % ('fp', <unsigned long> self.file.fp)
         printvar(self.vp)
+        
+    def __repr__(self):
+        return "AdiosVar (varid=%r, dtype=%r, ndim=%r, dims=%r, nsteps=%r)" % \
+               (self.varid,
+                self.dtype,
+                self.ndim,
+                self.dims,
+                self.nsteps)
+
+    def __getitem__(self, index):
+        ndim_ = self.ndim
+        if (self.nsteps) > 1: ndim_ += 1
+
+        index_ = __parse_index(index, ndim_)
 
+        if (ndim_ > 0) and (len(index_) > ndim_):
+            raise IndexError("Too many indices for data")
+
+        if (ndim_ == 0) and (len(index_) > 1):
+            raise IndexError("Too many indices for data")
+        
+        for slice_ in index_:
+            if isinstance(slice_.step, (int, long)) and (slice_.step != 1):
+                raise IndexError("Step size (%d) is not supported." % (slice_.step))
+            if isinstance(slice_, str):
+                raise IndexError("Name index (%r) is not supported." % (slice_))
+        
+        if (self.nsteps) > 1:
+            dims_ = list(self.dims)
+            dims_.insert(0, self.nsteps)
+            indices = tuple(x[0].indices(x[1]) for x in zip(index_, dims_))
+            z = zip(*indices)
+
+            from_steps_ = z[0][0]
+            nsteps_ = (z[1][0] - z[0][0]-1)%self.nsteps+1
+            offset_ = z[0][1:]
+            count_ = tuple((np.subtract(z[1][1:], z[0][1:])-1)%dims_[1:]+1)
+        else:
+            indices = tuple(x[0].indices(x[1]) for x in zip(index_, self.dims))
+            z = zip(*indices)
+
+            if len(z) == 0:
+                from_steps_ = 0
+                nsteps_ = self.nsteps
+                offset_ = ()
+                count_ = ()
+            else:
+                from_steps_ = 0
+                nsteps_ = self.nsteps
+                offset_ = z[0]
+                count_ = tuple((np.subtract(z[1], z[0])-1)%self.dims+1)
+
+        ##print "from_steps", from_steps_
+        ##print "nsteps", nsteps_
+        ##print "offset", offset_
+        ##print "count", count_
+        
+        return self.read(offset=offset_,
+                         count=count_,
+                         from_steps=from_steps_,
+                         nsteps=nsteps_)
+
+cdef class attr:
+    """
+    Adios attribute class.
+    
+    Attribute values are loaded on initialization.
+
+    Args:
+        attr_name (str): attribute name
+
+    Raises:
+        KeyError: If no attribute name exists.
+
+    Note:
+        Users do not need to create this class manually.        
+    """
+    cdef file file
+    cpdef bytes name
+    cpdef np.dtype dtype
+    cdef np.ndarray value
+
+    property name:
+        """ The attribute name """
+        def __get__(self):
+            return self.name
+
+    property dtype:
+        """ The attribute type as in numpy.dtype """
+        def __get__(self):
+            return self.dtype
+
+    property value:
+        """ The attribute's value """
+        def __get__(self):
+            return self.value
+
+    def __init__(self, file file, char * name):
+        self.file = file
+        self.name = name
+
+        cdef int64_t p
+        cdef ADIOS_DATATYPES atype
+        cdef int bytes
+        cdef list strlist
+        cdef int len
+        
+        err = adios_get_attr(self.file.fp, self.name, &atype, &bytes, <void **> &p)
+
+        if err == 0:
+            if atype == DATATYPE.string:
+                bytes = bytes - 1 ## Remove the NULL terminal                
+            self.dtype = adios2npdtype(atype, bytes)
+            if atype == DATATYPE.string_array:
+                strlist = list()
+                len = bytes/sizeof(p)
+                for i in range(len):
+                    strlist.append((<char **>p)[i])
+                self.value = np.array(strlist)
+                self.dtype = self.value.dtype
+                    
+            elif self.dtype is None:
+                print 'Warning: No support yet: %s (type=%d, bytes=%d)' % \
+                      (self.name, atype, bytes)
+            else:
+                len = bytes/self.dtype.itemsize
+                if len == 1:
+                    self.value = np.array(len, dtype=self.dtype)
+                else:
+                    self.value = np.zeros(len, dtype=self.dtype)
+                self.value.data = <char *> p
+        else:
+            raise KeyError(name)
+
+    def __repr__(self):
+        return "AdiosAttr (name=%r, dtype=%r, value=%r)" % \
+               (self.name, self.dtype, self.value)
+
+
+## Helper dict
+cdef class smartdict(dict):
+    cdef factory
+    def __init__(self, factory):
+        dict.__init__(self)
+        self.factory = factory
+        
+    def __setitem__(self, key, value):
+        if key in dict.keys(self):
+            dict.__setitem__(self, key, value)
+        else:
+            self.factory(key, value)
+
+cdef class writer:
+    """
+    writer class for Adios write.
+
+    Args:
+        fname (str): filename.
+        is_noxml (bool, optional): Set True if use noxml APIs (default: True).
+        comm (MPI.Comm, optional): MPI comm for parallel read/write (default: MPI.COMM_WORLD).
+
+    Example:
+    
+    >>> import adios as ad
+    >>> f = ad.writer('adiosfile.bp')
+    
+    """
+    
+    cdef int64_t gid
+    cpdef bytes fname
+    cpdef bytes gname
+    cpdef bytes method
+    cpdef bytes method_params
+    cpdef bint is_noxml
+    cpdef MPI.Comm comm
+
+    cpdef dict var
+    cpdef dict attr
+
+    property fname:
+        """ The filename to write. """
+        def __get__(self):
+            return self.fname
+
+    property gname:
+        """ The groupname associated with the file. """
+        def __get__(self):
+            return self.gname
+        
+    property is_noxml:
+        """ Boolean to indicate using No-XML or not. """
+        def __get__(self):
+            return self.is_noxml
+        
+    property var:
+        """ Dictionary of variables to write. """
+        def __get__(self):
+            return self.var
+
+    property attr:
+        """ Dictionary of attributes to write. """
+        def __get__(self):
+            return self.attr
+        
+    def __init__(self,char * fname,
+                 bint is_noxml = True,
+                 MPI.Comm comm = MPI.COMM_WORLD):
+        self.fname = fname
+        self.method = <bytes>""
+        self.method_params = <bytes>""
+        self.is_noxml = is_noxml
+        self.comm = comm
+        self.var = dict()
+        self.attr = dict()
+
+    ##def __var_factory__(self, name, value):
+    ##    print "var_factory:", name, value
+    ##
+    ##def __attr_factory__(self, name, value):
+    ##    print "attr_factory:", name, value
+
+    def declare_group(self, char * gname,
+                      char * method = "POSIX1",
+                      char * method_params = ""):
+        """
+        Define a group associated with the file.
+
+        Args:
+            gname (str): group name.
+            method (str, optional): Adios write method (default: 'POSIX1')
+            method_params (str, optional): parameters for the write method (default: '')
+
+        Example:
+
+        >>>  fw.declare_group('group', method='MPI', method_params='verbose=3')
+        
+        """
+        self.gid = declare_group(gname, "", 1)
+        self.gname = gname
+        self.method = method
+        self.method_params = method_params
+        select_method(self.gid, self.method, self.method_params, "")
+
+    def define_var(self, char * varname,
+                   ldim = tuple(),
+                   gdim = tuple(),
+                   offset = tuple()):
+        """
+        Define a variable associated with the file.
+
+        Args:
+            varname (str): variable name.
+            ldim (tuple, optional): local dimension (default: tuple())
+            gdim (tuple, optional): global dimension (default: tuple())
+            offset (tuple, optional): offset (default: tuple())
+
+        Example:
+
+        Write 'temperature' variable of size of 2x3 array.
+
+        >>>  fw.define_var ('temperature', (2,3))
+        
+        """
+        self.var[varname] = varinfo(varname, ldim, gdim, offset)
+
+    def define_attr(self, char * attrname):
+        """
+        Define attribute in the file.
+
+        Args:
+            attrname (str): attribute name.
+        """
+
+        self.attr[attrname] = attrinfo(attrname, is_static=True)
+
+    def define_dynamic_attr(self, char * attrname,
+                            char * varname,
+                            dtype):
+        self.attr[attrname] = attrinfo(attrname, varname, dtype, is_static=False)
+    def __setitem__(self, name, val):
+        if self.var.has_key(name):
+            self.var[name].value = val
+        elif self.attr.has_key(name):
+            self.attr[name].value = val
+        else:
+            self.var[name] = val
+        
+    def __getitem__(self, name):
+        if self.var.has_key(name):
+            return self.var[name].value
+        elif self.attr.has_key(name):
+            return self.attr[name].value
+        else:
+            raise KeyError(name)
+    
+    def close(self):
+        """
+        Write variables and attributes to a file and close the writer.
+        """
+        fd = open(self.gname, self.fname, "w")
+
+        extra_var = dict()
+        extra_attr = dict()
+
+        for key, val in self.var.iteritems():
+            if not isinstance(val, varinfo):
+                n = np.array(val)
+                extra_var[key] = varinfo(key, n.shape)
+                extra_var[key].value = val
+            else:
+                if self.is_noxml: val.define(self.gid)
+
+        for key, val in extra_var.iteritems():
+            if self.is_noxml: val.define(self.gid)
+            self.var[key] = val
+
+        for key, val in self.attr.iteritems():
+            if not isinstance(val, attrinfo):
+                extra_attr[key] = attrinfo(key, val, np.array(val).dtype)
+            else:
+                if self.is_noxml: val.define(self.gid)
+
+        for key, val in extra_attr.iteritems():
+            if self.is_noxml: val.define(self.gid)
+
+        groupsize = 0
+        for var in self.var.values():
+            groupsize = groupsize + var.bytes()
+
+        set_group_size(fd, groupsize)
+
+        for var in self.var.values():
+            var.write(fd)
+            
+        close(fd)
+    
+    def __repr__(self):
+        return ("AdiosWriter (fname=%r, gname=%r, "
+                "method=%r, method_params=%r, var=%r, attr=%r)") % \
+                (self.fname,
+                 self.gname,
+                 self.method,
+                 self.method_params,
+                 self.var.keys(),
+                 self.attr.keys())
+
+cdef class attrinfo:
+    cdef bytes name
+    cdef bint is_static # Use define_byvalue, if True
+    cdef dtype
+    cdef value # Either varname or nparray
+
+    property name:
+        def __get__(self):
+            return self.name
+
+    property is_static:
+        def __get__(self):
+            return self.is_static
+
+    property dtype:
+        def __get__(self):
+            return self.dtype
+        
+    property value:
+        def __get__(self):
+            return self.value
+        
+        def __set__(self, value):
+            self.value = value
+        
+    def __init__(self, char * name,
+                 value = None,
+                 dtype = None,
+                 bint is_static = True):
+        self.name = name
+        self.value = value
+        self.dtype = dtype
+        self.is_static = is_static
+
+    def define(self, int64_t gid):
+        if self.is_static:
+            if self.value is None:
+                raise TypeError("Value is none")
+            
+            define_attribute_byvalue(gid, self.name, "", self.value)
+        else:
+            ##atype = np2adiostype(np.dtype(self.dtype))
+            ##define_attribute(gid, self.name, "",
+            ##                 atype, "", str(self.value))
+            raise NotImplementedError            
+        
+    def __repr__(self):
+        return ("AdiosAttrinfo (name=%r, is_static=%r, value=%r, dtype=%r)") % \
+                (self.name,
+                 self.is_static,
+                 self.value,
+                 self.dtype)
+
+cdef class varinfo:
+    cdef bytes name
+    cdef public ldim
+    cdef public gdim
+    cdef public offset
+    cdef public value
+
+    def __init__(self, char * name,
+                 ldim = tuple(),
+                 gdim = tuple(),
+                 offset = tuple()):
+        self.name = name
+        self.ldim = ldim
+        self.gdim = gdim
+        self.offset = offset
+        
+    def define(self, int64_t gid):
+        if self.value is None:
+            raise TypeError("Value is none")
+
+        ldim_ = self.ldim
+        if isinstance(self.ldim, (tuple, list)):
+            ldim_ = tuple(self.ldim)
+
+        gdim_ = self.gdim
+        if isinstance(self.gdim, (tuple, list)):
+            gdim_ = tuple(self.gdim)
+
+        offset_ = self.offset
+        if isinstance(self.offset, (tuple, list)):
+            offset_ = tuple(self.offset)
+
+        val_ = self.value
+        if not isinstance(self.value, (np.ndarray)):
+            val_ = np.array(self.value)
+
+        atype = np2adiostype(val_.dtype)
+        ## No space allowed
+        define_var(gid, self.name, "", atype,
+                   str(ldim_).replace(' ', '').strip('(,)'),
+                   str(gdim_).replace(' ', '').strip('(,)'),
+                   str(offset_).replace(' ', '').strip('(,)'))
+
+    def bytes(self):
+        val_ = self.value
+        if not isinstance(self.value, (np.ndarray)):
+            val_ = np.array(self.value)
+        
+        return val_.size * val_.itemsize
+    
+    def write(self, int64_t fd): 
+        val_ = self.value
+        if not isinstance(self.value, (np.ndarray)):
+            val_ = np.array(self.value)
+        
+        write(fd, self.name, val_)
+    
+    def __repr__(self):
+        return ("AdiosVarinfo (name=%r, ldim=%r, gdim=%r, offset=%r, value=%r)") % \
+                (self.name, self.ldim, self.gdim, self.offset, self.value)
+        
 ## ====================
 ## ADIOS Global functions
 ## ====================
 
 def readvar(fname, varname):
+    """ Retrieve a variable value from an Adios file.
+
+    Args:
+        fname (str): Adios file name
+        varname (str): Variable name to retrieve
+
+    Returns:
+        NumPy ndarray: variable value
+    """
     f = file(fname, comm=MPI.COMM_SELF)
     if not f.var.has_key(varname):
         print "No valid variable"
@@ -667,6 +1480,14 @@ def readvar(fname, varname):
     return v.read(from_steps=0, nsteps=v.nsteps)
 
 def bpls(fname):
+    """ Return meta data of an Adios file as a Python dictionary object.
+
+    Args:
+        fname (str): Adios file name
+
+    Returns:
+        dict: Adios file meta data
+    """
     f = file(fname, comm=MPI.COMM_SELF)
     return {'nvars': f.nvars,
             'nattrs': f.nattrs,
diff --git a/wrappers/numpy/conf/__init__.py b/wrappers/numpy/conf/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/wrappers/numpy/conf/mpiconfig.py b/wrappers/numpy/conf/mpiconfig.py
new file mode 100644
index 0000000..146d2c2
--- /dev/null
+++ b/wrappers/numpy/conf/mpiconfig.py
@@ -0,0 +1,363 @@
+import sys, os, platform, re
+
+from distutils import sysconfig
+from distutils.util  import convert_path
+from distutils.util  import split_quoted
+from distutils.spawn import find_executable
+from distutils import log
+
+try:
+    from collections import OrderedDict
+except ImportError:
+    OrderedDict = dict
+
+try:
+    from configparser import ConfigParser
+    from configparser import Error as ConfigParserError
+except ImportError:
+    from ConfigParser import ConfigParser
+    from ConfigParser import Error as ConfigParserError
+
+class Config(object):
+
+    def __init__(self, logger=None):
+        self.log = logger or log
+        self.section  = None
+        self.filename = None
+        self.compiler_info = OrderedDict((
+                ('mpicc'  , None),
+                ('mpicxx' , None),
+                ('mpif77' , None),
+                ('mpif90' , None),
+                ('mpif95' , None),
+                ('mpild'  , None),
+                ))
+        self.library_info = OrderedDict((
+            ('define_macros'        , []),
+            ('undef_macros'         , []),
+            ('include_dirs'         , []),
+
+            ('libraries'            , []),
+            ('library_dirs'         , []),
+            ('runtime_library_dirs' , []),
+
+            ('extra_compile_args'   , []),
+            ('extra_link_args'      , []),
+            ('extra_objects'        , []),
+            ))
+
+    def __bool__(self):
+        for v in self.compiler_info.values():
+            if v:
+                return True
+        for v in self.library_info.values():
+            if v:
+                return True
+        return False
+
+    __nonzero__ = __bool__
+
+    def get(self, k, d=None):
+        if k in self.compiler_info:
+            return self.compiler_info[k]
+        if k in self.library_info:
+            return self.library_info[k]
+        return d
+
+    def info(self, log=None):
+        if log is None: log = self.log
+        mpicc  = self.compiler_info.get('mpicc')
+        mpicxx = self.compiler_info.get('mpicxx')
+        mpif77 = self.compiler_info.get('mpif77')
+        mpif90 = self.compiler_info.get('mpif90')
+        mpif95 = self.compiler_info.get('mpif95')
+        mpild  = self.compiler_info.get('mpild')
+        if mpicc:
+            log.info("MPI C compiler:    %s", mpicc)
+        if mpicxx:
+            log.info("MPI C++ compiler:  %s", mpicxx)
+        if mpif77:
+            log.info("MPI F77 compiler:  %s", mpif77)
+        if mpif90:
+            log.info("MPI F90 compiler:  %s", mpif90)
+        if mpif95:
+            log.info("MPI F95 compiler:  %s", mpif95)
+        if mpild:
+            log.info("MPI linker:        %s", mpild)
+
+    def update(self, config, **more):
+        if hasattr(config, 'keys'):
+            config = config.items()
+        for option, value in config:
+            if option in self.compiler_info:
+                self.compiler_info[option] = value
+            if option in self.library_info:
+                self.library_info[option] = value
+        if more:
+            self.update(more)
+
+    def setup(self, options, environ=None):
+        if environ is None: environ = os.environ
+        self.setup_library_info(options, environ)
+        self.setup_compiler_info(options, environ)
+
+    def setup_library_info(self, options, environ):
+        filename = section = None
+        mpiopt = getattr(options, 'mpi', None)
+        mpiopt = environ.get('MPICFG', mpiopt)
+        if mpiopt:
+            if ',' in mpiopt:
+                section, filename = mpiopt.split(',', 1)
+            else:
+                section = mpiopt
+        if not filename: filename = "mpi.cfg"
+        if not section:  section  = "mpi"
+
+        sections = [section+"-"+sys.platform, section]
+        self.load(filename, sections)
+        if not self:
+            if os.name == 'posix':
+                self._setup_posix()
+            if sys.platform == 'win32':
+                self._setup_windows()
+
+    def _setup_posix(self):
+        pass
+
+    def _setup_windows(self):
+        from glob import glob
+        ProgramFiles = os.environ.get('ProgramFiles', '')
+        for (name, install_suffix) in (
+            ('mpich2',   'MPICH2'),
+            ('openmpi',  'OpenMPI'),
+            ('openmpi',  'OpenMPI*'),
+            ('deinompi', 'DeinoMPI'),
+            ('msmpi',    'Microsoft HPC Pack 2008 SDK'),
+            ):
+            mpi_dir = os.path.join(ProgramFiles, install_suffix)
+            if '*' in mpi_dir:
+                dirs = glob(mpi_dir)
+                if dirs:
+                    mpi_dir = max(dirs)
+            if not os.path.isdir(mpi_dir):
+                continue
+            define_macros = []
+            include_dir = os.path.join(mpi_dir, 'include')
+            library = 'mpi'
+            library_dir = os.path.join(mpi_dir, 'lib')
+            if name == 'openmpi':
+                define_macros.append(('OMPI_IMPORTS', None))
+                library = 'libmpi'
+            if name == 'msmpi':
+                library = 'msmpi'
+                bits = platform.architecture()[0]
+                if bits == '32bit':
+                    library_dir = os.path.join(library_dir, 'i386')
+                if bits == '64bit':
+                    library_dir = os.path.join(library_dir, 'amd64')
+            self.library_info.update(
+                define_macros=define_macros,
+                include_dirs=[include_dir],
+                libraries=[library],
+                library_dirs=[library_dir],
+                )
+            self.section = name
+            self.filename = [mpi_dir]
+            break
+
+
+    def setup_compiler_info(self, options, environ):
+        def find_exe(cmd, path=None):
+            if not cmd: return None
+            parts = split_quoted(cmd)
+            exe, args = parts[0], parts[1:]
+            if not os.path.isabs(exe) and path:
+                exe = os.path.basename(exe)
+            exe = find_executable(exe, path)
+            if not exe: return None
+            return ' '.join([exe]+args)
+        COMPILERS = (
+            ('mpicc',  ['mpicc',  'mpcc_r']),
+            ('mpicxx', ['mpicxx', 'mpic++', 'mpiCC', 'mpCC_r']),
+            ('mpif77', ['mpif77', 'mpf77_r']),
+            ('mpif90', ['mpif90', 'mpf90_r']),
+            ('mpif95', ['mpif95', 'mpf95_r']),
+            ('mpild',  []),
+            )
+        #
+        compiler_info = {}
+        PATH = environ.get('PATH', '')
+        for name, _ in COMPILERS:
+            cmd = (environ.get(name.upper()) or
+                   getattr(options, name, None) or
+                   self.compiler_info.get(name) or
+                   None)
+            if cmd:
+                exe = find_exe(cmd, path=PATH)
+                if exe:
+                    path = os.path.dirname(exe)
+                    PATH = path + os.path.pathsep + PATH
+                    compiler_info[name] = exe
+                else:
+                    self.log.error("error: '%s' not found", cmd)
+        #
+        if not self and not compiler_info:
+            for name, candidates in COMPILERS:
+                for cmd in candidates:
+                    cmd = find_exe(cmd)
+                    if cmd:
+                        compiler_info[name] = cmd
+                        break
+        #
+        self.compiler_info.update(compiler_info)
+
+
+    def load(self, filename="mpi.cfg", section='mpi'):
+        if isinstance(filename, str):
+            filenames = filename.split(os.path.pathsep)
+        else:
+            filenames = list(filename)
+        if isinstance(section, str):
+            sections = section.split(',')
+        else:
+            sections = list(section)
+        #
+        try:
+            parser = ConfigParser(dict_type=OrderedDict)
+        except TypeError:
+            parser = ConfigParser()
+        try:
+            read_ok = parser.read(filenames)
+        except ConfigParserError:
+            self.log.error(
+                "error: parsing configuration file/s '%s'",
+                os.path.pathsep.join(filenames))
+            return None
+        for section in sections:
+            if parser.has_section(section):
+                break
+            section = None
+        if not section:
+            self.log.error(
+                "error: section/s '%s' not found in file/s '%s'",
+                ','.join(sections), os.path.pathsep.join(filenames))
+            return None
+        parser_items = list(parser.items(section, vars=None))
+        #
+        compiler_info = type(self.compiler_info)()
+        for option, value in parser_items:
+            if option in self.compiler_info:
+                compiler_info[option] = value
+        #
+        pathsep = os.path.pathsep
+        expanduser = os.path.expanduser
+        expandvars = os.path.expandvars
+        library_info = type(self.library_info)()
+        for k, v in parser_items:
+            if k in ('define_macros',
+                     'undef_macros',
+                     ):
+                macros = [e.strip() for e in v.split(',')]
+                if k == 'define_macros':
+                    for i, m in enumerate(macros):
+                        try: # -DFOO=bar
+                            idx = m.index('=')
+                            macro = (m[:idx], m[idx+1:] or None)
+                        except ValueError: # -DFOO
+                            macro = (m, None)
+                        macros[i] = macro
+                library_info[k] = macros
+            elif k in ('include_dirs',
+                       'library_dirs',
+                       'runtime_dirs',
+                       'runtime_library_dirs',
+                       ):
+                if k == 'runtime_dirs': k = 'runtime_library_dirs'
+                pathlist = [p.strip() for p in v.split(pathsep)]
+                library_info[k] = [expanduser(expandvars(p))
+                                   for p in pathlist if p]
+            elif k == 'libraries':
+                library_info[k] = [e.strip() for e in split_quoted(v)]
+            elif k in ('extra_compile_args',
+                       'extra_link_args',
+                       ):
+                library_info[k] = split_quoted(v)
+            elif k == 'extra_objects':
+                library_info[k] = [expanduser(expandvars(e))
+                                   for e in split_quoted(v)]
+            elif hasattr(self, k):
+                library_info[k] = v.strip()
+            else:
+                pass
+        #
+        self.section = section
+        self.filename = read_ok
+        self.compiler_info.update(compiler_info)
+        self.library_info.update(library_info)
+        return compiler_info, library_info, section, read_ok
+
+    def dump(self, filename=None, section='mpi'):
+        # prepare configuration values
+        compiler_info   = self.compiler_info.copy()
+        library_info = self.library_info.copy()
+        for k in library_info:
+            if k in ('define_macros',
+                     'undef_macros',
+                     ):
+                macros = library_info[k]
+                if k == 'define_macros':
+                    for i, (m, v) in enumerate(macros):
+                        if v is None:
+                            macros[i] = m
+                        else:
+                            macros[i] = '%s=%s' % (m, v)
+                library_info[k] = ','.join(macros)
+            elif k in ('include_dirs',
+                       'library_dirs',
+                       'runtime_library_dirs',
+                       ):
+                library_info[k] = os.path.pathsep.join(library_info[k])
+            elif isinstance(library_info[k], list):
+                library_info[k] = ' '.join(library_info[k])
+        # fill configuration parser
+        try:
+            parser = ConfigParser(dict_type=OrderedDict)
+        except TypeError:
+            parser = ConfigParser()
+        parser.add_section(section)
+        for option, value in compiler_info.items():
+            if not value: continue
+            parser.set(section, option, value)
+        for option, value in library_info.items():
+            if not value: continue
+            parser.set(section, option, value)
+        # save configuration file
+        if filename is None:
+            parser.write(sys.stdout)
+        elif hasattr(filename, 'write'):
+            parser.write(filename)
+        elif isinstance(filename, str):
+            f = open(filename, 'wt')
+            try:
+                parser.write(f)
+            finally:
+                f.close()
+        return parser
+
+
+if __name__ == '__main__':
+
+    import optparse
+    parser = optparse.OptionParser()
+    parser.add_option("--mpi",    type="string")
+    parser.add_option("--mpicc",  type="string")
+    parser.add_option("--mpicxx", type="string")
+    parser.add_option("--mpif90", type="string")
+    parser.add_option("--mpif77", type="string")
+    parser.add_option("--mpild",  type="string")
+    (options, args) = parser.parse_args()
+
+    logger = log.Log(log.INFO)
+    conf = Config(logger)
+    conf.setup(options)
+    conf.dump()
diff --git a/wrappers/numpy/conf/mpidistutils.py b/wrappers/numpy/conf/mpidistutils.py
new file mode 100644
index 0000000..6fe9b80
--- /dev/null
+++ b/wrappers/numpy/conf/mpidistutils.py
@@ -0,0 +1,1534 @@
+# Author:  Lisandro Dalcin
+# Contact: dalcinl at gmail.com
+
+"""
+Support for building mpi4py with distutils.
+"""
+
+# -----------------------------------------------------------------------------
+
+import sys
+if sys.version[:3] == '3.0':
+    from distutils import version
+    version.cmp = lambda a, b : (a > b) - (a < b)
+    del version
+del sys
+
+# -----------------------------------------------------------------------------
+
+import sys, os, platform, re
+from distutils import sysconfig
+from distutils.util  import convert_path
+from distutils.util  import split_quoted
+from distutils.spawn import find_executable
+from distutils import log
+
+def fix_config_vars(names, values):
+    values = list(values)
+    if sys.platform == 'darwin':
+        if 'ARCHFLAGS' in os.environ:
+            ARCHFLAGS = os.environ['ARCHFLAGS']
+            for i, flag in enumerate(list(values)):
+                flag, count = re.subn('-arch\s+\w+', ' ', flag)
+                if count and ARCHFLAGS:
+                    flag = flag + ' ' + ARCHFLAGS
+                values[i] = flag
+        if 'SDKROOT' in os.environ:
+            SDKROOT = os.environ['SDKROOT']
+            for i, flag in enumerate(list(values)):
+                flag, count = re.subn('-isysroot [^ \t]*', ' ', flag)
+                if count and SDKROOT:
+                    flag = flag + ' ' + '-isysroot ' + SDKROOT
+                values[i] = flag
+    return values
+
+def get_config_vars(*names):
+    # Core Python configuration
+    values = sysconfig.get_config_vars(*names)
+    # Do any distutils flags fixup right now
+    values = fix_config_vars(names, values)
+    return values
+
+def fix_compiler_cmd(cc, mpicc):
+    if not mpicc: return cc
+    if not cc:    return mpicc
+    from os.path import basename
+    cc = split_quoted(cc)
+    i = 0
+    while basename(cc[i]) == 'env':
+        i = 1
+        while '=' in cc[i]:
+            i = i + 1
+    cc[i] = mpicc
+    return ' '.join(cc)
+
+def fix_linker_cmd(ld, mpild):
+    if not mpild: return ld
+    if not ld:    return mpild
+    from os.path import basename
+    ld = split_quoted(ld)
+    i = 0
+    if (sys.platform.startswith('aix') and
+        basename(ld[i]) == 'ld_so_aix'):
+        i = i + 1
+    while basename(ld[i]) == 'env':
+        i = i + 1
+        while '=' in ld[i]:
+            i = i + 1
+    ld[i] = mpild
+    return ' '.join(ld)
+
+def split_linker_cmd(ld):
+    from os.path import basename
+    ld = split_quoted(ld)
+    i = 0
+    if (sys.platform.startswith('aix') and
+        basename(pyld[i]) == 'ld_so_aix'):
+        i = i + 1
+    while basename(ld[i]) == 'env':
+        i = i + 1
+        while '=' in ld[i]:
+            i = i + 1
+    p = i + 1
+    ld, flags = ' '.join(ld[:p]), ' '.join(ld[p:])
+    return ld, flags
+
+from distutils.unixccompiler import UnixCCompiler
+rpath_option_orig = UnixCCompiler.runtime_library_dir_option
+def rpath_option(compiler, dir):
+    option = rpath_option_orig(compiler, dir)
+    if sys.platform.startswith('linux'):
+        if option.startswith('-R'):
+            option =  option.replace('-R', '-Wl,-rpath,', 1)
+        elif option.startswith('-Wl,-R,'):
+            option =  option.replace('-Wl,-R,', '-Wl,-rpath,', 1)
+    return option
+UnixCCompiler.runtime_library_dir_option = rpath_option
+
+def customize_compiler(compiler, lang=None,
+                       mpicc=None, mpicxx=None, mpild=None,
+                       environ=None):
+    if environ is None:
+        environ = os.environ
+    if compiler.compiler_type == 'unix':
+        # Distutils configuration, actually obtained by parsing
+        # :file:{prefix}/lib[32|64]/python{X}.{Y}/config/Makefile
+        (cc, cxx, ccshared, ld,
+         basecflags, opt) = get_config_vars (
+            'CC', 'CXX', 'CCSHARED', 'LDSHARED',
+            'BASECFLAGS', 'OPT')
+        cc  = cc  .replace('-pthread', '')
+        cxx = cxx .replace('-pthread', '')
+        ld  = ld  .replace('-pthread', '')
+        ld, ldshared = split_linker_cmd(ld)
+        basecflags, opt = basecflags or '', opt or ''
+        ccshared = ccshared or ''
+        ldshared = ldshared or ''
+        # Compiler command overriding
+        if not mpild and (mpicc or mpicxx):
+            if lang == 'c':
+                mpild = mpicc
+            elif lang == 'c++':
+                mpild = mpicxx
+            else:
+                mpild = mpicc or mpicxx
+        if mpicc:
+            cc = fix_compiler_cmd(cc, mpicc)
+        if mpicxx:
+            cxx = fix_compiler_cmd(cxx, mpicxx)
+        if mpild:
+            ld = fix_linker_cmd(ld, mpild)
+        # Environment handling
+        cppflags = cflags = cxxflags = ldflags = ''
+        CPPFLAGS = environ.get('CPPFLAGS', '')
+        CFLAGS   = environ.get('CFLAGS',   '')
+        CXXFLAGS = environ.get('CXXFLAGS', '')
+        LDFLAGS  = environ.get('LDFLAGS',  '')
+        if CPPFLAGS:
+            cppflags = cppflags + ' ' + CPPFLAGS
+            cflags   = cflags   + ' ' + CPPFLAGS
+            cxxflags = cxxflags + ' ' + CPPFLAGS
+            ldflags  = ldflags  + ' ' + CPPFLAGS
+        if CFLAGS:
+            cflags   = cflags   + ' ' + CFLAGS
+            ldflags  = ldflags  + ' ' + CFLAGS
+        if CXXFLAGS:
+            cxxflags = cxxflags + ' ' + CXXFLAGS
+            ldflags  = ldflags  + ' ' + CXXFLAGS
+        if LDFLAGS:
+            ldflags  = ldflags  + ' ' + LDFLAGS
+        basecflags = environ.get('BASECFLAGS', basecflags)
+        opt        = environ.get('OPT',        opt       )
+        ccshared   = environ.get('CCSHARED', ccshared)
+        ldshared   = environ.get('LDSHARED', ldshared)
+        cflags     = ' '.join((basecflags, opt, cflags))
+        cxxflags   = ' '.join((basecflags, opt, cxxflags))
+        cxxflags = cxxflags.replace('-Wstrict-prototypes', '')
+        # Distutils compiler setup
+        cpp    = os.environ.get('CPP') or (cc + ' -E')
+        cc_so  = cc  + ' ' + ccshared
+        cxx_so = cxx + ' ' + ccshared
+        ld_so  = ld  + ' ' + ldshared
+        compiler.set_executables(
+            preprocessor = cpp    + ' ' + cppflags,
+            compiler     = cc     + ' ' + cflags,
+            compiler_so  = cc_so  + ' ' + cflags,
+            compiler_cxx = cxx_so + ' ' + cxxflags,
+            linker_so    = ld_so  + ' ' + ldflags,
+            linker_exe   = ld     + ' ' + ldflags,
+            )
+        try: compiler.compiler_cxx.remove('-Wstrict-prototypes')
+        except: pass
+    if compiler.compiler_type == 'mingw32':
+        compiler.set_executables(
+            preprocessor = 'gcc -mno-cygwin -E',
+            )
+    if compiler.compiler_type in ('unix', 'cygwin', 'mingw32'):
+        if lang == 'c++':
+            def find_cmd_pos(cmd):
+                pos = 0
+                if os.path.basename(cmd[pos]) == "env":
+                    pos = 1
+                    while '=' in cmd[pos]:
+                        pos = pos + 1
+                return pos
+            i = find_cmd_pos(compiler.compiler_so)
+            j = find_cmd_pos(compiler.compiler_cxx)
+            compiler.compiler_so[i] = compiler.compiler_cxx[j]
+            try: compiler.compiler_so.remove('-Wstrict-prototypes')
+            except: pass
+    if compiler.compiler_type == 'msvc':
+        if not compiler.initialized:
+            compiler.initialize()
+        compiler.ldflags_shared.append('/MANIFEST')
+        compiler.ldflags_shared_debug.append('/MANIFEST')
+
+# -----------------------------------------------------------------------------
+
+try:
+    from mpiconfig import Config
+except ImportError:
+    from conf.mpiconfig import Config
+
+def configuration(command_obj, verbose=True):
+    config = Config()
+    config.setup(command_obj)
+    if verbose:
+        if config.section and config.filename:
+            log.info("MPI configuration: [%s] from '%s'",
+                     config.section, ','.join(config.filename))
+            config.info(log)
+    return config
+
+def configure_compiler(compiler, config, lang=None):
+    #
+    mpicc  = config.get('mpicc')
+    mpicxx = config.get('mpicxx')
+    mpild  = config.get('mpild')
+    customize_compiler(compiler, lang,
+                       mpicc=mpicc, mpicxx=mpicxx, mpild=mpild)
+    #
+    for k, v in config.get('define_macros', []):
+        compiler.define_macro(k, v)
+    for v in config.get('undef_macros', []):
+        compiler.undefine_macro(v)
+    for v in config.get('include_dirs', []):
+        compiler.add_include_dir(v)
+    for v in config.get('libraries', []):
+        compiler.add_library(v)
+    for v in config.get('library_dirs', []):
+        compiler.add_library_dir(v)
+    for v in config.get('runtime_library_dirs', []):
+        compiler.add_runtime_library_dir(v)
+    for v in config.get('extra_objects', []):
+        compiler.add_link_object(v)
+    if compiler.compiler_type in \
+        ('unix', 'intel', 'cygwin', 'mingw32'):
+        cc_args = config.get('extra_compile_args', [])
+        ld_args = config.get('extra_link_args', [])
+        compiler.compiler += cc_args
+        compiler.compiler_so += cc_args
+        compiler.compiler_cxx += cc_args
+        compiler.linker_so += ld_args
+        compiler.linker_exe += ld_args
+    return compiler
+
+# -----------------------------------------------------------------------------
+
+try:
+    from mpiscanner import Scanner
+except ImportError:
+    try:
+        from conf.mpiscanner import Scanner
+    except ImportError:
+        class Scanner(object):
+            def parse_file(self, *args):
+                raise NotImplementedError(
+                    "You forgot to grab 'mpiscanner.py'")
+
+class ConfigureMPI(object):
+
+    SRCDIR = 'src'
+    SOURCES = [os.path.join('include', 'mpi4py', 'mpi.pxi')]
+    DESTDIR = 'src'
+    CONFIG_H = 'config.h'
+    MISSING_H = 'missing.h'
+
+    def __init__(self, config_cmd):
+        self.scanner = Scanner()
+        for filename in self.SOURCES:
+            fullname = os.path.join(self.SRCDIR, filename)
+            self.scanner.parse_file(fullname)
+        self.config_cmd = config_cmd
+
+    def run(self):
+        results = []
+        for name, code in self.scanner.itertests():
+            log.info("checking for '%s' ..." % name)
+            body = self.gen_one(results, code)
+            ok   = self.run_one(body)
+            if not ok:
+                log.info("**** failed check for '%s'" % name)
+            results.append((name, ok))
+        return results
+
+    def dump(self, results):
+        destdir = self.DESTDIR
+        config_h  = os.path.join(destdir, self.CONFIG_H)
+        missing_h = os.path.join(destdir, self.MISSING_H)
+        log.info("writing '%s'", config_h)
+        self.scanner.dump_config_h(config_h, results)
+        log.info("writing '%s'", missing_h)
+        self.scanner.dump_missing_h(missing_h, None)
+
+    def gen_one(self, results, code):
+        #
+        configtest_h = "_configtest.h"
+        self.config_cmd.temp_files.insert(0, configtest_h)
+        fh = open(configtest_h, "w")
+        try:
+            sep = "/* " + ('-'*72)+ " */\n"
+            fh.write(sep)
+            self.scanner.dump_config_h(fh, results)
+            fh.write(sep)
+            self.scanner.dump_missing_h(fh, results)
+            fh.write(sep)
+        finally:
+            fh.close()
+        #
+        body = ['#include "%s"' % configtest_h,
+                'int main(int argc, char **argv) {',
+                '  %s' % code,
+                '  return 0;',
+                '}']
+        body = '\n'.join(body) + '\n'
+        return body
+
+    def run_one(self, body, lang='c'):
+        ok = self.config_cmd.try_link(body, headers=['mpi.h'], lang=lang)
+        return ok
+
+# -----------------------------------------------------------------------------
+
+cmd_mpi_opts = [
+
+    ('mpild=',   None,
+     "MPI linker command, "
+     "overridden by environment variable 'MPILD' "
+     "(defaults to 'mpicc' or 'mpicxx' if any is available)"),
+
+    ('mpif77=',  None,
+     "MPI F77 compiler command, "
+     "overridden by environment variable 'MPIF77' "
+     "(defaults to 'mpif77' if available)"),
+
+    ('mpif90=',  None,
+     "MPI F90 compiler command, "
+     "overridden by environment variable 'MPIF90' "
+     "(defaults to 'mpif90' if available)"),
+
+    ('mpif95=',  None,
+     "MPI F95 compiler command, "
+     "overridden by environment variable 'MPIF95' "
+     "(defaults to 'mpif95' if available)"),
+
+    ('mpicxx=',  None,
+     "MPI C++ compiler command, "
+     "overridden by environment variable 'MPICXX' "
+     "(defaults to 'mpicxx', 'mpiCC', or 'mpic++' if any is available)"),
+
+    ('mpicc=',   None,
+     "MPI C compiler command, "
+     "overridden by environment variables 'MPICC' "
+     "(defaults to 'mpicc' if available)"),
+
+    ('mpi=',     None,
+     "specify a configuration section, "
+     "and an optional list of configuration files "
+     + "(e.g. --mpi=section,file1" + os.path.pathsep + "file2), " +
+     "to look for MPI includes/libraries, "
+     "overridden by environment variable 'MPICFG' "
+     "(defaults to section 'mpi' in configuration file 'mpi.cfg')"),
+
+    ('configure', None,
+     "exhaustive test for checking missing MPI constants/types/functions"),
+
+    ]
+
+def cmd_get_mpi_options(cmd_opts):
+    optlist = []
+    for (option, _, _) in cmd_opts:
+        if option[-1] == '=':
+            option = option[:-1]
+        option = option.replace('-','_')
+        optlist.append(option)
+    return optlist
+
+def cmd_initialize_mpi_options(cmd):
+    mpiopts = cmd_get_mpi_options(cmd_mpi_opts)
+    for op in mpiopts:
+        setattr(cmd, op, None)
+
+def cmd_set_undefined_mpi_options(cmd, basecmd):
+    mpiopts = cmd_get_mpi_options(cmd_mpi_opts)
+    optlist = tuple(zip(mpiopts, mpiopts))
+    cmd.set_undefined_options(basecmd, *optlist)
+
+# -----------------------------------------------------------------------------
+
+from distutils.core import setup        as fcn_setup
+from distutils.core import Distribution as cls_Distribution
+from distutils.core import Extension    as cls_Extension
+from distutils.core import Command
+
+from distutils.command import config  as cmd_config
+from distutils.command import build   as cmd_build
+from distutils.command import install as cmd_install
+from distutils.command import sdist   as cmd_sdist
+from distutils.command import clean   as cmd_clean
+
+from distutils.command import build_py     as cmd_build_py
+from distutils.command import build_clib   as cmd_build_clib
+from distutils.command import build_ext    as cmd_build_ext
+from distutils.command import install_data as cmd_install_data
+from distutils.command import install_lib  as cmd_install_lib
+
+from distutils.errors import DistutilsError
+from distutils.errors import DistutilsSetupError
+from distutils.errors import DistutilsPlatformError
+from distutils.errors import DistutilsOptionError
+from distutils.errors import CCompilerError
+
+# -----------------------------------------------------------------------------
+
+# Distribution class supporting a 'executables' keyword
+
+class Distribution(cls_Distribution):
+
+    def __init__ (self, attrs=None):
+        # support for pkg data
+        self.package_data = {}
+        # PEP 314
+        self.provides = None
+        self.requires = None
+        self.obsoletes = None
+        # supports 'executables' keyword
+        self.executables = None
+        cls_Distribution.__init__(self, attrs)
+
+    def has_executables(self):
+        return self.executables and len(self.executables) > 0
+
+    def is_pure (self):
+        return (cls_Distribution.is_pure(self) and
+                not self.has_executables())
+
+# Extension class
+
+class Extension(cls_Extension):
+    def __init__ (self, **kw):
+        optional = kw.pop('optional', None)
+        configure = kw.pop('configure', None)
+        cls_Extension.__init__(self, **kw)
+        self.optional = optional
+        self.configure = configure
+
+# Library class
+
+class Library(Extension):
+    def __init__ (self, **kw):
+        kind = kw.pop('kind', "static")
+        package = kw.pop('package', None)
+        dest_dir = kw.pop('dest_dir', None)
+        Extension.__init__(self, **kw)
+        self.kind = kind
+        self.package = package
+        self.dest_dir = dest_dir
+
+# Executable class
+
+class Executable(Extension):
+    def __init__ (self, **kw):
+        package = kw.pop('package', None)
+        dest_dir = kw.pop('dest_dir', None)
+        Extension.__init__(self, **kw)
+        self.package = package
+        self.dest_dir = dest_dir
+
+# setup function
+
+def setup(**attrs):
+    if 'distclass' not in attrs:
+        attrs['distclass'] = Distribution
+    if 'cmdclass' not in attrs:
+        attrs['cmdclass'] = {}
+    cmdclass = attrs['cmdclass']
+    for cmd in (config, build, install,
+                test, clean, sdist,
+                build_src, build_py,
+                build_clib, build_ext, build_exe,
+                install_lib, install_data, install_exe,
+                ):
+        if cmd.__name__ not in cmdclass:
+            cmdclass[cmd.__name__] = cmd
+    return fcn_setup(**attrs)
+
+# -----------------------------------------------------------------------------
+
+# A minimalistic MPI program :-)
+
+ConfigTest = """\
+int main(int argc, char **argv)
+{
+  int ierr;
+  ierr = MPI_Init(&argc, &argv);
+  if (ierr) return -1;
+  ierr = MPI_Finalize();
+  if (ierr) return -1;
+  return 0;
+}
+"""
+
+class config(cmd_config.config):
+
+    user_options = cmd_config.config.user_options + cmd_mpi_opts
+
+    def initialize_options (self):
+        cmd_config.config.initialize_options(self)
+        cmd_initialize_mpi_options(self)
+        self.noisy = 0
+
+    def finalize_options (self):
+        cmd_config.config.finalize_options(self)
+        if not self.noisy:
+            self.dump_source = 0
+
+    def _clean(self, *a, **kw):
+        if sys.platform.startswith('win'):
+            for fn in ('_configtest.exe.manifest', ):
+                if os.path.exists(fn):
+                    self.temp_files.append(fn)
+        cmd_config.config._clean(self, *a, **kw)
+
+    def check_header (self, header, headers=None, include_dirs=None):
+        if headers is None: headers = []
+        log.info("checking for header '%s' ..." % header)
+        body = "int main(int n, char**v) { return 0; }"
+        ok = self.try_compile(body, list(headers) + [header], include_dirs)
+        log.info(ok and 'success!' or 'failure.')
+        return ok
+
+    def check_macro (self, macro, headers=None, include_dirs=None):
+        log.info("checking for macro '%s' ..." % macro)
+        body = ("#ifndef %s\n"
+                "#error macro '%s' not defined\n"
+                "#endif\n") % (macro, macro)
+        body += "int main(int n, char**v) { return 0; }\n"
+        ok = self.try_compile(body, headers, include_dirs)
+        return ok
+
+    def check_library (self, library, library_dirs=None,
+                   headers=None, include_dirs=None,
+                   other_libraries=[], lang="c"):
+        log.info("checking for library '%s' ..." % library)
+        body = "int main(int n, char**v) { return 0; }"
+        ok = self.try_link(body,  headers, include_dirs,
+                           [library]+other_libraries, library_dirs,
+                           lang=lang)
+        return ok
+
+    def check_function (self, function,
+                        headers=None, include_dirs=None,
+                        libraries=None, library_dirs=None,
+                        decl=0, call=0, lang="c"):
+        log.info("checking for function '%s' ..." % function)
+        body = []
+        if decl:
+            if call: proto = "int %s (void);"
+            else:    proto = "int %s;"
+            if lang == "c":
+                proto = "\n".join([
+                        "#ifdef __cplusplus",
+                        "extern \"C\"",
+                        "#endif", proto])
+            body.append(proto % function)
+        body.append(    "int main (int n, char**v) {")
+        if call:
+            body.append("  (void)%s();" % function)
+        else:
+            body.append("  %s;" % function)
+        body.append(    "  return 0;")
+        body.append(    "}")
+        body = "\n".join(body) + "\n"
+        ok = self.try_link(body, headers, include_dirs,
+                           libraries, library_dirs, lang=lang)
+        return ok
+
+    def check_symbol (self, symbol, type="int",
+                      headers=None, include_dirs=None,
+                      libraries=None, library_dirs=None,
+                      decl=0, lang="c"):
+        log.info("checking for symbol '%s' ..." % symbol)
+        body = []
+        if decl:
+            body.append("%s %s;" % (type, symbol))
+        body.append("int main (int n, char**v) {")
+        body.append("  %s v; v = %s;" % (type, symbol))
+        body.append("  return 0;")
+        body.append("}")
+        body = "\n".join(body) + "\n"
+        ok = self.try_link(body, headers, include_dirs,
+                           libraries, library_dirs, lang=lang)
+        return ok
+
+    check_hdr  = check_header
+    check_lib  = check_library
+    check_func = check_function
+    check_sym  = check_symbol
+
+    def run (self):
+        #
+        config = configuration(self, verbose=True)
+        # test MPI C compiler
+        self.compiler = getattr(
+            self.compiler, 'compiler_type', self.compiler)
+        self._check_compiler()
+        configure_compiler(self.compiler, config, lang='c')
+        self.try_link(ConfigTest, headers=['mpi.h'], lang='c')
+        # test MPI C++ compiler
+        self.compiler = getattr(
+            self.compiler, 'compiler_type', self.compiler)
+        self._check_compiler()
+        configure_compiler(self.compiler, config, lang='c++')
+        self.try_link(ConfigTest, headers=['mpi.h'], lang='c++')
+
+
+class build(cmd_build.build):
+
+    user_options = cmd_build.build.user_options + cmd_mpi_opts
+
+    def initialize_options(self):
+        cmd_build.build.initialize_options(self)
+        cmd_initialize_mpi_options(self)
+
+    def finalize_options(self):
+        cmd_build.build.finalize_options(self)
+        config_cmd = self.get_finalized_command('config')
+        if isinstance(config_cmd, config):
+            cmd_set_undefined_mpi_options(self, 'config')
+
+    def has_executables (self):
+        return self.distribution.has_executables()
+
+    sub_commands = \
+        [('build_src', lambda *args: True)] + \
+        cmd_build.build.sub_commands + \
+        [('build_exe', has_executables),
+         ]
+
+
+class build_src(Command):
+    description = "build C sources from Cython files"
+    user_options = [
+        ('force', 'f',
+         "forcibly build everything (ignore file timestamps)"),
+        ]
+    boolean_options = ['force']
+    def initialize_options(self):
+        self.force = False
+    def finalize_options(self):
+        self.set_undefined_options('build',
+                                   ('force', 'force'),
+                                   )
+    def run(self):
+        pass
+
+
+class build_py(cmd_build_py.build_py):
+
+  if sys.version[:3] < '2.4':
+
+    def initialize_options(self):
+        self.package_data = None
+        cmd_build_py.build_py.initialize_options(self)
+
+    def finalize_options (self):
+        cmd_build_py.build_py.finalize_options(self)
+        self.package_data = self.distribution.package_data
+        self.data_files = self.get_data_files()
+
+    def run(self):
+        cmd_build_py.build_py.run(self)
+        if self.packages:
+            self.build_package_data()
+
+    def get_data_files (self):
+        """Generate list of '(package,src_dir,build_dir,filenames)' tuples"""
+        data = []
+        if not self.packages:
+            return data
+        for package in self.packages:
+            # Locate package source directory
+            src_dir = self.get_package_dir(package)
+
+            # Compute package build directory
+            build_dir = os.path.join(*([self.build_lib] + package.split('.')))
+
+            # Length of path to strip from found files
+            plen = len(src_dir)+1
+
+            # Strip directory from globbed filenames
+            filenames = [
+                file[plen:] for file in self.find_data_files(package, src_dir)
+                ]
+            data.append((package, src_dir, build_dir, filenames))
+        return data
+
+    def find_data_files (self, package, src_dir):
+        """Return filenames for package's data files in 'src_dir'"""
+        from glob import glob
+        globs = (self.package_data.get('', [])
+                 + self.package_data.get(package, []))
+        files = []
+        for pattern in globs:
+            # Each pattern has to be converted to a platform-specific path
+            filelist = glob(os.path.join(src_dir, convert_path(pattern)))
+            # Files that match more than one pattern are only added once
+            files.extend([fn for fn in filelist if fn not in files])
+        return files
+
+    def get_package_dir (self, package):
+        """Return the directory, relative to the top of the source
+           distribution, where package 'package' should be found
+           (at least according to the 'package_dir' option, if any)."""
+        import string
+        path = string.split(package, '.')
+
+        if not self.package_dir:
+            if path:
+                return os.path.join(*path)
+            else:
+                return ''
+        else:
+            tail = []
+            while path:
+                try:
+                    pdir = self.package_dir[string.join(path, '.')]
+                except KeyError:
+                    tail.insert(0, path[-1])
+                    del path[-1]
+                else:
+                    tail.insert(0, pdir)
+                    return os.path.join(*tail)
+            else:
+                pdir = self.package_dir.get('')
+                if pdir is not None:
+                    tail.insert(0, pdir)
+
+                if tail:
+                    return os.path.join(*tail)
+                else:
+                    return ''
+
+    def build_package_data (self):
+        """Copy data files into build directory"""
+        lastdir = None
+        for package, src_dir, build_dir, filenames in self.data_files:
+            for filename in filenames:
+                target = os.path.join(build_dir, filename)
+                self.mkpath(os.path.dirname(target))
+                self.copy_file(os.path.join(src_dir, filename), target,
+                               preserve_mode=False)
+
+
+# Command class to build libraries
+
+class build_clib(cmd_build_clib.build_clib):
+
+    user_options = [
+        ('build-clib-a=', 's',
+         "directory to build C/C++ static libraries to"),
+        ('build-clib-so=', 's',
+         "directory to build C/C++ shared libraries to"),
+        ]
+
+    user_options += cmd_build_clib.build_clib.user_options + cmd_mpi_opts
+
+    def initialize_options (self):
+        self.libraries = None
+        self.libraries_a = []
+        self.libraries_so = []
+
+        self.library_dirs = None
+        self.rpath = None
+        self.link_objects = None
+
+        self.build_lib = None
+        self.build_clib_a = None
+        self.build_clib_so = None
+        cmd_build_clib.build_clib.initialize_options(self)
+        cmd_initialize_mpi_options(self)
+
+    def finalize_options (self):
+        cmd_build_clib.build_clib.finalize_options(self)
+        build_cmd = self.get_finalized_command('build')
+        if isinstance(build_cmd,  build):
+            cmd_set_undefined_mpi_options(self, 'build')
+        #
+        self.set_undefined_options('build',
+                                   ('build_lib', 'build_lib'),
+                                   ('build_lib', 'build_clib_a'),
+                                   ('build_lib', 'build_clib_so'))
+        #
+        if self.libraries:
+            libraries = self.libraries[:]
+            self.libraries = []
+            self.check_library_list (libraries)
+            for i, lib in enumerate(libraries):
+                if isinstance(lib, Library):
+                    if lib.kind == "static":
+                        self.libraries_a.append(lib)
+                    else:
+                        self.libraries_so.append(lib)
+                else:
+                    self.libraries.append(lib)
+
+    def check_library_list (self, libraries):
+        ListType, TupleType = type([]), type(())
+        if not isinstance(libraries, ListType):
+            raise DistutilsSetupError(
+                "'libraries' option must be a list of "
+                "Library instances or 2-tuples")
+        for lib in libraries:
+            #
+            if isinstance(lib, Library):
+                lib_name = lib.name
+                build_info = lib.__dict__
+            elif isinstance(lib, TupleType) and len(lib) == 2:
+                lib_name, build_info = lib
+            else:
+                raise DistutilsSetupError(
+                    "each element of 'libraries' option must be an "
+                    "Library instance or 2-tuple")
+            #
+            if not isinstance(lib_name, str):
+                raise DistutilsSetupError(
+                    "first element of each tuple in 'libraries' "
+                    "must be a string (the library name)")
+            if '/' in lib_name or (os.sep != '/' and os.sep in lib_name):
+                raise DistutilsSetupError(
+                    "bad library name '%s': "
+                    "may not contain directory separators" % lib[0])
+            if not isinstance(build_info, dict):
+                raise DistutilsSetupError(
+                    "second element of each tuple in 'libraries' "
+                    "must be a dictionary (build info)")
+            lib_type = build_info.get('kind', 'static')
+            if lib_type not in ('static', 'shared', 'dylib'):
+                raise DistutilsSetupError(
+                    "in 'kind' option (library '%s'), "
+                    "'kind' must be one of "
+                    " \"static\", \"shared\", \"dylib\"" % lib_name)
+            sources = build_info.get('sources')
+            if (sources is None or
+                type(sources) not in (ListType, TupleType)):
+                raise DistutilsSetupError(
+                    "in 'libraries' option (library '%s'), "
+                    "'sources' must be present and must be "
+                    "a list of source filenames" % lib_name)
+            depends = build_info.get('depends')
+            if (depends is not None and
+                type(depends) not in (ListType, TupleType)):
+                raise DistutilsSetupError(
+                    "in 'libraries' option (library '%s'), "
+                    "'depends' must be a list "
+                    "of source filenames" % lib_name)
+
+    def run (self):
+        cmd_build_clib.build_clib.run(self)
+        if (not self.libraries_a and
+            not self.libraries_so):
+            return
+        #
+        from distutils.ccompiler import new_compiler
+        self.compiler = new_compiler(compiler=self.compiler,
+                                     dry_run=self.dry_run,
+                                     force=self.force)
+        #
+        if self.define is not None:
+            for (name, value) in self.define:
+                self.compiler.define_macro(name, value)
+        if self.undef is not None:
+            for macro in self.undef:
+                self.compiler.undefine_macro(macro)
+        if self.include_dirs is not None:
+            self.compiler.set_include_dirs(self.include_dirs)
+        if self.library_dirs is not None:
+            self.compiler.set_library_dirs(self.library_dirs)
+        if self.rpath is not None:
+            self.compiler.set_runtime_library_dirs(self.rpath)
+        if self.link_objects is not None:
+            self.compiler.set_link_objects(self.link_objects)
+        #
+        config = configuration(self, verbose=True)
+        configure_compiler(self.compiler, config)
+        #
+        self.build_libraries(self.libraries)
+        self.build_libraries(self.libraries_a)
+        self.build_libraries(self.libraries_so)
+
+    def build_libraries (self, libraries):
+        for lib in libraries:
+            # old-style
+            if not isinstance(lib, Library):
+                cmd_build_clib.build_clib.build_libraries(self, [lib])
+                continue
+            # new-style
+            try:
+                self.build_library(lib)
+            except (DistutilsError, CCompilerError):
+                if not lib.optional: raise
+                e = sys.exc_info()[1]
+                self.warn('building library "%s" failed' % lib.name)
+                self.warn('%s' % e)
+
+    def config_library (self, lib):
+        if lib.configure:
+            config_cmd = self.get_finalized_command('config')
+            config_cmd.compiler = self.compiler # fix compiler
+            return lib.configure(lib, config_cmd)
+
+    def build_library(self, lib):
+        from distutils.dep_util import newer_group
+
+        sources = [convert_path(p) for p in lib.sources]
+        depends = [convert_path(p) for p in lib.depends]
+        depends = sources + depends
+
+        if lib.kind == "static":
+            build_dir = self.build_clib_a
+        else:
+            build_dir = self.build_clib_so
+        lib_fullpath = self.get_lib_fullpath(lib, build_dir)
+
+        if not (self.force or newer_group(depends, lib_fullpath, 'newer')):
+            log.debug("skipping '%s' %s library (up-to-date)",
+                      lib.name, lib.kind)
+            return
+
+        ok = self.config_library(lib)
+        log.info("building '%s' %s library", lib.name, lib.kind)
+
+        # First, compile the source code to object files in the library
+        # directory.  (This should probably change to putting object
+        # files in a temporary build directory.)
+        macros = lib.define_macros[:]
+        for undef in lib.undef_macros:
+            macros.append((undef,))
+
+        objects = self.compiler.compile(
+            sources,
+            depends=lib.depends,
+            output_dir=self.build_temp,
+            macros=macros,
+            include_dirs=lib.include_dirs,
+            extra_preargs=None,
+            extra_postargs=lib.extra_compile_args,
+            debug=self.debug,
+            )
+
+        if lib.kind == "static":
+            # Now "link" the object files together
+            # into a static library.
+            self.compiler.create_static_lib(
+                objects,
+                lib.name,
+                output_dir=os.path.dirname(lib_fullpath),
+                debug=self.debug,
+                )
+        else:
+            extra_objects = lib.extra_objects[:]
+            export_symbols = lib.export_symbols[:]
+            extra_link_args = lib.extra_link_args[:]
+            objects.extend(extra_objects)
+            if (self.compiler.compiler_type == 'msvc' and
+                export_symbols is not None):
+                output_dir = os.path.dirname(lib_fullpath)
+                implib_filename = self.compiler.library_filename(lib.name)
+                implib_file = os.path.join(output_dir, lib_fullpath)
+                extra_link_args.append ('/IMPLIB:' + implib_file)
+            # Detect target language, if not provided
+            src_language = self.compiler.detect_language(sources)
+            language = (lib.language or src_language)
+            # Now "link" the object files together
+            # into a shared library.
+            self.compiler.link(
+                self.compiler.SHARED_LIBRARY,
+                objects, lib_fullpath,
+                #
+                libraries=lib.libraries,
+                library_dirs=lib.library_dirs,
+                runtime_library_dirs=lib.runtime_library_dirs,
+                export_symbols=export_symbols,
+                extra_preargs=None,
+                extra_postargs=extra_link_args,
+                debug=self.debug,
+                target_lang=language,
+                )
+        return
+
+    def get_lib_fullpath (self, lib, build_dir):
+        package_dir = (lib.package or '').split('.')
+        dest_dir = convert_path(lib.dest_dir or '')
+        output_dir = os.path.join(build_dir, *package_dir+[dest_dir])
+        lib_type =  lib.kind
+        if sys.platform != 'darwin':
+            if lib_type == 'dylib':
+                lib_type = 'shared'
+        compiler = self.compiler # XXX
+        lib_fullpath = compiler.library_filename(
+            lib.name, lib_type=lib_type, output_dir=output_dir)
+        return lib_fullpath
+
+    def get_source_files (self):
+        filenames = cmd_build_clib.build_clib.get_source_files(self)
+        self.check_library_list(self.libraries)
+        self.check_library_list(self.libraries_a)
+        self.check_library_list(self.libraries_so)
+        for (lib_name, build_info) in self.libraries:
+            filenames.extend(build_info.get(sources, []))
+        for lib in self.libraries_so + self.libraries_a:
+            filenames.extend(lib.sources)
+        return filenames
+
+    def get_outputs (self):
+        outputs = []
+        for lib in self.libraries_a:
+            lib_fullpath = self.get_lib_fullpath(lib, self.build_clib_a)
+            outputs.append(lib_fullpath)
+        for lib in self.libraries_so:
+            lib_fullpath = self.get_lib_fullpath(lib, self.build_clib_so)
+            outputs.append(lib_fullpath)
+        return outputs
+
+
+# Command class to build extension modules
+
+class build_ext(cmd_build_ext.build_ext):
+
+    user_options = cmd_build_ext.build_ext.user_options + cmd_mpi_opts
+
+    def initialize_options(self):
+        cmd_build_ext.build_ext.initialize_options(self)
+        cmd_initialize_mpi_options(self)
+
+    def finalize_options(self):
+        cmd_build_ext.build_ext.finalize_options(self)
+        build_cmd = self.get_finalized_command('build')
+        if isinstance(build_cmd,  build):
+            cmd_set_undefined_mpi_options(self, 'build')
+        #
+        if ((sys.platform.startswith('linux') or
+             sys.platform.startswith('gnu') or
+             sys.platform.startswith('sunos')) and
+            sysconfig.get_config_var('Py_ENABLE_SHARED')):
+            py_version = sysconfig.get_python_version()
+            bad_pylib_dir = os.path.join(sys.prefix, "lib",
+                                         "python" + py_version,
+                                         "config")
+            try:
+                self.library_dirs.remove(bad_pylib_dir)
+            except ValueError:
+                pass
+            pylib_dir = sysconfig.get_config_var("LIBDIR")
+            if pylib_dir not in self.library_dirs:
+                self.library_dirs.append(pylib_dir)
+            if pylib_dir not in self.rpath:
+                self.rpath.append(pylib_dir)
+            if sys.exec_prefix == '/usr':
+                self.library_dirs.remove(pylib_dir)
+                self.rpath.remove(pylib_dir)
+
+    def run (self):
+        if self.distribution.has_c_libraries():
+            build_clib = self.get_finalized_command('build_clib')
+            if build_clib.libraries:
+                build_clib.run()
+        cmd_build_ext.build_ext.run(self)
+
+    def build_extensions(self):
+        # First, sanity-check the 'extensions' list
+        self.check_extensions_list(self.extensions)
+        # parse configuration file and configure compiler
+        config = configuration(self, verbose=True)
+        configure_compiler(self.compiler, config)
+        if self.compiler.compiler_type == "unix":
+            so_ext = sysconfig.get_config_var('SO')
+            self.compiler.shared_lib_extension = so_ext
+        self.config = config # XXX
+        # extra configuration, check for all MPI symbols
+        if self.configure:
+            log.info('testing for missing MPI symbols')
+            config_cmd = self.get_finalized_command('config')
+            config_cmd.compiler = self.compiler # fix compiler
+            configure = ConfigureMPI(config_cmd)
+            results = configure.run()
+            configure.dump(results)
+            #
+            macro = 'HAVE_CONFIG_H'
+            log.info("defining preprocessor macro '%s'" % macro)
+            self.compiler.define_macro(macro, 1)
+        # build extensions
+        for ext in self.extensions:
+            try:
+                self.build_extension(ext)
+            except (DistutilsError, CCompilerError):
+                if not ext.optional: raise
+                e = sys.exc_info()[1]
+                self.warn('building extension "%s" failed' % ext.name)
+                self.warn('%s' % e)
+
+    def config_extension (self, ext):
+        configure = getattr(ext, 'configure', None)
+        if configure:
+            config_cmd = self.get_finalized_command('config')
+            config_cmd.compiler = self.compiler # fix compiler
+            configure(ext, config_cmd)
+
+    def build_extension (self, ext):
+        from distutils.dep_util import newer_group
+        fullname = self.get_ext_fullname(ext.name)
+        filename = os.path.join(
+            self.build_lib, self.get_ext_filename(fullname))
+        depends = ext.sources + ext.depends
+        if not (self.force or newer_group(depends, filename, 'newer')):
+            log.debug("skipping '%s' extension (up-to-date)", ext.name)
+            return
+        #
+        self.config_extension(ext)
+        cmd_build_ext.build_ext.build_extension(self, ext)
+        #
+        # XXX -- this is a Vile HACK!
+        if ext.name == 'mpi4py.MPI':
+            dest_dir = os.path.dirname(filename)
+            self.mkpath(dest_dir)
+            mpi_cfg = os.path.join(dest_dir, 'mpi.cfg')
+            log.info("writing %s" % mpi_cfg)
+            if not self.dry_run:
+                self.config.dump(filename=mpi_cfg)
+
+    def get_outputs(self):
+        outputs = cmd_build_ext.build_ext.get_outputs(self)
+        for ext in self.extensions:
+            # XXX -- this is a Vile HACK!
+            if ext.name == 'mpi4py.MPI':
+                fullname = self.get_ext_fullname(ext.name)
+                filename = os.path.join(
+                    self.build_lib,
+                    self.get_ext_filename(fullname))
+                dest_dir = os.path.dirname(filename)
+                mpi_cfg = os.path.join(dest_dir, 'mpi.cfg')
+                outputs.append(mpi_cfg)
+        return outputs
+
+
+# Command class to build executables
+
+class build_exe(build_ext):
+
+    description = "build binary executable components"
+
+    user_options = [
+        ('build-exe=', None,
+         "build directory for executable components"),
+        ] + build_ext.user_options
+
+
+    def initialize_options (self):
+        build_ext.initialize_options(self)
+        self.build_base = None
+        self.build_exe  = None
+
+    def finalize_options (self):
+        build_ext.finalize_options(self)
+        self.configure = None
+        self.set_undefined_options('build',
+                                   ('build_base','build_base'),
+                                   ('build_lib', 'build_exe'))
+        #from distutils.util import get_platform
+        #plat_specifier = ".%s-%s" % (get_platform(), sys.version[0:3])
+        #if hasattr(sys, 'gettotalrefcount') and sys.version[0:3] > '2.5':
+        #    plat_specifier += '-pydebug'
+        #if self.build_exe is None:
+        #    self.build_exe = os.path.join(self.build_base,
+        #                                  'exe' + plat_specifier)
+        self.executables = self.distribution.executables
+        # XXX This is a hack
+        self.extensions  = self.distribution.executables
+        self.check_extensions_list = self.check_executables_list
+        self.build_extension = self.build_executable
+        self.get_ext_filename = self.get_exe_filename
+        self.build_lib = self.build_exe
+
+    def check_executables_list (self, executables):
+        ListType, TupleType = type([]), type(())
+        if type(executables) is not ListType:
+            raise DistutilsSetupError(
+                "'executables' option must be a list of Executable instances")
+        for exe in executables:
+            if not isinstance(exe, Executable):
+                raise DistutilsSetupError(
+                    "'executables' items must be Executable instances")
+            if (exe.sources is None or
+                type(exe.sources) not in (ListType, TupleType)):
+                raise DistutilsSetupError(
+                    ("in 'executables' option (executable '%s'), " +
+                     "'sources' must be present and must be " +
+                     "a list of source filenames") % exe.name)
+
+    def get_exe_filename(self, exe_name):
+        exe_ext = sysconfig.get_config_var('EXE') or ''
+        return exe_name + exe_ext
+
+    def get_exe_fullpath(self, exe, build_dir=None):
+        build_dir = build_dir or self.build_exe
+        package_dir = (exe.package or '').split('.')
+        dest_dir = convert_path(exe.dest_dir or '')
+        output_dir = os.path.join(build_dir, *package_dir+[dest_dir])
+        exe_filename = self.get_exe_filename(exe.name)
+        return os.path.join(output_dir, exe_filename)
+
+    def config_executable (self, exe):
+        build_ext.config_extension(self, exe)
+
+    def build_executable (self, exe):
+        from distutils.dep_util import newer_group
+        sources = list(exe.sources)
+        depends = list(exe.depends)
+        exe_fullpath = self.get_exe_fullpath(exe)
+        depends = sources + depends
+        if not (self.force or newer_group(depends, exe_fullpath, 'newer')):
+            log.debug("skipping '%s' executable (up-to-date)", exe.name)
+            return
+
+        self.config_executable(exe)
+        log.info("building '%s' executable", exe.name)
+
+        # Next, compile the source code to object files.
+
+        # XXX not honouring 'define_macros' or 'undef_macros' -- the
+        # CCompiler API needs to change to accommodate this, and I
+        # want to do one thing at a time!
+
+        macros = exe.define_macros[:]
+        for undef in exe.undef_macros:
+            macros.append((undef,))
+
+        # Two possible sources for extra compiler arguments:
+        #   - 'extra_compile_args' in Extension object
+        #   - CFLAGS environment variable (not particularly
+        #     elegant, but people seem to expect it and I
+        #     guess it's useful)
+        # The environment variable should take precedence, and
+        # any sensible compiler will give precedence to later
+        # command line args.  Hence we combine them in order:
+        extra_args = exe.extra_compile_args[:]
+
+        objects =  self.compiler.compile(
+            sources,
+            output_dir=self.build_temp,
+            macros=macros,
+            include_dirs=exe.include_dirs,
+            debug=self.debug,
+            extra_postargs=extra_args,
+            depends=exe.depends)
+        self._built_objects = objects[:]
+
+        # XXX -- this is a Vile HACK!
+        #
+        # Remove msvcrXX.dll when building executables with MinGW
+        #
+        if self.compiler.compiler_type == 'mingw32':
+            try: del self.compiler.dll_libraries[:]
+            except: pass
+
+        # Now link the object files together into a "shared object" --
+        # of course, first we have to figure out all the other things
+        # that go into the mix.
+        if exe.extra_objects:
+            objects.extend(exe.extra_objects)
+        extra_args = exe.extra_link_args[:]
+        # Get special linker flags for building a executable with
+        # bundled Python library, also fix location of needed
+        # python.exp file on AIX
+        ldshflag = sysconfig.get_config_var('LINKFORSHARED') or ''
+        ldshflag = ldshflag.replace('-Xlinker ', '-Wl,')
+        if sys.platform == 'darwin': # fix wrong framework paths
+            fwkprefix = sysconfig.get_config_var('PYTHONFRAMEWORKPREFIX')
+            fwkdir = sysconfig.get_config_var('PYTHONFRAMEWORKDIR')
+            if fwkprefix and fwkdir and fwkdir != 'no-framework':
+                for flag in split_quoted(ldshflag):
+                    if flag.startswith(fwkdir):
+                        fwkpath = os.path.join(fwkprefix, flag)
+                        ldshflag = ldshflag.replace(flag, fwkpath)
+        if sys.platform.startswith('aix'):
+            python_lib = sysconfig.get_python_lib(standard_lib=1)
+            python_exp = os.path.join(python_lib, 'config', 'python.exp')
+            ldshflag = ldshflag.replace('Modules/python.exp', python_exp)
+        # Detect target language, if not provided
+        language = exe.language or self.compiler.detect_language(sources)
+        self.compiler.link(
+            self.compiler.EXECUTABLE,
+            objects, exe_fullpath,
+            output_dir=None,
+            libraries=self.get_libraries(exe),
+            library_dirs=exe.library_dirs,
+            runtime_library_dirs=exe.runtime_library_dirs,
+            extra_preargs=split_quoted(ldshflag),
+            extra_postargs=extra_args,
+            debug=self.debug,
+            target_lang=language)
+
+    def get_outputs (self):
+        outputs = []
+        for exe in self.executables:
+            outputs.append(self.get_exe_fullpath(exe))
+        return outputs
+
+
+class install(cmd_install.install):
+
+    user_options = cmd_install.install.user_options + [
+        ('single-version-externally-managed', None,
+         "setuptools compatibility option"),
+    ]
+    boolean_options = cmd_install.install.boolean_options + [
+        'single-version-externally-managed',
+    ]
+
+    def initialize_options(self):
+        cmd_install.install.initialize_options(self)
+        self.single_version_externally_managed = None
+        self.no_compile = None
+
+    def has_lib (self):
+        return (cmd_install.install.has_lib(self) and
+                self.has_exe())
+
+    def has_exe (self):
+        return self.distribution.has_executables()
+
+    sub_commands = \
+        cmd_install.install.sub_commands[:] + \
+        [('install_exe', has_exe),
+         ]
+
+    # XXX disable install_exe subcommand !!!
+    del sub_commands[-1]
+
+
+class install_lib(cmd_install_lib.install_lib):
+
+    def get_outputs(self):
+        outputs = cmd_install_lib.install_lib.get_outputs(self)
+        for (build_cmd, build_dir) in (('build_clib', 'build_lib'),
+                                       ('build_exe',  'build_exe')):
+            outs = self._mutate_outputs(1, build_cmd, build_dir,
+                                        self.install_dir)
+            build_cmd = self.get_finalized_command(build_cmd)
+            build_files = build_cmd.get_outputs()
+            outputs.extend(outs)
+        return outputs
+
+
+class install_data (cmd_install_data.install_data):
+
+    def finalize_options (self):
+        self.set_undefined_options('install',
+                                   ('install_lib', 'install_dir'),
+                                   ('root', 'root'),
+                                   ('force', 'force'),
+                                   )
+
+
+class install_exe(cmd_install_lib.install_lib):
+
+    description = "install binary executable components"
+
+    user_options = [
+        ('install-dir=', 'd', "directory to install to"),
+        ('build-dir=','b', "build directory (where to install from)"),
+        ('force', 'f', "force installation (overwrite existing files)"),
+        ('skip-build', None, "skip the build steps"),
+        ]
+
+    boolean_options = ['force', 'skip-build']
+    negative_opt = { }
+
+    def initialize_options (self):
+        self.install_dir = None
+        self.build_dir = None
+        self.force = 0
+        self.skip_build = None
+
+    def finalize_options (self):
+        self.set_undefined_options('build_exe',
+                                   ('build_exe', 'build_dir'))
+        self.set_undefined_options('install',
+                                   ('force', 'force'),
+                                   ('skip_build', 'skip_build'),
+                                   ('install_scripts', 'install_dir'))
+
+    def run (self):
+        self.build()
+        self.install()
+
+    def build (self):
+        if not self.skip_build:
+            if self.distribution.has_executables():
+                self.run_command('build_exe')
+
+    def install (self):
+        self.outfiles = []
+        if self.distribution.has_executables():
+            build_exe = self.get_finalized_command('build_exe')
+            for exe in build_exe.executables:
+                exe_fullpath = build_exe.get_exe_fullpath(exe)
+                exe_filename = os.path.basename(exe_fullpath)
+                if (os.name == "posix" and
+                    exe_filename.startswith("python-")):
+                    install_name = exe_filename.replace(
+                        "python-","python%s-" % sys.version[:3])
+                    link = None
+                else:
+                    install_name = exe_fullpath
+                    link = None
+                source = exe_fullpath
+                target = os.path.join(self.install_dir, install_name)
+                self.mkpath(self.install_dir)
+                out, done = self.copy_file(source, target, link=link)
+                self.outfiles.append(out)
+
+    def get_outputs (self):
+        return self.outfiles
+
+    def get_inputs (self):
+        inputs = []
+        if self.distribution.has_executables():
+            build_exe = self.get_finalized_command('build_exe')
+            inputs.extend(build_exe.get_outputs())
+        return inputs
+
+
+class test(Command):
+    description = "run the test suite"
+    user_options = [
+        ('args=', None, "options"),
+        ]
+
+    def initialize_options(self):
+        self.args = None
+    def finalize_options(self):
+        if self.args:
+            self.args = split_quoted(self.args)
+        else:
+            self.args = []
+    def run(self):
+        pass
+
+
+class sdist(cmd_sdist.sdist):
+
+    def run (self):
+        build_src = self.get_finalized_command('build_src')
+        build_src.run()
+        cmd_sdist.sdist.run(self)
+
+
+class clean(cmd_clean.clean):
+
+    description = "clean up temporary files from 'build' command"
+    user_options = \
+        cmd_clean.clean.user_options[:2] + [
+        ('build-exe=', None,
+         "build directory for executable components "
+         "(default: 'build_exe.build-exe')"),
+        ] + cmd_clean.clean.user_options[2:]
+
+    def initialize_options(self):
+        cmd_clean.clean.initialize_options(self)
+        self.build_exe  = None
+
+    def finalize_options(self):
+        cmd_clean.clean.finalize_options(self)
+        self.set_undefined_options('build_exe',
+                                   ('build_exe', 'build_exe'))
+
+    def run(self):
+        from distutils.dir_util import remove_tree
+
+        # remove the build/temp.<plat> directory
+        # (unless it's already gone)
+        if os.path.exists(self.build_temp):
+            remove_tree(self.build_temp, dry_run=self.dry_run)
+        else:
+            log.debug("'%s' does not exist -- can't clean it",
+                      self.build_temp)
+
+        if self.all:
+            # remove build directories
+            for directory in (self.build_lib,
+                              self.build_exe,
+                              self.build_scripts,
+                              self.bdist_base,
+                              ):
+                if os.path.exists(directory):
+                    remove_tree(directory, dry_run=self.dry_run)
+                else:
+                    log.debug("'%s' does not exist -- can't clean it",
+                              directory)
+
+        # just for the heck of it, try to remove the base build directory:
+        # we might have emptied it right now, but if not we don't care
+        if not self.dry_run:
+            try:
+                os.rmdir(self.build_base)
+                log.info("removing '%s'", self.build_base)
+            except OSError:
+                pass
+
+# -----------------------------------------------------------------------------
+
+try:
+    import msilib
+    Directory_make_short = msilib.Directory.make_short
+    def make_short(self, file):
+        parts = file.split('.')
+        if len(parts) > 1:
+            file = '_'.join(parts[:-1])+'.'+parts[-1]
+        return Directory_make_short(self, file)
+    msilib.Directory.make_short = make_short
+except:
+    pass
+
+# -----------------------------------------------------------------------------
diff --git a/wrappers/numpy/conf/mpiregexes.py b/wrappers/numpy/conf/mpiregexes.py
new file mode 100644
index 0000000..eb00df8
--- /dev/null
+++ b/wrappers/numpy/conf/mpiregexes.py
@@ -0,0 +1,75 @@
+import re
+
+def join(*args):
+    tokens = []
+    for tok in args:
+        if isinstance(tok, (list, tuple)):
+            tok = '(%s)' % r'\s*'.join(tok)
+        tokens.append(tok)
+    return r'\s*'.join(tokens)
+
+lparen   = r'\('
+rparen   = r'\)'
+colon    = r'\:'
+asterisk = r'\*'
+eol      = r'$'
+
+enum    = join('enum', colon)
+typedef = 'ctypedef'
+pointer = asterisk
+struct  = join(typedef, 'struct')
+
+basic_type    = r'(?:void|int|char\s*\*{1,3})'
+struct_type   = r'MPI_(?:Status)'
+integral_type = r'MPI_(?:Aint|Offset)'
+opaque_type   = r'MPI_(?:Datatype|Request|Op|Info|Group|Errhandler|Comm|Win|File)'
+any_mpi_type  = r'(?:%s|%s|%s)' % (struct_type, integral_type, opaque_type)
+
+upper_name  = r'MPI_[A-Z0-9_]+'
+camel_name  = r'MPI_[A-Z][a-z0-9_]+'
+usrfun_name = camel_name + r'_(?:function|fn)'
+
+arg_list = r'.*'
+ret_type = r'void|int|double'
+
+
+canylong = join(r'long', r'(?:long)?')
+canyptr  = join(r'\w+', pointer+'?')
+
+annotation = r'\#\:\='
+defval = r'(?:%s)?' % join (annotation, [r'\(?[A-Za-z0-9_\+\-\(\)\*]+\)?'])
+
+STRUCT_TYPE   = join( struct,  [struct_type] , colon,  eol)
+INTEGRAL_TYPE = join( typedef, canylong, [integral_type], eol)
+OPAQUE_TYPE   = join( typedef, canyptr,  [opaque_type],   eol)
+FUNCTION_TYPE = join( typedef, [ret_type], [camel_name],
+                      lparen, [arg_list], rparen,
+                      defval, eol)
+
+ENUM_VALUE     = join( enum,          [upper_name], defval, eol)
+HANDLE_VALUE   = join( [opaque_type], [upper_name], defval, eol)
+BASICP_VALUE   = join( [basic_type,  pointer], [upper_name], defval , eol)
+STRUCTP_VALUE  = join( [struct_type, pointer], [upper_name], defval , eol)
+FUNCTP_VALUE   = join( [usrfun_name, pointer], [upper_name], defval , eol)
+FUNCTION_PROTO = join([ret_type], [camel_name],
+                      lparen, [arg_list], rparen,
+                      defval, eol)
+
+fint_type = r'MPI_Fint'
+c2f_name  = r'MPI_[A-Z][a-z_]+_c2f'
+f2c_name  = r'MPI_[A-Z][a-z_]+_f2c'
+
+FINT_TYPE    = join( typedef, canylong, [fint_type], eol)
+FINTP_VALUE  = join( [fint_type, pointer], [upper_name], defval , eol)
+FUNCTION_C2F = join([fint_type], [c2f_name],
+                    lparen, [opaque_type], rparen,
+                    defval, eol)
+FUNCTION_F2C = join([opaque_type], [f2c_name],
+                    lparen, [fint_type], rparen,
+                    defval, eol)
+
+
+# compile the RE's
+glb = globals()
+all = [key for key in dict(glb) if key.isupper()]
+for key in all: glb[key] = re.compile(glb[key])
diff --git a/wrappers/numpy/conf/mpiscanner.py b/wrappers/numpy/conf/mpiscanner.py
new file mode 100644
index 0000000..0f80e99
--- /dev/null
+++ b/wrappers/numpy/conf/mpiscanner.py
@@ -0,0 +1,342 @@
+# Very, very naive RE-based way for collecting declarations inside
+# 'cdef extern from *' Cython blocks in in source files, and next
+# generate compatibility headers for MPI-2 partially implemented or
+# built, or MPI-1 implementations, perhaps providing a subset of MPI-2
+
+from textwrap import dedent
+
+try:
+    import mpiregexes as Re
+except ImportError:
+    from conf import mpiregexes as Re
+
+
+class Node(object):
+
+    REGEX = None
+    def match(self, line):
+        m = self.REGEX.search(line)
+        if m: return m.groups()
+    match = classmethod(match)
+
+    CONFIG = None
+    HEADER = None
+
+    HEADER_HEAD = """\
+    #ifdef  PyMPI_MISSING_%(name)s
+    #undef  %(cname)s
+    """
+    HEADER_TAIL = """
+    #endif
+
+    """
+
+    def init(self, name, **kargs):
+        assert name is not None
+        self.name = name
+        self.__dict__.update(kargs)
+    def config(self):
+        return self.CONFIG % vars(self)
+    def header(self):
+        head = dedent(self.HEADER_HEAD)
+        body = dedent(self.HEADER)
+        tail = dedent(self.HEADER_TAIL)
+        return (head+body+tail) % vars(self)
+
+class NodeType(Node):
+    CONFIG = ('%(ctype)s v;\n'
+              '%(ctype)s *p = &v; *p=v;')
+    def __init__(self, ctype):
+        self.init(name=ctype,
+                  cname=ctype,
+                  ctype=ctype,)
+
+class NodeStruct(NodeType):
+    REGEX  = Re.STRUCT_TYPE
+    HEADER = """\
+    typedef struct PyMPI_%(ctype)s {
+    %(cfields)s
+    } PyMPI_%(ctype)s;
+    #define %(ctype)s PyMPI_%(ctype)s"""
+
+    def __init__(self, ctype, cfields):
+        super(NodeStruct, self).__init__(ctype)
+        self.cfields = '\n'.join(['  %s %s;' % field
+                                  for field in cfields])
+
+class NodeFuncType(NodeType):
+    HEADER = dedent("""\
+    typedef %(crett)s (PyMPI_%(cname)s)(%(cargs)s);
+    #define %(cname)s PyMPI_%(cname)s""")
+
+    def __init__(self, crett, cname, cargs, calias=None):
+        self.init(name=cname,
+                  cname=cname,
+                  ctype=cname+'*',)
+        self.crett = crett
+        self.cargs = cargs or 'void'
+        if calias is not None:
+            self.HEADER = '#define %(cname)s %(calias)s'
+            self.calias = calias
+
+class NodeValue(Node):
+    CONFIG = ('%(ctype)s v; v = %(cname)s;\n'
+              '%(ctype)s *p = &v; *p = %(cname)s;')
+    HEADER = '#define %(cname)s (%(calias)s)'
+    def __init__(self, ctype, cname, calias):
+        self.init(name=cname,
+                  cname=cname,
+                  ctype=ctype,
+                  calias=calias)
+
+def ctypefix(ct):
+    ct = ct.strip()
+    ct = ct.replace('[][3]',' (*)[3]')
+    ct = ct.replace('[]','*')
+    return ct
+
+class NodeFuncProto(Node):
+    CONFIG = '%(crett)s v; v = %(cname)s(%(cargscall)s); if(v)v=(%(crett)s)0;'
+    HEADER = ' '. join(['#define %(cname)s(%(cargsnamed)s)',
+                        'PyMPI_UNAVAILABLE("%(name)s"%(comma)s%(cargsnamed)s)'])
+    def __init__(self, crett, cname, cargs, calias=None):
+        self.init(name=cname,
+                  cname=cname)
+        self.crett = crett
+        if cargs == 'void': cargs = ''
+        if cargs:
+            cargs = cargs.split(',')
+            if cargs[-1].strip() == '...':
+                del cargs[-1]
+        else:
+            cargs = []
+        self.cargstype = cargs
+        nargs = len(cargs)
+        if nargs: self.comma = ','
+        else:     self.comma = ''
+        cargscall = ['(%s)0' % ctypefix(a) for a in cargs]
+        self.cargscall = ','.join(cargscall)
+        cargsnamed = ['a%d' % (a+1) for a in range(nargs)]
+        self.cargsnamed = ','.join(cargsnamed)
+        if calias is not None:
+            self.HEADER = '#define %(cname)s %(calias)s'
+            self.calias = calias
+
+class IntegralType(NodeType):
+    REGEX = Re.INTEGRAL_TYPE
+    HEADER = dedent("""\
+    typedef long PyMPI_%(ctype)s;
+    #define %(ctype)s PyMPI_%(ctype)s""")
+
+class OpaqueType(NodeType):
+    REGEX = Re.OPAQUE_TYPE
+    HEADER = dedent("""\
+    typedef void *PyMPI_%(ctype)s;
+    #define %(ctype)s PyMPI_%(ctype)s""")
+
+class StructType(NodeStruct):
+    def __init__(self, ctype):
+        cnames = ['MPI_SOURCE', 'MPI_TAG', 'MPI_ERROR']
+        cfields = list(zip(['int']*3, cnames))
+        super(StructType, self).__init__(ctype, cfields)
+
+class FunctionType(NodeFuncType):
+    REGEX = Re.FUNCTION_TYPE
+
+class EnumValue(NodeValue):
+    REGEX = Re.ENUM_VALUE
+    def __init__(self, cname, calias):
+        self.init(name=cname,
+                  cname=cname,
+                  ctype='int',
+                  calias=calias)
+
+class HandleValue(NodeValue):
+    REGEX = Re.HANDLE_VALUE
+    HEADER = '#define %(cname)s ((%(ctype)s)%(calias)s)'
+    #def __init__(self, *a, **k):
+    #    NodeValue.__init__(self, *a, **k)
+    #    print self.__dict__
+    #    if self.cname.endswith('_NULL'):
+    #        self.HEADER = '#define %(cname)s ((%(ctype)s)%(calias)s)'
+
+class BasicValuePtr(NodeValue):
+    REGEX = Re.BASICP_VALUE
+    HEADER = '#define %(cname)s ((%(ctype)s)%(calias)s)'
+
+class StructValuePtr(NodeValue):
+    REGEX = Re.STRUCTP_VALUE
+
+class FunctionValuePtr(NodeValue):
+    REGEX = Re.FUNCTP_VALUE
+
+class FunctionProto(NodeFuncProto):
+    REGEX = Re.FUNCTION_PROTO
+
+
+class FIntType(NodeType):
+    REGEX = Re.FINT_TYPE
+    HEADER = dedent("""\
+    typedef int PyMPI_%(ctype)s;
+    #define %(ctype)s PyMPI_%(ctype)s""")
+
+class FIntValuePtr(BasicValuePtr):
+    REGEX = Re.FINTP_VALUE
+
+class FunctionC2F(NodeFuncProto):
+    REGEX = Re.FUNCTION_C2F
+    HEADER = ' '. join(['#define %(cname)s(%(cargsnamed)s)',
+                        '((%(crett)s)0)'])
+
+class FunctionF2C(NodeFuncProto):
+    REGEX = Re.FUNCTION_F2C
+    HEADER = ' '. join(['#define %(cname)s(%(cargsnamed)s)',
+                        '%(cretv)s'])
+    def __init__(self, *a, **k):
+        NodeFuncProto.__init__(self, *a, **k)
+        self.cretv =  self.crett.upper() + '_NULL'
+
+class Scanner(object):
+
+    NODE_TYPES = [
+        FIntType, FIntValuePtr,
+        FunctionC2F, FunctionF2C,
+        IntegralType,
+        StructType, OpaqueType,
+        HandleValue, EnumValue,
+        BasicValuePtr, StructValuePtr,
+        FunctionType, FunctionValuePtr,
+        FunctionProto,
+        ]
+    def __init__(self):
+        self.nodes = []
+        self.nodemap = {}
+
+    def parse_file(self, filename):
+        fileobj = open(filename)
+        try: self.parse_lines(fileobj)
+        finally: fileobj.close()
+
+    def parse_lines(self, lines):
+        for line in lines:
+            self.parse_line(line)
+
+    def parse_line(self, line):
+        nodemap  = self.nodemap
+        nodelist = self.nodes
+        for nodetype in self.NODE_TYPES:
+            args = nodetype.match(line)
+            if args:
+                node = nodetype(*args)
+                assert node.name not in nodemap, node.name
+                nodemap[node.name] = len(nodelist)
+                nodelist.append(node)
+                break
+
+    def __iter__(self):
+        return iter(self.nodes)
+
+    def itertests(self):
+        for node in self:
+            yield (node.name, node.config())
+
+
+    CONFIG_HEAD = """\
+    #ifndef PyMPI_CONFIG_H
+    #define PyMPI_CONFIG_H
+
+    """
+    CONFIG_MACRO = '#define PyMPI_MISSING_%s 1\n'
+    CONFIG_TAIL = """\
+
+    #endif /* !PyMPI_CONFIG_H */
+    """
+    def dump_config_h(self, fileobj, suite):
+        if isinstance(fileobj, str):
+            fileobj = open(fileobj, 'w')
+            try: self.dump_config_h(fileobj, suite)
+            finally: fileobj.close()
+            return
+        head  = dedent(self.CONFIG_HEAD)
+        macro = dedent(self.CONFIG_MACRO)
+        tail  = dedent(self.CONFIG_TAIL)
+        fileobj.write(head)
+        if suite is None:
+            for node in self:
+                fileobj.write(macro % node.name)
+        else:
+            for name, result in suite:
+                assert name in self.nodemap
+                if not result:
+                    fileobj.write(macro % name)
+        fileobj.write(tail)
+
+    MISSING_HEAD = """\
+    #ifndef PyMPI_MISSING_H
+    #define PyMPI_MISSING_H
+
+    #ifndef PyMPI_UNUSED
+    # if defined(__GNUC__)
+    #   if !defined(__cplusplus) || (__GNUC__>3||(__GNUC__==3&&__GNUC_MINOR__>=4))
+    #     define PyMPI_UNUSED __attribute__ ((__unused__))
+    #   else
+    #     define PyMPI_UNUSED
+    #   endif
+    # elif defined(__INTEL_COMPILER) || defined(__ICC)
+    #   define PyMPI_UNUSED __attribute__ ((__unused__))
+    # else
+    #   define PyMPI_UNUSED
+    # endif
+    #endif
+
+    static PyMPI_UNUSED int PyMPI_UNAVAILABLE(const char *name,...) { return -1; }
+
+    """
+    MISSING_TAIL = """\
+    #endif /* !PyMPI_MISSING_H */
+    """
+    def dump_missing_h(self, fileobj, suite):
+        if isinstance(fileobj, str):
+            fileobj = open(fileobj, 'w')
+            try: self.dump_missing_h(fileobj, suite)
+            finally: fileobj.close()
+            return
+        head = dedent(self.MISSING_HEAD)
+        tail = dedent(self.MISSING_TAIL)
+        #
+        fileobj.write(head)
+        if suite is None:
+            for node in self:
+                fileobj.write(node.header())
+        else:
+            nodelist = self.nodes
+            nodemap = self.nodemap
+            for name, result in suite:
+                assert name in nodemap, name
+                if not result:
+                    node = nodelist[nodemap[name]]
+                    fileobj.write(node.header())
+        fileobj.write(tail)
+
+
+# -----------------------------------------
+
+
+if __name__ == '__main__':
+    import sys, os
+    sources = [os.path.join('src', 'include', 'mpi4py', 'mpi.pxi')]
+    log = lambda msg: sys.stderr.write(msg + '\n')
+    scanner = Scanner()
+    for filename in sources:
+        #filename = os.path.join('src', 'mpi4py', filename)
+        log('parsing file %s' % filename)
+        scanner.parse_file(filename)
+    log('processed %d definitions' % len(scanner.nodes))
+    config_h  = os.path.join('src', 'config.h')
+    missing_h = os.path.join('src', 'missing.h')
+    log('writing file %s' % config_h)
+    scanner.dump_config_h(config_h, None)
+    log('writing file %s' % missing_h)
+    scanner.dump_missing_h(missing_h, None)
+
+# -----------------------------------------
diff --git a/wrappers/numpy/doc/Makefile b/wrappers/numpy/doc/Makefile
new file mode 100644
index 0000000..51449e3
--- /dev/null
+++ b/wrappers/numpy/doc/Makefile
@@ -0,0 +1,192 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = build
+
+# User-friendly check for sphinx-build
+ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
+$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
+endif
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  applehelp  to make an Apple Help Book"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  texinfo    to make Texinfo files"
+	@echo "  info       to make Texinfo files and run them through makeinfo"
+	@echo "  gettext    to make PO message catalogs"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  xml        to make Docutils-native XML files"
+	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+	@echo "  coverage   to run coverage check of the documentation (if enabled)"
+
+clean:
+	rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/AdiosPython.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/AdiosPython.qhc"
+
+applehelp:
+	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
+	@echo
+	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
+	@echo "N.B. You won't be able to view it unless you put it in" \
+	      "~/Library/Documentation/Help or install it in your application" \
+	      "bundle."
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/AdiosPython"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/AdiosPython"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+latexpdfja:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through platex and dvipdfmx..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo
+	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+	@echo "Run \`make' in that directory to run these through makeinfo" \
+	      "(use \`make info' here to do that automatically)."
+
+info:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo "Running Texinfo files through makeinfo..."
+	make -C $(BUILDDIR)/texinfo info
+	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+	@echo
+	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
+
+coverage:
+	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
+	@echo "Testing of coverage in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/coverage/python.txt."
+
+xml:
+	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
+	@echo
+	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
+
+pseudoxml:
+	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
+	@echo
+	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/wrappers/numpy/doc/source/build.rst b/wrappers/numpy/doc/source/build.rst
new file mode 100644
index 0000000..2043346
--- /dev/null
+++ b/wrappers/numpy/doc/source/build.rst
@@ -0,0 +1,55 @@
+.. _build:
+
+Installation
+============
+
+Adios Python wrapper requires Adios built with the GNU C compiler with
+relocatable codes. Add -fPIC flag to CFLAGS before configuring Adios.
+
+Quick install with pip
+----------------------
+
+ADIOS Python wrapper can be installed with pip. Check if pip is
+installed already. Otherwise, install pip first
+::
+   $ wget https://bootstrap.pypa.io/get-pip.py
+   $ sudo python get-pip.py
+
+Or,
+::
+   $ python get-pip.py --user
+
+to install in a local directory, $HOME/.local
+
+Then, install Adios and Adios-MPI wrapper as follows:
+::
+   $ pip install adios
+   $ pip install adios_mpi
+
+If you want to install in a custom directory, use the following:
+::
+   $ pip install --install-option="--prefix=$PREFIX" adios
+   $ pip install --install-option="--prefix=$PREFIX" adios_mpi
+
+
+Trouble Shooting
+----------------
+
+Custom MPICC and MPICXX
+^^^^^^^^^^^^^^^^^^^^^^^
+
+If one needs to use a custom MPICC and MPICXX command (e.g., Titan),
+then use the following command:
+::
+   $ pip --global-option=build_ext \
+         --global-option=--mpicc=cc --global-option=--mpicxx=CC adios
+
+
+"Could not find any downloads that satisfy the requirement" with pip
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If the error is caused by a certificate error, then, try
+::
+   $ wget http://curl.haxx.se/ca/cacert.pem
+   $ pip --cert cacert.pem search adios
+   $ pip --cert cacert.pem install adios
diff --git a/wrappers/numpy/doc/source/conf.py b/wrappers/numpy/doc/source/conf.py
new file mode 100644
index 0000000..d2e70f2
--- /dev/null
+++ b/wrappers/numpy/doc/source/conf.py
@@ -0,0 +1,290 @@
+# -*- coding: utf-8 -*-
+#
+# Adios Python documentation build configuration file, created by
+# sphinx-quickstart on Fri May  8 10:13:24 2015.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+import shlex
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.doctest',
+    'sphinx.ext.napoleon',
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Adios Python'
+copyright = u'2015, Jong Choi (choij at ornl.gov)'
+author = u'Jong Choi (choij at ornl.gov)'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '1.8.0'
+# The full version, including alpha/beta/rc tags.
+release = '1.8.1b3'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+#keep_warnings = False
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'sphinx_rtd_theme'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#html_extra_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
+#html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# Now only 'ja' uses this config value
+#html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+#html_search_scorer = 'scorer.js'
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'AdiosPythondoc'
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+
+# Latex figure (float) alignment
+#'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+#  author, documentclass [howto, manual, or own class]).
+latex_documents = [
+  (master_doc, 'AdiosPython.tex', u'Adios Python Documentation',
+   u'Jong Choi (choij at ornl.gov)', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    (master_doc, 'adiospython', u'Adios Python Documentation',
+     [author], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+  (master_doc, 'AdiosPython', u'Adios Python Documentation',
+   author, 'AdiosPython', 'One line description of project.',
+   'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+#texinfo_no_detailmenu = False
+
+autodoc_member_order = 'groupwise'
diff --git a/wrappers/numpy/doc/source/index.rst b/wrappers/numpy/doc/source/index.rst
new file mode 100644
index 0000000..adfad2c
--- /dev/null
+++ b/wrappers/numpy/doc/source/index.rst
@@ -0,0 +1,28 @@
+.. Adios Python documentation master file, created by
+   sphinx-quickstart on Fri May  8 10:13:24 2015.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Adios Python
+============
+
+This Adios Python is a Python wrapper to Adios.
+
+
+Quick Start Guide
+-----------------
+
+.. toctree::
+   :maxdepth: 2
+
+   quick
+   build
+   ref
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/wrappers/numpy/doc/source/quick.rst b/wrappers/numpy/doc/source/quick.rst
new file mode 100644
index 0000000..554b39c
--- /dev/null
+++ b/wrappers/numpy/doc/source/quick.rst
@@ -0,0 +1,143 @@
+.. _quick:
+
+Quick Start Guide
+=================
+
+An Adios bp file is a container of variables and attributes, which can
+be either scalars or arrays. With the Adios Python wrapper, one can
+access them as NumPy's array.
+
+Reading data
+------------
+
+In this quick start guide, we assume we have an Adios bp file (name:
+adios_test.bp) contains the following three variables and one attribute:
+::
+   $ bpls -lva adios_test.bp
+   integer  NX                        scalar = 10
+   integer  size                      scalar = 2
+   double   temperature               {2, 10} = 0 / 19 / 9.5 / 5.76628
+   string   /temperature/description  attr   = "Global array written from 'size' processes"
+
+
+Let's start with importing Adios Python module as follows:
+
+>>> import adios as ad
+
+.. note:: A parallel version of Adios Python module is also available,
+          called adios_mpi. We will discuss details later.
+
+
+Then, open the Adios bp file (adios_test.bp) and briefly check its
+contents:
+
+>>> f = ad.file('adios_test.bp')
+>>> f
+AdiosFile (path='adios_test.bp', nvars=3, var=['NX', 'temperature', 'size'], nattrs=1, attr=['/temperature/description'], current_step=0, last_step=0, file_size=1549)
+
+Now let's read a scalar variable, 'NX'. We can access each variable by
+using Python's dictionary-style interface:
+
+>>> v = f['NX']
+>>> v
+AdiosVar (varid=0, type=dtype('int32'), ndim=0, dims=(), nsteps=1)
+>>> v.read()
+array(10, dtype=int32)
+
+Equivalently, we can use Numpy-style interface:
+
+>>> f['NX'][:]
+array(10, dtype=int32)
+
+
+Then, let's read a multi-dimensional array, 'temperature'.
+
+>>> f['temperature'][:]
+array([[  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.],
+       [ 10.,  11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.]])
+
+We can read by slices, for example:
+
+>>> f['temperature'][0:2,0:5]
+array([[  0.,   1.,   2.,   3.,   4.],
+       [ 10.,  11.,  12.,  13.,  14.]])
+
+We can use the most of the NumPy's slice syntax.
+
+Attribute reading is similar:
+
+>>> at = f.attr['/temperature/description']
+>>> at
+AdiosAttr (name='/temperature/description', type=dtype('S43'))
+>>> at.value
+array(["Global array written from 'size' processes"], 
+      dtype='|S43')
+
+Unless attribute's name is not conflict with any variable name in the
+file, which is totally fine with Adios, we can access through the
+dictionary-style:
+
+>>> f['/temperature/description'].value
+
+.. note:: While variables are read by "read" function or slice
+          interface, attributes are accessed through "value" property.
+
+Writing data
+------------
+
+Now, we will show how we can create the Adios BP file used in the
+previous section:
+::
+
+   $ bpls -lva adios_test.bp
+   integer  NX                        scalar = 10
+   integer  size                      scalar = 2
+   double   temperature               {2, 10} = 0 / 19 / 9.5 / 5.76628
+   string   /temperature/description  attr   = "Global array written from 'size' processes"
+
+
+First, we load necessary modules and prepare our Numpy data to save:
+
+>>> import adios as ad
+>>> import numpy as np
+
+>>> NX = 10
+>>> size = 2
+>>> t = np.array(range(NX*size), dtype=np.float64)
+>>> tt = t.reshape((size, NX))
+
+I.e., we have two scalar variables (NX and size) and one 2-D array (tt).
+
+Then, we initialize Adios and specify a buffer size (10MB) which Adios
+can work with:
+
+>>> ad.init_noxml()
+>>> ad.allocate_buffer (ad.BUFFER_ALLOC_WHEN.NOW, 10);
+
+Then, we give a file name to create and specify a group with Adios method:
+
+>>> fw = ad.writer(fname)
+>>> fw.declare_group('group', method='POSIX1')
+
+"POSIX1" is one of many Adios's write methods. Others are "MPI",
+"MPI_AGGREGATE", "FLEXPATH", "DATASPACES", etc. More detailed
+descriptions are in the Adios manual.
+
+Now, we assign our values:
+
+>>> fw['NX'] = NX
+>>> fw['size'] = size
+>>> fw['temperature'] = tt
+
+To write an attribute, we can do as follows:
+
+>>> fw.attr['/temperature/description'] = "Global array written from 'size' processes"
+
+Finally, we let Adios to write a file by calling "close"
+
+>>> fw.close()
+
+
+
+
+          
diff --git a/wrappers/numpy/doc/source/ref.rst b/wrappers/numpy/doc/source/ref.rst
new file mode 100644
index 0000000..ede0080
--- /dev/null
+++ b/wrappers/numpy/doc/source/ref.rst
@@ -0,0 +1,32 @@
+.. _ref:
+
+API Reference
+=============
+
+.. toctree::
+   :maxdepth: 2
+
+.. automodule:: adios
+   :members: readvar, bpls
+
+file class
+----------
+
+.. autoclass:: file
+    :members:
+    :exclude-members: __del__, __repr__
+
+var class
+---------
+
+.. autoclass:: var
+    :members:
+    :exclude-members: __del__, __repr__
+
+writer class
+------------
+
+.. autoclass:: writer
+    :members:
+    :exclude-members: __del__, __repr__
+
diff --git a/wrappers/numpy/example/staging/README b/wrappers/numpy/example/staging/README
index 7ce518b..2b63129 100644
--- a/wrappers/numpy/example/staging/README
+++ b/wrappers/numpy/example/staging/README
@@ -19,7 +19,7 @@ a. File-based communication
 
 First, let's run with files by
 
-$ python ./adios_write.py POSIX
+$ python ./adios_write.py POSIX1
 $ python ./adios_read.py BP
 
 b. ICEE
diff --git a/wrappers/numpy/example/staging/adios_read.py b/wrappers/numpy/example/staging/adios_read.py
index 32f6bfc..55ddbc0 100644
--- a/wrappers/numpy/example/staging/adios_read.py
+++ b/wrappers/numpy/example/staging/adios_read.py
@@ -29,7 +29,7 @@ while True:
     v = f.var['temperature']
     v.printself()
 
-    val = v.read()
+    val = v.read(nsteps=1)
     print val
 
     if (f.advance() < 0):
diff --git a/wrappers/numpy/example/staging/adios_write.py b/wrappers/numpy/example/staging/adios_write.py
index 1b35fbc..c474ab3 100644
--- a/wrappers/numpy/example/staging/adios_write.py
+++ b/wrappers/numpy/example/staging/adios_write.py
@@ -9,8 +9,9 @@ import adios as ad
 import numpy as np
 import getopt, sys
 import os
+import datetime
 
-method = "POSIX"
+method = "POSIX1"
 init = "verbose=3;"
 
 if len(sys.argv) > 1:
@@ -26,6 +27,8 @@ g = ad.declare_group("temperature", "", 1)
 ad.define_var(g, "NX", "", ad.DATATYPE.integer, "", "", "")
 ad.define_var(g, "size", "", ad.DATATYPE.integer, "", "", "")
 ad.define_var(g, "temperature", "", ad.DATATYPE.double, "size,NX", "size,NX", "0,0")
+msg = str(datetime.datetime.now())
+ad.define_attribute(g, "datetime", "", ad.DATATYPE.string, msg, "")
 ad.select_method(g, method, init, "")
 print ">>> Method:", method
 
diff --git a/wrappers/numpy/setup.cfg b/wrappers/numpy/setup.cfg
new file mode 100644
index 0000000..578ede1
--- /dev/null
+++ b/wrappers/numpy/setup.cfg
@@ -0,0 +1,2 @@
+[metadata]
+description-file = README
diff --git a/wrappers/numpy/setup.py b/wrappers/numpy/setup.py
index 79bf097..817dcd0 100644
--- a/wrappers/numpy/setup.py
+++ b/wrappers/numpy/setup.py
@@ -8,8 +8,11 @@ import numpy as np
 # Use mpi4py dist utils: https://bitbucket.org/mpi4py/mpi4py
 #from mpidistutils import setup
 from distutils.core import setup
+from distutils.spawn import find_executable
+from distutils.core import Command
 
 import subprocess
+import sys
 
 m1 = Extension('adios', 
                sources=['adios.cpp'], 
@@ -17,7 +20,16 @@ m1 = Extension('adios',
                include_dirs = [np.get_include()],
                library_dirs = [],
                libraries = [],
-               extra_objects = [])
+               extra_objects = [],
+               extra_compile_args = ['-Wno-uninitialized',
+                                     '-Wno-unused-function'])
+
+cmd = find_executable("adios_config")
+if cmd == None:
+    sys.stderr.write(
+        "adios_config is not installed nor found. "
+        "Please install Adios or check PATH.\n")
+    sys.exit(-1)
 
 p = subprocess.Popen(["adios_config", "-c", "-s"], stdout=subprocess.PIPE)
 for path in p.communicate()[0].strip().split(" "):
@@ -31,8 +43,34 @@ for path in p.communicate()[0].strip().split(" "):
     if path.startswith('-l'):
         m1.libraries.append(path.replace('-l', '', 1))
 
-setup(name = 'Adios',
-      version = '1.0',
+class adios_test(Command):
+    user_options = []
+    def initialize_options(self):
+        pass
+
+    def finalize_options(self):
+        pass
+
+    def run(self):
+        ##import subprocess
+        ##import sys
+        ##errno = subprocess.call([sys.executable, 'tests/test_adios.py', 'tests/config.xml'])
+        ##raise SystemExit(errno)
+        import os
+        import sys
+        import unittest
+        setup_file = sys.modules['__main__'].__file__
+        setup_dir = os.path.abspath(os.path.dirname(setup_file))
+        test_loader = unittest.defaultTestLoader
+        test_runner = unittest.TextTestRunner()
+        test_suite = test_loader.discover(os.path.join(setup_dir, 'test'))
+        test_runner.run(test_suite)
+
+setup(name = 'adios',
+      version = '1.8.1b3',
       description = 'Python Module for Adios',
+      author = 'Jong Choi',
+      author_email = 'yyalli at gmail.com',
       url = 'http://www.olcf.ornl.gov/center-projects/adios/',
+      cmdclass={'test': adios_test},
       ext_modules = [m1])
diff --git a/wrappers/numpy/setup_mpi.py b/wrappers/numpy/setup_mpi.py
index e47bd63..7cbbfd5 100644
--- a/wrappers/numpy/setup_mpi.py
+++ b/wrappers/numpy/setup_mpi.py
@@ -2,22 +2,99 @@
 # Author:  Jong Choi
 # Contact: choij at ornl.gov
 
+
+import os
+import sys
+import getopt
+
+## Credit: http://svn.apache.org/repos/asf/subversion/tags/0.20.1/subversion/bindings/swig/python/setup.py
+def _do_usage():
+  print "Usage: setup.py [OPTIONS] build"
+  print "       setup.py install [--prefix PREFIX]"
+  print "       setup.py install_lib [--install-dir DIR]"
+  print ""
+  print "Options:"
+  print "   -I dir      " + \
+        "search DIR for includes (multiple instances allowed)"
+  print "   -L dir      " + \
+        "search DIR for libraries (multiple instances allowed)"
+  print "   -C option   " + \
+        "pass OPTION to the compiler at compile time (multiple instances " + \
+        "allowed)"
+  print "   -R option   " + \
+        "pass OPTION to the compiler at link time (multiple instances " + \
+        "allowed)"
+  sys.exit(0)
+
+# Default option values
+include_dirs = []
+library_dirs = []
+extra_compile_args = []
+extra_link_args = []
+
+# No args?  Give usage.
+if len(sys.argv) < 2:
+  _do_usage()
+
+# Parse the command-line arguments, keeping what we want and letting
+# distutils have the rest.  Distutils parameters should come after
+# the target as in 'python setup.py build --prefix=/usr/local' and
+# parameters for us should appear before the target as in
+# 'python setup.py -I/usr/include build'.
+options, leftovers = getopt.getopt(sys.argv[1:], "I:L:C:R:h",
+                                   ["help"])
+for option in options:
+  if option[0] == '-I':
+    include_dirs.append(option[1])
+  if option[0] == '-L':
+    library_dirs.append(option[1])
+  if option[0] == '-C':
+    extra_compile_args.append(option[1])
+  if option[0] == '-R':
+    extra_link_args.append(option[1])
+  if option[0] == '-h':
+    _do_usage()
+
+  if option[0] == '--help':
+    _do_usage()
+
+  # All long options just get passed through
+  if option[0][:2] == '--':
+    leftovers.append(option[0])
+    leftovers.append(option[1])
+sys.argv[1:] = leftovers
+
 from distutils.extension import Extension
 import numpy as np
 
 # Use mpi4py dist utils: https://bitbucket.org/mpi4py/mpi4py
-from mpidistutils import setup
+from conf.mpidistutils import setup
 #from distutils.core import setup
+from distutils.spawn import find_executable
+from distutils.core import Command
 
 import subprocess
 
+include_dirs.insert(0, np.get_include())
+extra_compile_args.insert(0, '-Wno-uninitialized')
+extra_compile_args.insert(0, '-Wno-unused-function')
+
 m1 = Extension('adios_mpi', 
                sources=['adios_mpi.cpp'], 
                define_macros=[],
-               include_dirs = [np.get_include()],
-               library_dirs = [],
+               include_dirs = include_dirs,
+               library_dirs = library_dirs,
                libraries = [],
-               extra_objects = [])
+               extra_objects = [],
+               extra_compile_args = extra_compile_args,
+               extra_link_args = extra_link_args)
+
+cmd = find_executable("adios_config")
+if cmd == None:
+    sys.stderr.write(
+        "adios_config is not installed nor found. "
+        "Please install Adios or check PATH.\n")
+    sys.exit(-1)
 
 p = subprocess.Popen(["adios_config", "-c"], stdout=subprocess.PIPE)
 for path in p.communicate()[0].strip().split(" "):
@@ -31,8 +108,26 @@ for path in p.communicate()[0].strip().split(" "):
     if path.startswith('-l'):
         m1.libraries.append(path.replace('-l', '', 1))
 
-setup(name = 'Adios_MPI',
-      version = '1.0',
+class adios_test(Command):
+    user_options = []
+    def initialize_options(self):
+        pass
+
+    def finalize_options(self):
+        pass
+
+    def run(self):
+        import subprocess
+        import sys
+        errno = subprocess.call([sys.executable, 'tests/test_adios_mpi.py', 'tests/config_mpi.xml'])
+        raise SystemExit(errno)
+    
+setup(name = 'adios_mpi',
+      version = '1.8.1b3',
       description = 'Python Module for Adios MPI',
+      author = 'Jong Choi',
+      author_email = 'yyalli at gmail.com',
       url = 'http://www.olcf.ornl.gov/center-projects/adios/',
+      cmdclass={'test': adios_test},
+      executables = [],
       ext_modules = [m1])
diff --git a/wrappers/numpy/test/common.py b/wrappers/numpy/test/common.py
new file mode 100644
index 0000000..5c7b3c5
--- /dev/null
+++ b/wrappers/numpy/test/common.py
@@ -0,0 +1,20 @@
+import unittest as ut
+from tempfile import mkstemp
+import os
+
+class Slicee(object):
+    def __getitem__(self, index):
+        return index
+
+class TempFile(object):
+    def __init__(self):
+        self.fh, self.path = mkstemp(suffix='.bp', prefix='adios-test_')
+
+    def __del__(self):
+        try:
+            if self.fh:
+                os.close(self.fh)
+                os.remove(self.path)
+        except:
+            pass
+
diff --git a/wrappers/numpy/test/test_adios_timestep_unittest.py b/wrappers/numpy/test/test_adios_timestep_unittest.py
new file mode 100644
index 0000000..e9ead2a
--- /dev/null
+++ b/wrappers/numpy/test/test_adios_timestep_unittest.py
@@ -0,0 +1,110 @@
+import unittest as ut
+import adios as ad
+import numpy as np
+from common import TempFile
+from common import Slicee
+
+
+class AdiosTestCase(ut.TestCase):
+    f    = None ## Adios File class
+    temp = None ## TempFile
+
+    def setUp(self):
+        self.temp = TempFile()
+        
+        ad.init_noxml()
+        
+        ad.allocate_buffer (ad.BUFFER_ALLOC_WHEN.NOW, 10);
+        g = ad.declare_group("temperature", "", ad.FLAG.YES)
+        ad.define_var(g, "NX", "", ad.DATATYPE.integer, "", "", "")
+        ad.define_var(g, "size", "", ad.DATATYPE.integer, "", "", "")
+        ad.define_var(g, "temperature", "", ad.DATATYPE.double, "size,NX", "size,NX", "0,0")
+        self.msg = "this is a test"
+        ad.define_attribute(g, "desc", "", ad.DATATYPE.string, self.msg, "")
+        ad.select_method(g, "POSIX1", "verbose=3", "")
+
+        for i in range(5):
+            mode = "a"
+            if i == 0: mode = "w"
+            fd = ad.open("temperature", self.temp.path, mode)
+            self.NX = 10
+            self.size = 2
+            groupsize =  4 + 4 + 8 * self.size * self.NX
+            t = np.array(range(self.NX * self.size), dtype=np.float64) + 100*i
+            self.tt = t.reshape((self.size, self.NX))
+            ad.set_group_size(fd, groupsize)
+            ad.write_int(fd, "NX", self.NX)
+            ad.write_int(fd, "size", self.size)
+            ad.write(fd, "temperature", self.tt)
+            ad.close(fd)
+
+        ad.finalize()
+
+        self.f = ad.file(self.temp.path)
+        
+    def tearDown(self):
+        try:
+            if self.f:
+                self.f.close()
+        except:
+            pass
+        
+    def test_adios_file(self):
+        self.assertEqual(self.f.current_step, 0)
+        self.assertEqual(self.f.last_step, 4)
+
+    def test_adios_var_scalar(self):
+        v = self.f['NX']
+        self.assertEqual(v.ndim, 0)
+        self.assertEqual(v.dims, ())
+        self.assertEqual(v.nsteps, 5)
+
+        val = v.read()
+        self.assertEqual(val.dtype, np.dtype('int32'))
+        self.assertEqual(val.ndim, 1)
+        self.assertEqual(val.shape, (5,))
+
+        self.assertTrue((val == v[:]).all())
+
+    def test_adios_var_array(self):
+        v = self.f['temperature']
+        self.assertEqual(v.ndim, 2)
+        self.assertEqual(v.dims, (2L, 10L))
+        self.assertEqual(v.nsteps, 5)
+
+        val = v.read()
+        self.assertEqual(val.dtype, np.dtype('float64'))
+
+        self.assertEqual(val.ndim, v.ndim + 1)
+        self.assertEqual(val.shape, (5, self.size, self.NX))
+        
+        self.assertTrue((val == v[:]).all())
+        self.assertTrue((val == v[:,:]).all())
+        self.assertTrue((val == v[:,:,:]).all())
+        self.assertRaises(IndexError, v.__getitem__, Slicee()[::2])
+        self.assertRaises(IndexError, v.__getitem__, Slicee()[:,:,:,:])
+
+        self.assertTrue((v.read(offset=(0,5), count=(2,5)) == v[:,:,5:]).all())
+        self.assertTrue((v.read(offset=(0,5), count=(2,5)) == v[:,:,-5:]).all())
+
+    def test_adios_var_getitem(self):        
+        v = self.f['temperature']
+
+        self.assertTrue((v[0,] == v.read(from_steps=0, nsteps=1)).all())
+        self.assertTrue((v[1,] == v.read(from_steps=1, nsteps=1)).all())
+
+        self.assertTrue((v[:2,] == v.read(from_steps=0, nsteps=2)).all())
+        self.assertTrue((v[0:2,] == v.read(from_steps=0, nsteps=2)).all())
+
+        self.assertTrue((v[:2,:1,:5] == v.read(offset=(0,0), count=(1,5), from_steps=0, nsteps=2)).all())
+
+        self.assertTrue((v[-1,...] == v.read(from_steps=4, nsteps=1)).all())
+        self.assertTrue((v[-2,...] == v.read(from_steps=3, nsteps=1)).all())
+
+        self.assertTrue((v[:,...,-1] == v.read(offset=(0,9), count=(2,1))).all())
+        self.assertTrue((v[:,...,-3:-1] == v.read(offset=(0,7), count=(2,2))).all())
+
+        self.assertRaises(IndexError, v.__getitem__, Slicee()[:,:,-1:-2])
+
+if __name__ == '__main__':
+    ut.main()
diff --git a/wrappers/numpy/test/test_adios_unittest.py b/wrappers/numpy/test/test_adios_unittest.py
new file mode 100644
index 0000000..287f782
--- /dev/null
+++ b/wrappers/numpy/test/test_adios_unittest.py
@@ -0,0 +1,110 @@
+import unittest as ut
+import adios as ad
+import numpy as np
+from common import TempFile
+from common import Slicee
+
+class AdiosTestCase(ut.TestCase):
+    f    = None ## Adios File class
+    temp = None ## TempFile
+
+    def setUp(self):
+        self.temp = TempFile()
+        
+        ad.init_noxml()
+        
+        ad.allocate_buffer (ad.BUFFER_ALLOC_WHEN.NOW, 10);
+        g = ad.declare_group("temperature", "", ad.FLAG.YES)
+        ad.define_var(g, "NX", "", ad.DATATYPE.integer, "", "", "")
+        ad.define_var(g, "size", "", ad.DATATYPE.integer, "", "", "")
+        ad.define_var(g, "temperature", "", ad.DATATYPE.double, "size,NX", "size,NX", "0,0")
+        self.msg = "this is a test"
+        ad.define_attribute(g, "desc", "", ad.DATATYPE.string, self.msg, "")
+        ad.select_method(g, "POSIX1", "verbose=3", "")
+
+        fd = ad.open("temperature", self.temp.path, "w")
+        self.NX = 10
+        self.size = 2
+        groupsize =  4 + 4 + 8 * self.size * self.NX
+        t = np.array(range(self.NX * self.size), dtype=np.float64)
+        self.tt = t.reshape((self.size, self.NX))
+        ad.set_group_size(fd, groupsize)
+        ad.write_int(fd, "NX", self.NX)
+        ad.write_int(fd, "size", self.size)
+        ad.write(fd, "temperature", self.tt)
+        ad.close(fd)
+
+        ad.finalize()
+
+        self.f = ad.file(self.temp.path)
+        
+    def tearDown(self):
+        try:
+            if self.f:
+                self.f.close()
+        except:
+            pass
+        
+    def test_adios_file(self):
+        self.assertEqual(self.f.nattrs, 1)
+        self.assertEqual(self.f.nvars, 3)
+        self.assertEqual(self.f.current_step, 0)
+        self.assertEqual(self.f.last_step, 0)
+        self.assertEqual(sorted(self.f.var.keys()),
+                         sorted(['NX', 'size', 'temperature']))
+        self.assertEqual(self.f.attr.keys(), ['desc'])
+
+    def test_adios_attr(self):
+        self.assertEqual(self.f.attr['desc'].value, self.msg)
+        self.assertEqual(self.f.attr['desc'].dtype, np.dtype('S14'))
+
+    def test_adios_file_getitem(self):
+        self.assertRaises(TypeError, self.f.__getitem__, Slicee()[1])
+        self.assertRaises(KeyError, self.f.__getitem__, Slicee()[:,:])
+        self.assertRaises(KeyError, self.f.__getitem__, Slicee()['NONE'])
+        
+    def test_adios_var_scalar(self):
+        v = self.f['NX']
+        self.assertEqual(v.ndim, 0)
+        self.assertEqual(v.dims, ())
+        self.assertEqual(v.nsteps, 1)
+
+        val = v.read()
+        self.assertEqual(val.dtype, np.dtype('int32'))
+        self.assertEqual(val.ndim, 0)
+        self.assertEqual(val.shape, ())
+        self.assertEqual(val, v[:])
+
+    def test_adios_var_array(self):
+        v = self.f['temperature']
+        self.assertEqual(v.ndim, 2)
+        self.assertEqual(v.dims, (2L, 10L))
+        self.assertEqual(v.nsteps, 1)
+
+        val = v.read()
+        self.assertEqual(val.dtype, np.dtype('float64'))
+        self.assertEqual(val.ndim, 2)
+        self.assertEqual(val.shape, (2, 10))
+        self.assertTrue((val == v[:]).all())
+        self.assertTrue((val == v[:,:]).all())
+        self.assertTrue((v.read(offset=(0,5), count=(2,5)) == v[:,5:]).all())
+        self.assertTrue((v.read(offset=(0,5), count=(2,5)) == v[:,-5:]).all())
+
+    def test_adios_var_getitem(self):        
+        v = self.f['temperature']
+        val = v.read()
+        self.assertTrue((val == v[...,...]).all())
+        self.assertTrue((val == v[:,...]).all())
+        self.assertTrue((val == v[:,::1]).all())
+
+        ## equivalent to v[::2]
+        self.assertRaises(IndexError, v.__getitem__, Slicee()[::2])
+        self.assertRaises(IndexError, v.__getitem__, Slicee()[:,:,:])
+
+    def test_adios_var_array_squeeze(self):
+        v = self.f['temperature']
+        val = v[:,1]
+        self.assertEqual(val.shape, (2,))
+
+if __name__ == '__main__':
+    ut.main()
diff --git a/wrappers/numpy/test/test_adios_write_unittest.py b/wrappers/numpy/test/test_adios_write_unittest.py
new file mode 100644
index 0000000..7557fd4
--- /dev/null
+++ b/wrappers/numpy/test/test_adios_write_unittest.py
@@ -0,0 +1,54 @@
+import unittest as ut
+import adios as ad
+import numpy as np
+from common import TempFile
+from common import Slicee
+
+class AdiosTestCase(ut.TestCase):
+
+    def setUp(self):
+        self.temp = TempFile()
+
+    def tearDown(self):
+        try:
+            if self.temp:
+                del self.temp
+        except:
+            pass
+
+    def write_scalar(self, adtype, val, varname='val'):
+        ad.init_noxml()
+        ad.allocate_buffer (ad.BUFFER_ALLOC_WHEN.NOW, 10);
+        g = ad.declare_group("group", "", ad.FLAG.YES)
+        ad.define_var(g, varname, "", adtype, "", "", "")
+        ad.select_method(g, "POSIX1", "", "")
+
+        if adtype == ad.DATATYPE.string:
+            dtype = ad.adios2npdtype(adtype, len(str(val)))
+            npval = np.array(val, dtype=dtype)
+        else:
+            dtype = ad.adios2npdtype(adtype)
+            npval = np.array(val, dtype=dtype)
+
+        fd = ad.open("group", self.temp.path, "w")
+        ad.set_group_size(fd, npval.nbytes)
+        ad.write(fd, varname, val, dtype)
+        ad.close(fd)
+        ad.finalize()
+
+        f = ad.file(self.temp.path)
+        v = f.var['val']
+        self.assertEqual(v.read(), npval)
+
+    def test_write_scalar_int(self):
+        self.write_scalar(ad.DATATYPE.integer, 123)
+        
+    def test_write_scalar_double(self):
+        self.write_scalar(ad.DATATYPE.double, 123)
+
+    def test_write_scalar_string(self):
+        self.write_scalar(ad.DATATYPE.string, 123)
+
+if __name__ == '__main__':
+    ut.main()
+        
diff --git a/wrappers/numpy/test/test_adios_writer_unittest.py b/wrappers/numpy/test/test_adios_writer_unittest.py
new file mode 100644
index 0000000..e79e7b0
--- /dev/null
+++ b/wrappers/numpy/test/test_adios_writer_unittest.py
@@ -0,0 +1,124 @@
+import unittest as ut
+import adios as ad
+import numpy as np
+from common import TempFile
+from common import Slicee
+
+class AdiosTestCase(ut.TestCase):
+    f    = None ## Adios File class
+    temp = None ## TempFile
+
+    def setUp(self):
+        ad.init_noxml()
+        ad.allocate_buffer (ad.BUFFER_ALLOC_WHEN.NOW, 10)
+
+    def tearDown(self):
+        ad.finalize()
+
+    def test_writer_var(self):
+        self.temp = TempFile()
+        
+        NX = 10
+        val1 = np.array(range(NX), dtype=np.int32)
+        val2 = np.array(range(5), dtype='f8')
+
+        fw = ad.writer(self.temp.path)
+        fw.declare_group("group", method="POSIX1")
+        
+        fw.define_var("NX")
+        fw.define_var("val1", "NX")
+        fw.define_var("val2", val2.shape)
+
+        fw['NX'] = NX
+        fw['val1'] = val1
+        fw['val2'] = val2
+        fw.close()
+
+        f = ad.file(self.temp.path)
+        self.assertEqual(f['NX'][:], NX)
+        self.assertTrue((f['val1'][:] == val1).all())
+        self.assertTrue((f['val2'][:] == val2).all())
+
+    def test_writer_attr(self):
+        self.temp = TempFile()
+        
+        NX = 10
+        val1 = np.array(range(NX), dtype=np.int32)
+        val2 = np.array(range(5), dtype='f8')
+
+        single_string = "ABCD"
+        three_string = ("AA","BBB","CCCC")
+        single_int = 10
+        five_int = np.array(range(5), dtype=np.int32)
+        single_double = 1.1
+        five_double = np.array(range(5), dtype='double')*1.1
+        
+        fw = ad.writer(self.temp.path)
+        fw.declare_group("group", method="POSIX1")
+        
+        fw.define_attr("single_string")
+        fw.define_attr("three_string")
+        fw.define_attr("single_int")
+        fw.define_attr("five_int")
+        fw.define_attr("single_double")
+        fw.define_attr("five_double")
+
+        fw['single_string'] = single_string
+        fw['three_string'] = three_string
+        fw['single_int'] = single_int
+        fw['five_int'] = five_int
+        fw['single_double'] = single_double
+        fw['five_double'] = five_double
+        fw.close()
+        
+        f = ad.file(self.temp.path)
+        self.assertEqual(f['single_string'].value, single_string)
+        self.assertTrue((f['three_string'].value == three_string).all())
+        self.assertEqual(f['single_int'].value, single_int)
+        self.assertTrue((f['five_int'].value == five_int).all())
+        self.assertEqual(f['single_double'].value, single_double)
+        self.assertTrue((f['five_double'].value == five_double).all())
+
+    def test_writer_undefined_var(self):
+        self.temp = TempFile()
+        
+        NX = 10
+        val1 = np.array(range(NX), dtype=np.int32)
+        val2 = np.array(range(5), dtype='f8')
+
+        fw = ad.writer(self.temp.path)
+        fw.declare_group("group", method="POSIX1")
+        
+        fw['NX'] = NX
+        fw['val1'] = val1
+        fw['val2'] = val2
+        fw.close()
+
+        f = ad.file(self.temp.path)
+        self.assertEqual(f['NX'][:], NX)
+        self.assertTrue((f['val1'][:] == val1).all())
+        self.assertTrue((f['val2'][:] == val2).all())
+
+    def test_writer_undefined_var2(self):
+        self.temp = TempFile()
+        
+        NX = 10
+        val1 = np.array(range(NX), dtype=np.int32)
+        val2 = np.array(range(5), dtype='f8')
+
+        fw = ad.writer(self.temp.path)
+        fw.declare_group("group", method="POSIX1")
+        
+        fw.var['NX'] = NX
+        fw.var['val1'] = val1
+        fw.var['val2'] = val2
+        fw.close()
+
+        f = ad.file(self.temp.path)
+        self.assertEqual(f['NX'][:], NX)
+        self.assertTrue((f['val1'][:] == val1).all())
+        self.assertTrue((f['val2'][:] == val2).all())
+        
+if __name__ == '__main__':
+    ut.main()
+        
diff --git a/wrappers/numpy/tests/test_adios.py b/wrappers/numpy/tests/test_adios.py
index 22aa589..d383c6d 100644
--- a/wrappers/numpy/tests/test_adios.py
+++ b/wrappers/numpy/tests/test_adios.py
@@ -7,11 +7,16 @@ $ python ./test_adios.py
 
 import adios as ad
 import numpy as np
+import sys
 
 ## Writing
 print "\n>>> Writing ...\n"
 
-ad.init("config.xml")
+config = "config.xml"
+if len(sys.argv) > 1:
+    config = sys.argv[1]
+
+ad.init(config)
 fd = ad.open("temperature", "adios_test.bp", "w")
 
 NX = 10
diff --git a/wrappers/numpy/tests/test_adios.py b/wrappers/numpy/tests/test_adios_matplot.py
similarity index 92%
copy from wrappers/numpy/tests/test_adios.py
copy to wrappers/numpy/tests/test_adios_matplot.py
index 22aa589..094761d 100644
--- a/wrappers/numpy/tests/test_adios.py
+++ b/wrappers/numpy/tests/test_adios_matplot.py
@@ -7,6 +7,7 @@ $ python ./test_adios.py
 
 import adios as ad
 import numpy as np
+import matplotlib.pyplot as plt
 
 ## Writing
 print "\n>>> Writing ...\n"
@@ -47,5 +48,9 @@ print "\n>>> Test utility functions ...\n"
 print "bpls:\n", ad.bpls('adios_test.bp')
 print "readvar:\n", ad.readvar("adios_test.bp", "temperature")
 
+plt.imshow(val)
+plt.colorbar()
+plt.show()
+
 print "\n>>> Done.\n"
 
diff --git a/wrappers/numpy/tests/test_adios_mpi.py b/wrappers/numpy/tests/test_adios_mpi.py
index 767c497..9d1e3e3 100644
--- a/wrappers/numpy/tests/test_adios_mpi.py
+++ b/wrappers/numpy/tests/test_adios_mpi.py
@@ -8,6 +8,7 @@ $ mpiexec -n 4 python ./test_adios_mpi.py
 import adios_mpi as ad
 import numpy as np
 from mpi4py import MPI
+import sys
 
 ## Init
 comm = MPI.COMM_WORLD
@@ -17,7 +18,11 @@ size = comm.Get_size()
 ## Writing
 print "\n>>> Writing ... (rank = %d)\n" % rank
 
-ad.init("config_mpi.xml", comm)
+config = "config_mpi.xml"
+if len(sys.argv) > 1:
+    config = sys.argv[1]
+
+ad.init(config, comm)
 fd = ad.open("temperature", "adios_test_mpi.bp", "w", comm)
 
 NX = 10
@@ -44,7 +49,7 @@ if rank == 0:
 
     val = v.read()
     print val
-    assert (int(sum(sum(val))) == (size*NX-1)*(size*NX)/2)
+    assert (int(np.sum(val)) == (size*NX-1)*(size*NX)/2)
     f.close()
 
 print "\n>>> Done.\n"
diff --git a/wrappers/numpy/tests/test_adios_mpi_writer.py b/wrappers/numpy/tests/test_adios_mpi_writer.py
new file mode 100644
index 0000000..66d9147
--- /dev/null
+++ b/wrappers/numpy/tests/test_adios_mpi_writer.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+"""
+Example:
+
+$ mpiexec -n 4 python ./test_adios_mpi_writer.py
+"""
+
+import adios_mpi as ad
+import numpy as np
+from mpi4py import MPI
+
+## Init
+comm = MPI.COMM_WORLD
+rank = comm.Get_rank()
+size = comm.Get_size()
+
+## Prepare
+print "\n>>> Prepare ... (rank = %d)\n" % rank
+fname = 'adios_test_mpi_writer.bp'
+NX = 10
+t = np.array(range(NX*size), dtype=np.float64) + rank*NX
+gdim = (size, NX)
+offset = (rank, 0)
+
+print "\n>>> Writing ... (rank = %d)\n" % rank
+ad.init_noxml()
+ad.allocate_buffer (ad.BUFFER_ALLOC_WHEN.NOW, 10);
+
+fw = ad.writer(fname, comm=comm)
+fw.declare_group('group', method='MPI')
+fw.define_var('temperature', ldim=(1,NX), gdim=gdim, offset=offset)
+
+fw['NX'] = NX
+fw['size'] = size
+fw['temperature'] = t
+fw.attr['/temperature/description'] = "Global array written from 'size' processes"
+fw.close()
+
+## Reading
+if rank == 0:
+    print "\n>>> Reading ...\n"
+
+    f = ad.file(fname, comm=MPI.COMM_SELF)
+    for key, val in f.var.iteritems():
+        print key, '=', val.read()
+
+    for key, val in f.attr.iteritems():
+        print key, '=', val.value
+
+    print "\n>>> Done.\n"
+
diff --git a/wrappers/numpy/tests/test_adios_timestep.py b/wrappers/numpy/tests/test_adios_timestep.py
index 5e2fe47..7cf4328 100644
--- a/wrappers/numpy/tests/test_adios_timestep.py
+++ b/wrappers/numpy/tests/test_adios_timestep.py
@@ -42,7 +42,7 @@ v = f.var['temperature']
 v.printself()
 
 for i in range(10):
-    val = v.read(from_steps=i)
+    val = v.read(from_steps=i, nsteps=1)
     print "step =", i
     print val
     
diff --git a/wrappers/numpy/tests/test_adios_writer.py b/wrappers/numpy/tests/test_adios_writer.py
new file mode 100644
index 0000000..1b0843e
--- /dev/null
+++ b/wrappers/numpy/tests/test_adios_writer.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+"""
+Example:
+
+$ python ./test_adios_write.py
+"""
+
+import adios as ad
+import numpy as np
+
+print "\n>>> Prepare ...\n"
+fname = 'adios_test_writer.bp'
+NX = 10
+size = 2
+t = np.array(range(NX*size), dtype=np.float64)
+tt = t.reshape((size, NX))
+
+print "\n>>> Writing ...\n"
+ad.init_noxml()
+ad.allocate_buffer (ad.BUFFER_ALLOC_WHEN.NOW, 10);
+
+fw = ad.writer(fname)
+fw.declare_group('group', method='POSIX1')
+
+fw['NX'] = NX
+fw['size'] = size
+fw['temperature'] = tt
+fw.attr['/temperature/description'] = "Global array written from 'size' processes"
+fw.close()
+
+## Reading
+print "\n>>> Reading ...\n"
+
+f = ad.file(fname)
+for key, val in f.var.iteritems():
+    print key, '=', val.read()
+
+for key, val in f.attr.iteritems():
+    print key, '=', val.value
+
+## Testing
+print "\n>>> Done.\n"
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/adios.git



More information about the debian-science-commits mailing list